このページは機械翻訳されています。英語の原文が正式版です。 英語で読む
メインコンテンツにスキップ

オンボーディング

このドキュメントでは、マーケットメイカー向けのオンチェーンアカウントのライフサイクル、資金フロー、および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上でアクティベートされます(アクティベーション手数料が差し引かれます)

例 (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 > 0
  • msg.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;

サポートされるトークンの種類:

  1. オプションERC20トークン(OptionRegistry に登録済み):
    • msg.value == 0(必須)
    • IOptionToken(token).burnFrom(msg.sender, amount) によってオプショントークンをバーンします
    • Deposit(account, msg.sender, token, amount) を発行します
    • RSMインデクサーがイベントを検知し、アカウントのオプションポジションに反映します

要件:

  • account は登録済みのHypercallアカウントである必要があります
  • optionRegistry != address(0)(設定されている必要があります)
  • msg.senderamount 分を 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ウォレットが追加されたら:

  1. オフチェーンAPI認証: APIウォレットの秘密鍵を使用してEIP-712メッセージに署名します(認証を参照)
  2. オンチェーン検証: RSMシーケンサーが、署名済みリクエストとともに Exchange.hlRequestOrder(または類似の関数)を呼び出します
  3. 実行: 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): 呼び出し元がマネージャーではありません

セキュリティに関する考慮事項

  1. マネージャーキーのセキュリティ: マネージャーキーはアカウントの所有権とAPIウォレット管理を制御します。安全に保管してください(ハードウェアウォレット推奨)。

  2. APIウォレットキーのセキュリティ: APIウォレットキーは取引リクエストに署名します。アカウント/環境ごとに別々のキーを使用してください。定期的にローテーションしてください。

  3. ノンス管理: 各署名者(APIウォレット、マネージャー、RSM)は個別のノンス空間を持ちます。リプレイ攻撃を避けるため、オフチェーンでノンスを追跡してください。

  4. アカウントのアクティベーション: アカウントは、パーペチュアルを取引する前にHyperCore上でアクティベートされる必要があります($1以上相当のHYPE入金)。アクティベーション状態はHyperCore API経由で確認してください。

  5. 決定論的アドレス: アカウントアドレスは、マネージャーアドレスと作成回数に基づいて決定論的に決まります。作成前にアドレスを知るには predictNextAccount を使用してください。