オンボーディング
このドキュメントでは、マーケットメイカー向けのオンチェーンアカウントのライフサイクル、資金フロー、および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がガバナンスによって設定されている必要がありますmsg.value >= getCreationDeposit()(HYPEでの最低入金額)creationDepositUsd == 0の場合、最低入金額は不要です- それ以外の場合、
getCreationDeposit()は現在のスポット価格を使用してUSD金額をHYPEに換算します
動作:
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. アカウントの移転
マネージャーはアカウントの所有権を移転できます(直接呼び出すことはできず、作成時またはガバナンスを介して行われます):
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);
apiWallet がアクティブな場合、アカウント、マネージャー、およびそのアカウントのすべてのAPIウォレットを返します。非アクティブの場合はゼロ構造体を返します。
例:
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);
}
資金供給と入金
HypercallへのUSDC入金
function depositUsdcFor(address account, uint256 amount) external;
depositUsdcFor は、Hypercallの現金残高に対する直接的なHyperEVM資金供給経路です。msg.sender からネイティブHyperEVM USDCを Exchange に転送し、その後 Exchange はCircleの CoreDepositWallet を通じてそのUSDCをHyperCore残高に入金します。
呼び出し可能な主体:
- 任意のウォレット、ルーター、ソルバー、またはZapコントラクトがこのメソッドを呼び出せます。
msg.senderがUSDCを支払います。accountは入金先のHypercallアカウントまたはウォレットです。入金先アカウントをmsg.senderから推測しないでください。
要件:
account != address(0)amount > 0msg.senderはネイティブHyperEVM USDCのamount分をExchangeに承認(approve)する必要があります- デプロイされた
Exchange実装は、対象ネットワーク向けのネイティブHyperEVM USDCトークンおよびCoreDepositWalletアドレスを使用して構築されている必要があります
イベントと残高反映:
event UsdcDeposit(
address indexed account,
address indexed from,
address indexed token,
uint256 amount,
uint32 dstDex
);
このイベントは CoreDepositWallet.depositFor の呼び出し後に Exchange によって発行されます。バックエンドは、Hypercallの現金残高に反映する前に、このイベントをExchange残高へのHyperCore入金の観測結果と照合する必要があります。残高が反映される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は登録済みのHypercallアカウントである必要がありますoptionRegistry != address(0)(設定されている必要があります)msg.senderはamount分をExchangeに承認(approve)している必要があります
例(オプショントークンの入金):
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.valueが不足していますExchange__TokenNotSupported(address token): 入金がサポートされていないトークンですExchange__MsgValueIncorrect(uint256 expected):msg.valueが一致しませんExchange__NotManager(address account, address notManager): 呼び出し元がマネージャーではありません
セキュリティに関する考慮事項
-
マネージャーキーのセキュリティ: マネージャーキーはアカウントの所有権とAPIウォレット管理を制御します。安全に保管してください(ハードウェアウォレット推奨)。
-
APIウォレットキーのセキュリティ: APIウォレットキーは取引リクエストに署名します。アカウント/環境ごとに別々のキーを使用してください。定期的にローテーションしてください。
-
ノンス管理: 各署名者(APIウォレット、マネージャー、RSM)は個別のノンス空間を持ちます。リプレイ攻撃を避けるため、オフチェーンでノンスを追跡してください。
-
アカウントのアクティベーション: アカウントは、パーペチュアルを取引する前にHyperCore上でアクティベートされる必要があります($1以上相当のHYPE入金)。アクティベーション状態はHyperCore API経由で確認してください。
-
決定論的アドレス: アカウントアドレスは、マネージャーアドレスと作成回数に基づいて決定論的に決まります。作成前にアドレスを知るには
predictNextAccountを使用してください。