Онбординг
Этот документ описывает жизненный цикл ончейн-аккаунта, потоки фондирования и управление API-кошельками для маркетмейкеров.
Обзор
Hypercall использует модель менеджер/агент:
- Менеджер: EOA, владеющий аккаунтом (как правило, ваш основной кошелёк)
- Аккаунт: минимальный прокси-контракт (клон), который хранит средства и выполняет ончейн-операции
- API-кошелёк: EOA, авторизованный менеджером для подписи торговых запросов (агент)
Все ончейн-взаимодействия происходят через контракт Exchange.
Адреса контрактов
Тестнет
- Exchange: ``
Основная сеть
- Данные передаются в частном порядке.
Жизненный цикл аккаунта
1. Проверка существующих аккаунтов
Перед созданием нового аккаунта проверьте, есть ли у вас уже аккаунты:
function getAccounts(address manager) external view returns (ManagedAccount[] memory);
Пример (ethers.js):
const exchange = new ethers.Contract(EXCHANGE_ADDRESS, EXCHANGE_ABI, provider);
const accounts = await exchange.getAccounts(managerAddress);
// Returns: [{ account: "0x...", manager: "0x...", apiWallets: ["0x..."] }]
2. Создание аккаунта
Создаёт новый аккаунт с msg.sender в качестве менеджера:
function createAccount() external payable returns (address account);
Требования:
accountImplдолжен быть задан через governancemsg.value >= getCreationDeposit()(минимальный депозит в HYPE)- Если
creationDepositUsd == 0, минимальный депозит не требуется - В противном случае
getCreationDeposit()конвертирует сумму в USD в HYPE по текущей спотовой цене
- Если
Поведение:
- Разворачивает детерминированный минимальный прокси (клон)
accountImpl - Устанавливает
msg.senderменеджером аккаунта - Если
msg.value > 0, выполняет депозит HYPE от имени аккаунта- Переводит HYPE на
HYPE_SYSTEM_ADDRESS(мост HyperCore) - Если депозит >= HYPE на сумму $1, аккаунт активируется на HyperCore (комиссия за активацию удерживается)
- Переводит HYPE на
Пример (ethers.js):
// Get minimum deposit (in HYPE wei)
const minDeposit = await exchange.getCreationDeposit();
// Or set to ~$1-2 worth of HYPE for activation
const depositAmount = ethers.parseEther("0.001"); // Adjust based on HYPE price
const tx = await exchange.createAccount({ value: depositAmount });
const receipt = await tx.wait();
// Account address is deterministic - can predict before creation
Предсказание адреса аккаунта:
function predictNextAccount(address manager) external view returns (address);
Используйте этот метод, чтобы узнать адрес аккаунта до его создания (полезно для UI/UX).
3. Передача аккаунта
Менеджеры могут передавать право владения аккаунтом (напрямую не вызывается; происходит при создании или через governance):
event AccountTransferred(address indexed account, address indexed oldManager, address indexed newManager);
Функциональность передачи аккаунта предоставляется по запросу.
Управление API-кошельками
API-кошельки — это EOA, авторизованные менеджером для подписи торговых запросов. Они подписывают сообщения EIP-712, которые верифицируются ончейн.
Добавление API-кошелька
function addApiWallet(address account, address apiWallet) external;
Требования:
msg.sender == managers[account](должен быть менеджером аккаунта)apiWalletне должен быть активен для другого аккаунта/менеджераaccount != address(0)иapiWallet != address(0)
Поведение:
- Создаёт маппинги
apiWallet -> accountиapiWallet -> manager - Добавляет
apiWalletв набор API-кошельков аккаунта - Эмитирует
ApiWalletAdded(account, manager, apiWallet)
Пример:
const tx = await exchange.addApiWallet(accountAddress, apiWalletAddress);
await tx.wait();
Удаление API-кошелька
function removeApiWallet(address account, address apiWallet) external;
Требования:
msg.sender == managers[account]apiWalletдолжен быть активен для данного аккаунта/менеджера
Поведение:
- Удаляет маппинги для
apiWallet - Удаляет
apiWalletиз набора API-кошельков аккаунта - Эмитирует
ApiWalletRemoved(account, manager, apiWallet)
Запрос API-кошельков
function getAccountByApiWallet(address apiWallet) external view returns (ManagedAccount memory);
Возвращает аккаунт, менеджера и все API-кошельки аккаунта, если apiWallet активен. Возвращает нулевую структуру, если неактивен.
Пример:
const managedAccount = await exchange.getAccountByApiWallet(apiWalletAddress);
if (managedAccount.account !== ethers.ZeroAddress) {
console.log("Account:", managedAccount.account);
console.log("Manager:", managedAccount.manager);
console.log("API Wallets:", managedAccount.apiWallets);
}
Фондирование и депозиты
Депозит USDC в Hypercall
function depositUsdcFor(address account, uint256 amount) external;
depositUsdcFor — это прямой путь фондирования кэш-балансов Hypercall через HyperEVM. Метод переводит нативный HyperEVM USDC от msg.sender в Exchange, после чего Exchange вносит этот USDC на свой баланс HyperCore через CoreDepositWallet от Circle.
Кто может вызывать:
- Любой кошелёк, роутер, солвер или zap-контракт может вызвать этот метод.
- USDC оплачивает
msg.sender. account— аккаунт или кошелёк Hypercall, на который зачисляются средства. Не определяйте зачисляемый аккаунт поmsg.sender.
Требования:
account != address(0)amount > 0msg.senderдолжен выдатьExchangeразрешение (approve) наamountнативного HyperEVM USDC- Развёрнутая реализация
Exchangeдолжна быть сконструирована с адресами нативного токена HyperEVM USDC иCoreDepositWalletдля целевой сети
События и зачисление:
event UsdcDeposit(
address indexed account,
address indexed from,
address indexed token,
uint256 amount,
uint32 dstDex
);
Событие эмитируется контрактом Exchange после вызова CoreDepositWallet.depositFor. Бэкенд должен сопоставить это событие с наблюдаемым депозитом HyperCore на баланс Exchange, прежде чем зачислить кэш в Hypercall. Аккаунт Hypercall для зачисления — это явно указанное поле события account.
Пример:
const usdc = new ethers.Contract(USDC_ADDRESS, ERC20_ABI, signer);
const exchange = new ethers.Contract(EXCHANGE_ADDRESS, EXCHANGE_ABI, signer);
await usdc.approve(EXCHANGE_ADDRESS, amount);
await exchange.depositUsdcFor(accountAddress, amount);
Функция депозита опционных токенов
function depositOption(address account, address token, uint256 amount) external;
Поддерживаемые типы токенов:
- Опционные ERC20-токены (зарегистрированные в
OptionRegistry):msg.value == 0(обязательно)- Сжигает опционный токен через
IOptionToken(token).burnFrom(msg.sender, amount) - Эмитирует
Deposit(account, msg.sender, token, amount) - Индексер RSM обрабатывает событие и зачисляет опционную позицию на аккаунт
Требования:
accountдолжен быть зарегистрированным аккаунтом HypercalloptionRegistry != address(0)(должен быть задан)msg.senderдолжен выдатьExchangeразрешение (approve) наamount
Пример (депозит опционного токена):
const option = new ethers.Contract(OPTION_TOKEN_ADDRESS, ERC20_ABI, signer);
const exchange = new ethers.Contract(EXCHANGE_ADDRESS, EXCHANGE_ABI, signer);
await option.approve(EXCHANGE_ADDRESS, amount);
await exchange.depositOption(accountAddress, OPTION_TOKEN_ADDRESS, amount);
Перевод с аккаунта
Менеджеры могут переводить токены со своего аккаунта любому получателю в HyperEVM:
function transferFromAccount(address account, address token, address recipient, uint256 amount) external;
Требования:
msg.sender == managers[account]recipient != address(0)
Сценарии использования:
- Завершение переводов HyperCore -> HyperEVM, инициированных аккаунтом
- Спасение средств с аккаунта
- Вывод на другой адрес
Пример:
await exchange.transferFromAccount(
accountAddress,
tokenAddress,
recipientAddress,
amount
);
Интеграция с офчейн-API
После создания аккаунта и добавления API-кошелька:
- Аутентификация в офчейн-API: используйте приватный ключ API-кошелька для подписи сообщений EIP-712 (см. Аутентификация)
- Ончейн-верификация: секвенсер RSM вызывает
Exchange.hlRequestOrder(или аналогичный метод) с вашим подписанным запросом - Исполнение: Exchange верифицирует подпись, восстанавливает API-кошелёк, сопоставляет его с вашим аккаунтом и выполняет ончейн-операции
См. также:
- Аутентификация — аутентификация в офчейн-API
События
event AccountTransferred(address indexed account, address indexed oldManager, address indexed newManager);
event ApiWalletAdded(address indexed account, address indexed manager, address indexed apiWallet);
event ApiWalletRemoved(address indexed account, address indexed manager, address indexed apiWallet);
event Deposit(address indexed account, address indexed from, address indexed token, uint256 amount);
event Withdraw(address indexed account, address indexed to, address indexed token, uint256 amount);
Ошибки
Все ошибки определены в IExchangeBase.sol:
Exchange__AccountManagerNotSet(address account): аккаунт не существуетExchange__ApiWalletAlreadyActive(address apiWallet): API-кошелёк уже используетсяExchange__ApiWalletNotActive(address apiWallet): API-кошелёк не найденExchange__CreationDepositNotMet(uint256 expected): недостаточныйmsg.valueExchange__TokenNotSupported(address token): токен не поддерживается для депозитаExchange__MsgValueIncorrect(uint256 expected): несоответствиеmsg.valueExchange__NotManager(address account, address notManager): вызывающий не является менеджером
Вопросы безопасности
-
Безопасность ключа менеджера: ключ менеджера контролирует владение аккаунтом и управление API-кошельками. Храните его надёжно (рекомендуется аппаратный кошелёк).
-
Безопасность ключей API-кошельков: ключи API-кошельков подписывают торговые запросы. Используйте отдельные ключи для каждого аккаунта/окружения. Регулярно выполняйте ротацию.
-
Управление nonce: у каждого подписанта (API-кошелёк, менеджер, RSM) отдельное пространство nonce. Отслеживайте nonce офчейн, чтобы избежать replay-атак.
-
Активация аккаунта: аккаунты должны быть активированы на HyperCore (депозит >= $1 в HYPE), прежде чем они смогут торговать перпами. Проверяйте статус активации через API HyperCore.
-
Детерминированные адреса: адреса аккаунтов детерминированы и зависят от адреса менеджера и количества созданных аккаунтов. Используйте
predictNextAccount, чтобы узнать адрес до создания.