署名・送信 API
トランザクションに直接署名して送信するための同期エンドポイントです。ジョブのポーリングは不要です。
エンドポイント
| エンドポイント | 目的 | 戻り値 |
|---|
POST /agent/sign | メッセージ、型付きデータ、またはトランザクションに署名します | 署名 |
POST /agent/submit | 生のトランザクションをチェーンに送信します | トランザクションハッシュ |
POST /agent/sign
署名の種類
| 種類 | 用途 |
|---|
personal_sign | プレーンテキストメッセージ(認証、検証) |
eth_signTypedData_v4 | EIP-712 型付きデータ(許可、注文) |
eth_signTransaction | 後でブロードキャストするトランザクションへの署名 |
使用方法
// personal_sign
const signMessage = await fetch(`${API_URL}/agent/sign`, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({
signatureType: "personal_sign",
message: "Sign in to MyApp\nNonce: abc123",
}),
});
// → { success: true, signature: "0x...", signer: "0x...", signatureType: "personal_sign" }
// eth_signTypedData_v4 (EIP-2612 permit)
const signPermit = await fetch(`${API_URL}/agent/sign`, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({
signatureType: "eth_signTypedData_v4",
typedData: {
domain: { name: "USD Coin", version: "2", chainId: 8453, verifyingContract: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" },
types: {
Permit: [
{ name: "owner", type: "address" },
{ name: "spender", type: "address" },
{ name: "value", type: "uint256" },
{ name: "nonce", type: "uint256" },
{ name: "deadline", type: "uint256" },
],
},
primaryType: "Permit",
message: { owner: "0x...", spender: "0x...", value: "1000000", nonce: "0", deadline: "1735689600" },
},
}),
});
// eth_signTransaction
const signTx = await fetch(`${API_URL}/agent/sign`, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({
signatureType: "eth_signTransaction",
transaction: { to: "0x...", chainId: 8453, value: "0", data: "0xa9059cbb..." },
}),
});
エラーレスポンス
| ステータス | エラー | 原因 |
|---|
| 400 | 必須フィールドがありません | message、typedData、または transaction がありません |
| 401 | 認証が必要です | API キーがないか、無効です |
| 403 | 読み取り専用 API キーです | キーに書き込み権限がありません |
POST /agent/submit
トランザクションフィールド
| フィールド | 型 | 必須 | 説明 |
|---|
to | string | はい | 宛先アドレス |
chainId | number | はい | チェーン ID(8453=Base、1=Ethereum、137=Polygon) |
value | string | いいえ | wei 単位の値 |
data | string | いいえ | コールデータ(16 進数) |
gas | string | いいえ | ガス上限 |
maxFeePerGas | string | いいえ | EIP-1559 の最大手数料 |
maxPriorityFeePerGas | string | いいえ | EIP-1559 の優先手数料 |
オプション
| フィールド | 型 | デフォルト | 説明 |
|---|
description | string | — | ログ記録用の人が読める説明 |
waitForConfirmation | boolean | true | オンチェーンでの確認を待ちます |
使用方法
// Submit a transaction and wait for confirmation
const result = await fetch(`${API_URL}/agent/submit`, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({
transaction: { to: "0x...", chainId: 8453, value: "1000000000000000000" },
description: "Send 1 ETH",
waitForConfirmation: true,
}),
});
// → { success: true, transactionHash: "0x...", status: "success", blockNumber: "123", gasUsed: "21000" }
// Fire-and-forget (don't wait for confirmation)
const pending = await fetch(`${API_URL}/agent/submit`, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({
transaction: { to: "0x...", chainId: 8453, value: "100000000000000000" },
waitForConfirmation: false,
}),
});
// → { success: true, transactionHash: "0x...", status: "pending" }
複数ステップのワークフロー
// Approve + Swap sequence
async function approveAndSwap(approveTx: object, swapTx: object) {
// 1. Approve token spending
const approval = await submitTransaction(approveTx);
if (approval.status !== "success") throw new Error("Approval failed");
// 2. Execute swap
const swap = await submitTransaction(swapTx);
if (swap.status !== "success") throw new Error("Swap failed");
return swap;
}
トランザクションのステータス値
| ステータス | 説明 |
|---|
success | 確認済みで、成功しました |
reverted | 確認済みですが、取り消されました |
pending | 送信済みですが、まだ確認されていません |
/agent/prompt との比較
| 機能 | /agent/prompt | /agent/sign | /agent/submit |
|---|
| 入力 | 自然言語 | 構造化データ | トランザクションオブジェクト |
| レスポンス | 非同期(ジョブ ID) | 同期(署名) | 同期(トランザクションハッシュ) |
| オンチェーンで実行 | AI エージェント経由 | いいえ | はい |
| 最適な用途 | 一般的な問い合わせ | 認証、許可 | 生のトランザクション |
セキュリティに関する注意事項
/agent/submit は即座に実行されます。確認プロンプトはありません
- 読み取り専用 API キーでは、どちらのエンドポイントでも 403 が返されます
- 送信前に必ずトランザクションパラメーターを検証してください
- 重要なトランザクションでは
waitForConfirmation: true を使用してください
関連スキル
bankr-api-basics - API の基本
bankr-client-patterns - クライアントのセットアップ
bankr-safety - セキュリティのベストプラクティス
bankr-arbitrary-transaction - 生のトランザクション JSON の構築