EIP-7702
BOT Chain Mainnet と Testnet は EIP-7702 Type 4 トランザクションに対応しています。既存 EOA は認可に署名し、元の EOA アドレス、残高、秘密鍵による制御を維持したまま、実行コードをデプロイ済みアカウント実装へ委任できます。
送信経路は 2 つあります。
- ネイティブトランザクション:
authorizationListを含む Type 4 トランザクションをチェーン RPC へ送信します。 - UserOperation: BOT Chain Bundler は現在 EIP-7702 UserOperation に対応していません。独自 Bundler で実装できます。
ネイティブ Type 4 トランザクション
ネイティブ経路は EntryPoint と Bundler を使用せず、EOA 自身が Gas を支払います。
1. 依存関係のインストール
npm install viem
2. クライアントの作成
次の例では BOT Chain Testnet を使用します。
import { createPublicClient, createWalletClient, http } from "viem";
import { privateKeyToAccount } from "viem/accounts";
const botTestnet = {
id: 968,
name: "BOT Chain Testnet",
nativeCurrency: { name: "BOT", symbol: "BOT", decimals: 18 },
rpcUrls: { default: { http: ["https://rpc.bohr.life"] } },
} as const;
const eoa = privateKeyToAccount("0x...");
const publicClient = createPublicClient({
chain: botTestnet,
transport: http("https://rpc.bohr.life"),
});
const walletClient = createWalletClient({
account: eoa,
chain: botTestnet,
transport: http("https://rpc.bohr.life"),
});
プロダクションのフロントエンドソースに秘密鍵を保存しないでください。ウォレットコネクターまたは保護された署名サービスを使用します。
3. 認可への署名と委任の設定
EOA が認可署名者と Type 4 トランザクション送信者を兼ねる場合、executor: "self" を設定し、viem にトランザクション nonce と認可 nonce の関係を正しく処理させます。
const implementation = "0x..." as const;
const authorization = await walletClient.signAuthorization({
account: eoa,
contractAddress: implementation,
executor: "self",
});
const hash = await walletClient.sendTransaction({
account: eoa,
authorizationList: [authorization],
to: eoa.address,
data: "0x",
});
await publicClient.waitForTransactionReceipt({ hash });
sendTransaction は EIP-7702 Type 4 トランザクションを構築して送信します。
アカウント実装の初期化が必要な場合は、初期化 calldata を同じトランザクションに含めます。
import { encodeFunctionData } from "viem";
const initializeData = encodeFunctionData({
abi: accountAbi,
functionName: "initialize",
args: [/* 初期化引数 */],
});
const hash = await walletClient.sendTransaction({
account: eoa,
authorizationList: [authorization],
to: eoa.address,
data: initializeData,
});
4. 委任結果の確認
const code = await publicClient.getCode({ address: eoa.address });
const expectedCode = `0xef0100${implementation.slice(2).toLowerCase()}`;
if (code?.toLowerCase() !== expectedCode) {
throw new Error("EIP-7702 delegation was not applied");
}
5. 委任済みアカウントの呼び出し
委任後も呼び出し先は EOA アドレスです。アカウント実装の ABI に従って calldata をエンコードします。
import { encodeFunctionData } from "viem";
const callData = encodeFunctionData({
abi: accountAbi,
functionName: "execute",
args: [target, value, targetCallData],
});
const hash = await walletClient.sendTransaction({
account: eoa,
to: eoa.address,
data: callData,
});
ビジネス呼び出し先は target で、アカウント実装は認可済みの implementation アドレスです。