Онбординг
Цей документ описує життєвий цикл ончейн-акаунта, потоки фінансування та керування API-гаманцями для маркетмейкерів.
Огляд
Hypercall використовує модель менеджер/агент:
- Менеджер: EOA, який володіє акаунтом (зазвичай ваш основний гаманець)
- Акаунт: Мінімальний проксі-контракт (clone), який зберігає кошти та виконує ончейн-дії
- 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 за поточною спотовою ціною
- Якщо
Поведінка:
- Розгортає детермінований мінімальний проксі (clone) контракту
accountImpl - Встановлює
msg.senderяк менеджера акаунта - Якщо
msg.value > 0, виконує депозит HYPE від імені акаунта- Переказує HYPE на
HYPE_SYSTEM_ADDRESS(міст HyperCore) - Якщо депозит >= $1 у HYPE, акаунт активується на 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 — це прямий шлях фінансування через HyperEVM для грошових балансів Hypercall. Він переказує нативний HyperEVM USDC від msg.sender до Exchange, після чого Exchange депонує цей USDC на свій баланс HyperCore через CoreDepositWallet від Circle.
Хто може викликати:
- Будь-який гаманець, роутер, solver або zap-контракт може викликати цей метод.
msg.senderсплачує USDC.account— це акаунт або гаманець Hypercall, який буде зараховано. Не робіть висновків про акаунт зарахування на основіmsg.sender.
Вимоги:
account != address(0)amount > 0msg.senderмає надатиExchangeапрув на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апрув на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 Sequencer викликає
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 офчейн, щоб уникнути атак повторного відтворення.
-
Активація акаунта: Акаунти мають бути активовані на HyperCore (депозит >= $1 у HYPE) перед тим, як вони зможуть торгувати перпами. Перевіряйте статус активації через API HyperCore.
-
Детерміновані адреси: Адреси акаунтів детерміновані на основі адреси менеджера та кількості створень. Використовуйте
predictNextAccount, щоб дізнатися адреси до створення.