EVM(eth-sign-request)
eth-sign-request
| キー | フィールド | 型 | 内容 |
|---|---|---|---|
| 1 | request-id | 37(bytes) | 16 バイトのランダム値(1〜64 バイトも可) |
| 2 | sign-data | bytes | 署名対象。データタイプによって異なる(後述) |
| 3 | data-type | uint | 1、2、3、4 のいずれか |
| 4 | chain-id | uint | EVM のチェーン ID。トランザクションでは必須、それ以外でも推奨 |
| 5 | derivation-path | 304(crypto-keypath) | フルパス(例:m/44'/60'/0'/0/0)とマスターフィンガープリント |
| 6 | address | bytes (20) | 署名者のアドレスの生バイト列。0x で始まるテキストではない |
| 7 | origin | text | ユーザーに表示される(例:"BitTool Wallet") |
データタイプ
| data-type | sign-data | 主な呼び出し元 |
|---|---|---|
1 トランザクション | EIP-155 のチェーン ID を含む 未署名のレガシートランザクションの RLP:rlp([nonce, gasPrice, gas, to, value, data, chainId, 0, 0]) | レガシーのガス設定を使うチェーンでの eth_sendTransaction |
4 型付きトランザクション | 未署名の EIP-2718 エンベロープ:0x02 ‖ rlp([...])(EIP-1559)または 0x01 ‖ rlp([...])(EIP-2930) | eth_sendTransaction、現在の送金の大半 |
3 パーソナルメッセージ | メッセージの生バイト列。"\x19Ethereum Signed Message:\n" プレフィックスを付けず、ハッシュもしない | personal_sign |
2 型付きデータ | UTF-8 の EIP-712 JSON:{types, primaryType, domain, message} | eth_signTypedData_v4 |
ハッシュではなく、必ずバイト列を送ってください。BitTool Signer は署名する内容をパースしており、中身の分からない 32 バイトのダイジェストへのブラインド署名は拒否します。
ネットワーク
トランザクションのバイト列内のチェーン ID、キー 4、そして(型付きデータの場合は)domain.chainId はすべて一致し、かつ次のいずれかでなければなりません。
| チェーン ID | ネットワーク | チェーン ID | ネットワーク | |
|---|---|---|---|---|
| 1 | Ethereum | 10 | OP Mainnet | |
| 56 | BNB Chain | 137 | Polygon PoS | |
| 42161 | Arbitrum One | 100 | Gnosis | |
| 8453 | Base | 43114 | Avalanche C-Chain |
非対応
Blob トランザクション(タイプ 3)、EIP-7702 トランザクション(タイプ 4)、チェーン ID のない保護されていないレガシートランザクション、生の 32 バイトハッシュに対する eth_sign には対応していません。その他のチェーン ID のリクエストは拒否されます。
EIP-712 のルール
BitTool Signer は型付きデータを宣言どおりにハッシュし、値を厳密に扱います。表示と異なる形でハッシュされる値は、典型的なフィッシングの手口だからです。
boolの値は文字列ではなく、JSON のtrue/falseでなければなりません。- 整数を JSON の数値で表せるのは 253 − 1 までです。それより大きい値は、先頭にゼロのない 10 進文字列、または
0xの 16 進文字列にしてください。 addressの値は0x+ 16 進 40 桁で、大文字小文字が混在するアドレスは有効な EIP-55 チェックサムを持つ必要があります。bytesNはちょうど N バイトでなければなりません。messageは、その型が宣言するフィールドを過不足なく持つ必要があります。欠けているフィールドも余分なフィールドも不可です。EIP712Domainに含められるのはname、version、chainId、verifyingContract、saltのみです。ドメインセパレーターには宣言された順序が使われます。
既知の構造は完全に解析して表示します。ERC-2612 / DAI の Permit、Permit2(single、batch、transfer-from)、Safe の SafeTx、NFT マーケットプレイスの注文(Seaport、LooksRare、Blur)です。それ以外はフィールドごとに表示され、部分的にデコードされたものとして示されます。
パーソナルメッセージ
1〜8,192 バイトの任意のバイト列です。有効な UTF-8 はテキストとして、それ以外は不透明なデータとして 16 進で表示されます。32 バイトのメッセージは、ユーザーが読めないハッシュである可能性が高いため、高リスクとして警告されます。
eth-signature
eth-signature = {
1: 37(request-id bytes), ; copied from the request
2: signature ; r (32) ‖ s (32) ‖ v (1 or more bytes)
}
この署名は署名済みトランザクションでは ありません。署名済みトランザクションはウォレット側で組み立てます。v の部分はデータタイプによって異なります。
| data-type | v | 長さ |
|---|---|---|
1 レガシートランザクション | chainId × 2 + 35 + yParity(EIP-155)、ビッグエンディアン、必要最小限のバイト数 | 65 バイト以上 |
4 型付きトランザクション | yParity(0 または 1) | 65 |
2、3 メッセージ | 27 + yParity | 65 |
したがって、v はバイト 64 から末尾までを符号なしビッグエンディアン整数として読み取ってください。たとえば Avalanche(チェーン ID 43114)では、レガシーの v は 86263 または 86264 の 3 バイトで、署名全体は 67 バイトになります。常にバイト 64 だけを v とみなすコードは、チェーン ID が 110 以上のチェーンで動かなくなります。
仕上げの手順は次のとおりです。
- リクエスト ID を確認します。
- 期待するダイジェスト(トランザクションハッシュ、EIP-191 ハッシュ、または EIP-712 ハッシュ)から署名者を復元し、ペアリング済みのアドレスと比較します。
- トランザクションの場合は、
r、s、パリティを未署名トランザクションに挿入してシリアライズし、ブロードキャストする前にトランザクションハッシュを確認します。
コード
ethers と Keystone の @keystonehq/bc-ur-registry-eth を使う例です。
import { randomUUID } from 'node:crypto';
import { Transaction, Signature, getBytes } from 'ethers';
import { EthSignRequest, DataType, ETHSignature } from '@keystonehq/bc-ur-registry-eth';
import { URDecoder } from '@ngraveio/bc-ur';
export function buildEthRequest(tx, { path, masterFingerprint, address }) {
const unsigned = Transaction.from(tx); // no signature yet
const requestId = randomUUID();
const request = EthSignRequest.constructETHRequest(
Buffer.from(getBytes(unsigned.unsignedSerialized)), // the bytes to sign, not a hash
unsigned.type === 0 ? DataType.transaction : DataType.typedTransaction, // 1 or 4
path, // "m/44'/60'/0'/0/0"
masterFingerprint, // "73c5da0a"
requestId,
Number(unsigned.chainId),
address,
'BitTool Wallet', // origin, shown to the user
);
const encoder = request.toUREncoder(400); // fragment length in bytes
const frames = [];
for (let i = 0; i < encoder.fragmentsLength; i++) frames.push(encoder.nextPart().toUpperCase());
return { unsigned, requestId, frames };
}
export function readEthSignature(frames, { unsigned, requestId, address }) {
const decoder = new URDecoder();
for (const frame of frames) decoder.receivePart(frame);
if (!decoder.isSuccess()) throw new Error('Incomplete or invalid QR');
const ur = decoder.resultUR();
if (ur.type !== 'eth-signature') throw new Error(`Expected eth-signature, got ${ur.type}`);
const response = ETHSignature.fromCBOR(ur.cbor);
const id = response.getRequestId();
if (!id || Buffer.from(id).toString('hex') !== requestId.replace(/-/g, '')) throw new Error('Signature is for another request');
const sig = Buffer.from(response.getSignature()); // r (32) ‖ s (32) ‖ v (1+ bytes)
const r = '0x' + sig.subarray(0, 32).toString('hex');
const s = '0x' + sig.subarray(32, 64).toString('hex');
const v = BigInt('0x' + sig.subarray(64).toString('hex'));
const yParity = unsigned.type === 0 ? Number(v - unsigned.chainId * 2n - 35n) : Number(v);
if (yParity !== 0 && yParity !== 1) throw new Error('Unexpected v');
const signed = unsigned.clone();
signed.signature = Signature.from({ r, s, yParity });
if (signed.from !== address) throw new Error('Signed by an unexpected key');
return signed.serialized; // ready for eth_sendRawTransaction
}
テストベクター
すべてテストフレーズの m/44'/60'/0'/0/0(0x9858EfFD232B4033E47d90003D41EC34EcaEda94)から生成しています。
- ETH 送金(EIP-1559)
- ERC-20 送金
- レガシー(BNB Chain)
- 複数バイトの v(Avalanche)
- personal_sign
- EIP-712(Permit)
Ethereum で 0.01 ETH を送金します。nonce 12、最大手数料 30 gwei、優先手数料 1 gwei です。
リクエスト(ウォレット → BitTool Signer)
{
"1 request-id": {
"uuid (tag 37)": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a01"
},
"2 sign-data": "02ef010c843b9aca008506fc23ac0082520894000000000000000000000000000000000000dead872386f26fc1000080c0",
"3 data-type": 4,
"4 chain-id": 1,
"5 derivation-path": {
"crypto-keypath (tag 304)": {
"1 components": [
44,
true,
60,
true,
0,
true,
0,
false,
0,
false
],
"2 source-fingerprint": 1942346250
}
},
"6 address": "9858effd232b4033e47d90003d41ec34ecaeda94",
"7 origin": "BitTool Wallet"
}
QR テキストと生の CBOR を表示
UR:ETH-SIGN-REQUEST/OSADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTADAOHDEHAOWSADBNLRFRNYSGAELPAMZTCNPSAELFGMAYMWAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEUEPMLTCNLNWZJLSEAEAELARTAXAAAAADAHTAADDYOEADLECSDWYKCSFNYKAEYKAEWKAEWKAOCYJKSKTNBKAMGHMKHDWSZCCNDNFZEOVEKIMHAEFSFPWPEEWPPLTNMWATJTFWINJYGHJLJLJZCXHGHSJZJZIHJYKEBDYTMH
a701d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a0102583102ef010c843b9aca008506fc23ac0082520894000000000000000000000000000000000000dead872386f26fc1000080c00304040105d90130a2018a182cf5183cf500f500f400f4021a73c5da0a06549858effd232b4033e47d90003d41ec34ecaeda94076e426974546f6f6c2057616c6c6574
レスポンス(BitTool Signer → ウォレット)
{
"request-id": {
"uuid": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a01"
},
"signature": "6d11ee93f7876a78ea19f4f9c8e551e4522b6deb8349a6572d076b4e67ceb4416db3f690b339bf658a5c8d2ad2f75cdf3252f07f940a821f65bb6cb91e9782a101"
}
QR テキストと生の CBOR を表示
UR:ETH-SIGNATURE/OEADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTADAOHDFPJNBYWYMUYLLTIMKSWDCFWKYTSPVWGYVEGMDNJNWMLSGAOLHGDPATJEGLIOTOQZFPJNQDYNMHQDESRSIHLEHHLGDRTDYLHHUREYGMWTLBMWBKLFCTIHRKJZRHCKMSLFOYADCWJNLUAY
a201d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a010258416d11ee93f7876a78ea19f4f9c8e551e4522b6deb8349a6572d076b4e67ceb4416db3f690b339bf658a5c8d2ad2f75cdf3252f07f940a821f65bb6cb91e9782a101
ウォレット側で組み立てた結果
0x02f872010c843b9aca008506fc23ac0082520894000000000000000000000000000000000000dead872386f26fc1000080c001a06d11ee93f7876a78ea19f4f9c8e551e4522b6deb8349a6572d076b4e67ceb441a06db3f690b339bf658a5c8d2ad2f75cdf3252f07f940a821f65bb6cb91e9782a1
0xd7e69271cce78ffdf924b78126b93fb3cdf4f797f7e216bcb6702c8d97b47ea3
25 USDT(0xdAC17F958D2ee523a2206206994597C13D831ec7)を 0x…dEaD に送金します。トークンコントラクト宛てのタイプ 2 トランザクションで、transfer(address,uint256) の calldata を含みます。
リクエスト(ウォレット → BitTool Signer)
{
"1 request-id": {
"uuid (tag 37)": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a02"
},
"2 sign-data": "02f86d010d843b9aca008506fc23ac0082fde894dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000000000000000000000000000000000000000dead00000000000000000000000000000000000000000000000000000000017d7840c0",
"3 data-type": 4,
"4 chain-id": 1,
"5 derivation-path": {
"crypto-keypath (tag 304)": {
"1 components": [
44,
true,
60,
true,
0,
true,
0,
false,
0,
false
],
"2 source-fingerprint": 1942346250
}
},
"6 address": "9858effd232b4033e47d90003d41ec34ecaeda94",
"7 origin": "BitTool Wallet"
}
QR テキストと生の CBOR を表示
UR:ETH-SIGN-REQUEST/1-2/LPADAOCSSBCYBAKGFGLDHDIYOSADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAOAOHDJOAOYAJNADBTLRFRNYSGAELPAMZTCNPSAELFZCVSMWTNSELBMDLGDMVWCNOECXIDAMNLFEMSSEFSLSCKSTLAROFYPTAHNSRKAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEUEWZKKWPDA
UR:ETH-SIGN-REQUEST/2-2/LPAOAOCSSBCYBAKGFGLDHDIYPMAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADKIKSFZRTAXAAAAADAHTAADDYOEADLECSDWYKCSFNYKAEYKAEWKAEWKAOCYJKSKTNBKAMGHMKHDWSZCCNDNFZEOVEKIMHAEFSFPWPEEWPPLTNMWATJTFWINJYGHJLJLJZCXHGHSJZJZIHJYAEMTOECYFP
a701d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a0202587002f86d010d843b9aca008506fc23ac0082fde894dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000000000000000000000000000000000000000dead00000000000000000000000000000000000000000000000000000000017d7840c00304040105d90130a2018a182cf5183cf500f500f400f4021a73c5da0a06549858effd232b4033e47d90003d41ec34ecaeda94076e426974546f6f6c2057616c6c6574
レスポンス(BitTool Signer → ウォレット)
{
"request-id": {
"uuid": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a02"
},
"signature": "b655c3c1583521ea9512813649eb67e3d448a82323f3f918733f1f1c81fecfac6c8d3eba455e89df4340648addba1ac384d686d3d6fb1dd876159d436c1d874900"
}
QR テキストと生の CBOR を表示
UR:ETH-SIGNATURE/OEADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAOAOHDFPRPGOSRSEHDECCLWDMDBGLYENGAWMIOVLTYFDPDCNCNWFYTCSJKFHCTCELYZETKPSJZLGFMRDFEHYLDURFXFZIELEUTRDCYSRLRTBLNTETBZOCATPKOBZNTFXJZCALTGAAEIOVDDSDP
a201d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a02025841b655c3c1583521ea9512813649eb67e3d448a82323f3f918733f1f1c81fecfac6c8d3eba455e89df4340648addba1ac384d686d3d6fb1dd876159d436c1d874900
ウォレット側で組み立てた結果
0x02f8b0010d843b9aca008506fc23ac0082fde894dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000000000000000000000000000000000000000dead00000000000000000000000000000000000000000000000000000000017d7840c080a0b655c3c1583521ea9512813649eb67e3d448a82323f3f918733f1f1c81fecfaca06c8d3eba455e89df4340648addba1ac384d686d3d6fb1dd876159d436c1d8749
0x833608a1dc2a1a9d3c0cbd3efc5bb2edcfecb6df6529046fec37409e8b2d8a07
レガシー(タイプ 0)の EIP-155 トランザクションで 0.05 BNB を送金します。チェーン ID は 56 で、v は 147 または 148 です。
リクエスト(ウォレット → BitTool Signer)
{
"1 request-id": {
"uuid (tag 37)": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a03"
},
"2 sign-data": "ea03843b9aca0082520894000000000000000000000000000000000000dead87b1a2bc2ec5000080388080",
"3 data-type": 1,
"4 chain-id": 56,
"5 derivation-path": {
"crypto-keypath (tag 304)": {
"1 components": [
44,
true,
60,
true,
0,
true,
0,
false,
0,
false
],
"2 source-fingerprint": 1942346250
}
},
"6 address": "9858effd232b4033e47d90003d41ec34ecaeda94",
"7 origin": "BitTool Wallet"
}
QR テキストと生の CBOR を表示
UR:ETH-SIGN-REQUEST/OSADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAXAOHDDNWDAXLRFRNYSGAELFGMAYMWAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEUEPMLTPAOERFDMSKAEAELAETLALAAXADAACSETAHTAADDYOEADLECSDWYKCSFNYKAEYKAEWKAEWKAOCYJKSKTNBKAMGHMKHDWSZCCNDNFZEOVEKIMHAEFSFPWPEEWPPLTNMWATJTFWINJYGHJLJLJZCXHGHSJZJZIHJYBEDATTTB
a701d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a0302582bea03843b9aca0082520894000000000000000000000000000000000000dead87b1a2bc2ec5000080388080030104183805d90130a2018a182cf5183cf500f500f400f4021a73c5da0a06549858effd232b4033e47d90003d41ec34ecaeda94076e426974546f6f6c2057616c6c6574
レスポンス(BitTool Signer → ウォレット)
{
"request-id": {
"uuid": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a03"
},
"signature": "99b9b24ba7971ac9b6f978fa9cf7222d763a01f383b78b675fe6f19cd91c24d50a84cb670f593c3b3b07c7e279dc038d6985283b5ea418c882816ecf3886197f94"
}
QR テキストと生の CBOR を表示
UR:ETH-SIGNATURE/OEADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAXAOHDFPNLRHPRGROSMSCYSORPYTKSZSNSYLCPDPKOFTADWFLSRLLUIOHEVAWNNSTACEDKTLBKLRSBIOBSHKFNFRFRATSTVOKKUOAXLGINLPDEFRHYOXCSSPLFLYJTTKETLNCFLBMWHPFRGTJO
a201d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a0302584199b9b24ba7971ac9b6f978fa9cf7222d763a01f383b78b675fe6f19cd91c24d50a84cb670f593c3b3b07c7e279dc038d6985283b5ea418c882816ecf3886197f94
ウォレット側で組み立てた結果
0xf86b03843b9aca0082520894000000000000000000000000000000000000dead87b1a2bc2ec50000808194a099b9b24ba7971ac9b6f978fa9cf7222d763a01f383b78b675fe6f19cd91c24d5a00a84cb670f593c3b3b07c7e279dc038d6985283b5ea418c882816ecf3886197f
0xd55bd1f2a22d1be562f20f1183b1d21668ac489c13ef1691e489c20bf5e9f345
チェーン ID 43114 のレガシートランザクションです。v = 43114 × 2 + 35 + yParity は 3 バイトを必要とします。
リクエスト(ウォレット → BitTool Signer)
{
"1 request-id": {
"uuid (tag 37)": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a04"
},
"2 sign-data": "e6808505d21dba0082520894000000000000000000000000000000000000dead018082a86a8080",
"3 data-type": 1,
"4 chain-id": 43114,
"5 derivation-path": {
"crypto-keypath (tag 304)": {
"1 components": [
44,
true,
60,
true,
0,
true,
0,
false,
0,
false
],
"2 source-fingerprint": 1942346250
}
},
"6 address": "9858effd232b4033e47d90003d41ec34ecaeda94",
"7 origin": "BitTool Wallet"
}
QR テキストと生の CBOR を表示
UR:ETH-SIGN-REQUEST/OSADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAAAOHDDIVALALPAHTDCARDAELFGMAYMWAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEUEPMADLALFPDIMLALAAXADAACFPDIMAHTAADDYOEADLECSDWYKCSFNYKAEYKAEWKAEWKAOCYJKSKTNBKAMGHMKHDWSZCCNDNFZEOVEKIMHAEFSFPWPEEWPPLTNMWATJTFWINJYGHJLJLJZCXHGHSJZJZIHJYVAFRKEEN
a701d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a04025827e6808505d21dba0082520894000000000000000000000000000000000000dead018082a86a808003010419a86a05d90130a2018a182cf5183cf500f500f400f4021a73c5da0a06549858effd232b4033e47d90003d41ec34ecaeda94076e426974546f6f6c2057616c6c6574
レスポンス(BitTool Signer → ウォレット)
{
"request-id": {
"uuid": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a04"
},
"signature": "0fbf3979a6eb15c48fc1c21582ec103413606277938a725fade823a28f3c3df41127fb3ced53ae9d8928736e2f485b2cdd6cde01d8a32c6c011cd3ce5cd0fe070150f7"
}
QR テキストと生の CBOR を表示
UR:ETH-SIGNATURE/OEADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAAAOHDFXBSRSESKKOLWMBZSSMYSESABZLFWPBEEEBWHNIDKTMULEJPHEPMVSCNOEMYFNFSWKBYDIZOFNWEGUPLNTLDDEJKJTDLFDHPDWUTJZUEADTPOTDWJZADCETETOHHTIZEATADGDYLGTRNGSJZ
a201d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a040258430fbf3979a6eb15c48fc1c21582ec103413606277938a725fade823a28f3c3df41127fb3ced53ae9d8928736e2f485b2cdd6cde01d8a32c6c011cd3ce5cd0fe070150f7
ウォレット側で組み立てた結果
0xf867808505d21dba0082520894000000000000000000000000000000000000dead0180830150f7a00fbf3979a6eb15c48fc1c21582ec103413606277938a725fade823a28f3c3df4a01127fb3ced53ae9d8928736e2f485b2cdd6cde01d8a32c6c011cd3ce5cd0fe07
0x7ccf66af770795af5b7457ac738c6a9ba2d3ebb3ca7203cf9d4e65f815f82678
Sign-In with Ethereum(EIP-4361)のメッセージです。sign-data は UTF-8 テキストそのもので、署名の v は 27/28 です。
リクエスト(ウォレット → BitTool Signer)
{
"1 request-id": {
"uuid (tag 37)": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a06"
},
"2 sign-data": "6170702e6578616d706c652e6f72672077616e747320796f7520746f207369676e20696e207769746820796f757220457468657265756d206163636f756e743a0a3078393835384566464432333242343033334534376439303030334434314543333445636145646139340a0a5369676e20696e20746f204578616d706c65204170702e0a0a5552493a2068747470733a2f2f6170702e6578616d706c652e6f72670a56657273696f6e3a20310a436861696e2049443a20310a4e6f6e63653a203866336b326d39710a4973737565642041743a20323032362d31302d31385430393a33303a30302e3030305a",
"3 data-type": 3,
"4 chain-id": 1,
"5 derivation-path": {
"crypto-keypath (tag 304)": {
"1 components": [
44,
true,
60,
true,
0,
true,
0,
false,
0,
false
],
"2 source-fingerprint": 1942346250
}
},
"6 address": "9858effd232b4033e47d90003d41ec34ecaeda94",
"7 origin": "BitTool Wallet"
}
QR テキストと生の CBOR を表示
UR:ETH-SIGN-REQUEST/1-2/LPADAOCFADFDCYCMDSCMFHHDOXOSADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAMAOHDWEHSJOJODMIHKSHSJNJOJZIHDMJLJPIOCXKTHSJTJYJKCXKKJLKPCXJYJLCXJKINIOJTCXINJTCXKTINJYISCXKKJLKPJPCXFEJYISIHJPIHKPJNCXHSIAIAJLKPJTJYFTBKDYKSESETECETFEIYFGFYEYEOEYFWEEDYEOEOFEEEEMIEESDYDYDYEOFYEEEHFEFXEOEEFEIAHSFEIEHSESEEBKBKGUINIOJTCXINJTCXJYJLCXFEKSHSJNJOJZIHCXFPJOJODMBKBKGOGMGAFTCXISCPDEGMOY
UR:ETH-SIGN-REQUEST/2-2/LPAOAOCFADFDCYCMDSCMFHHDOXJYJYJOJKFTDLDLHSJOJODMIHKSHSJNJOJZIHDMJLJPIOBKHFIHJPJKINJLJTFTCXEHBKFXISHSINJTCXGAFYFTCXEHBKGLJLJTIAIHFTCXETIYEOJEEYJNESJSBKGAJKJKKPIHIECXFPJYFTCXEYDYEYENDPEHDYDPEHETGHDYESFTEODYFTDYDYDMDYDYDYHTAXAXAAADAHTAADDYOEADLECSDWYKCSFNYKAEYKAEWKAEWKAOCYJKSKTNBKAMGHMKHDWSZCCNDNFZEOVEKIMHAEFSFPWPEEWPPLTNMWATJTFWINJYGHJLJLJZCXHGHSJZJZIHJYCWTTFYJT
a701d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a060258ed6170702e6578616d706c652e6f72672077616e747320796f7520746f207369676e20696e207769746820796f757220457468657265756d206163636f756e743a0a3078393835384566464432333242343033334534376439303030334434314543333445636145646139340a0a5369676e20696e20746f204578616d706c65204170702e0a0a5552493a2068747470733a2f2f6170702e6578616d706c652e6f72670a56657273696f6e3a20310a436861696e2049443a20310a4e6f6e63653a203866336b326d39710a4973737565642041743a20323032362d31302d31385430393a33303a30302e3030305a0303040105d90130a2018a182cf5183cf500f500f400f4021a73c5da0a06549858effd232b4033e47d90003d41ec34ecaeda94076e426974546f6f6c2057616c6c6574
レスポンス(BitTool Signer → ウォレット)
{
"request-id": {
"uuid": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a06"
},
"signature": "23c5ba3f5d247b4c81d55b7c44a3951a14c82e70f17ef2c19abea893c4e5bef05795a7261ac2bd9da29be2dfef529327e1b0724580fccac106bed3d007854f6b1b"
}
QR テキストと生の CBOR を表示
UR:ETH-SIGNATURE/OEADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAMAOHDFPCNSKRDFHHLDKKGGSLYTLHPKEFYOTMDCYBBSPDMJOWNKBWZSENYRNPDMUSSVWRNWTHGMDOSDSCYSARYNTOENDVOURWSGMMUDIVYPFJPFELAZTSGSEAMRNTETIATLPGWJECWWNKEFGEH
a201d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a0602584123c5ba3f5d247b4c81d55b7c44a3951a14c82e70f17ef2c19abea893c4e5bef05795a7261ac2bd9da29be2dfef529327e1b0724580fccac106bed3d007854f6b1b
ウォレット側で組み立てた結果
0x23c5ba3f5d247b4c81d55b7c44a3951a14c82e70f17ef2c19abea893c4e5bef05795a7261ac2bd9da29be2dfef529327e1b0724580fccac106bed3d007854f6b1b
USDC に対する ERC-2612 の Permit で、ルーターが 100 USDC を使えるよう許可します。BitTool Signer はこれをトークンの承認(approval)として表示し、spender を既知のコントラクトのリストと照合します。
リクエスト(ウォレット → BitTool Signer)
{
"1 request-id": {
"uuid (tag 37)": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a07"
},
"2 sign-data": "7b227479706573223a7b22454950373132446f6d61696e223a5b7b226e616d65223a226e616d65222c2274797065223a22737472696e67227d2c7b226e616d65223a2276657273696f6e222c2274797065223a22737472696e67227d2c7b226e616d65223a22636861696e4964222c2274797065223a2275696e74323536227d2c7b226e616d65223a22766572696679696e67436f6e7472616374222c2274797065223a2261646472657373227d5d2c225065726d6974223a5b7b226e616d65223a226f776e6572222c2274797065223a2261646472657373227d2c7b226e616d65223a227370656e646572222c2274797065223a2261646472657373227d2c7b226e616d65223a2276616c7565222c2274797065223a2275696e74323536227d2c7b226e616d65223a226e6f6e6365222c2274797065223a2275696e74323536227d2c7b226e616d65223a22646561646c696e65222c2274797065223a2275696e74323536227d5d7d2c227072696d61727954797065223a225065726d6974222c22646f6d61696e223a7b226e616d65223a2255534420436f696e222c2276657273696f6e223a2232222c22636861696e4964223a312c22766572696679696e67436f6e7472616374223a22307841306238363939316336323138623336633164313944346132653945623063453336303665423438227d2c226d657373616765223a7b226f776e6572223a22307839383538456646443233324234303333453437643930303033443431454333344563614564613934222c227370656e646572223a22307836366139383933634330374439314439353634344145444430354430336639356531644241384166222c2276616c7565223a22313030303030303030222c226e6f6e6365223a2230222c22646561646c696e65223a2231373932333130343030227d7d",
"3 data-type": 2,
"4 chain-id": 1,
"5 derivation-path": {
"crypto-keypath (tag 304)": {
"1 components": [
44,
true,
60,
true,
0,
true,
0,
false,
0,
false
],
"2 source-fingerprint": 1942346250
}
},
"6 address": "9858effd232b4033e47d90003d41ec34ecaeda94",
"7 origin": "BitTool Wallet"
}
QR テキストと生の CBOR を表示
UR:ETH-SIGN-REQUEST/1-5/LPADAHCFAXAMCYBBGTHYTPHDNDOSADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTATAOHKAOPKKGCPJYKKJOIHJKCPFTKGCPFEGAGDEMEHEYFYJLJNHSINJTCPFTHPKGCPJTHSJNIHCPFTCPJTHSJNIHCPDWCPJYKKJOIHCPFTCPJKJYJPINJTIOCPKIDWKGCPJTHSJNIHCPFTCPKOIHJPJKINJLJTCPDWCPJYKKJOIHCPFTCPJKJYJPINJTIOCPKIDWKGCPJTHSJNIHCPFTCPIAISHSINJTGAIECPDWCPJYKKJOIHCPFTCPKPINJTJYEYECENCPKIDWKGSEJYVSDM
UR:ETH-SIGN-REQUEST/2-5/LPAOAHCFAXAMCYBBGTHYTPHDNDCPJTHSJNIHCPFTCPKOIHJPINIYKKINJTIOFXJLJTJYJPHSIAJYCPDWCPJYKKJOIHCPFTCPHSIEIEJPIHJKJKCPKIHLDWCPGDIHJPJNINJYCPFTHPKGCPJTHSJNIHCPFTCPJLKTJTIHJPCPDWCPJYKKJOIHCPFTCPHSIEIEJPIHJKJKCPKIDWKGCPJTHSJNIHCPFTCPJKJOIHJTIEIHJPCPDWCPJYKKJOIHCPFTCPHSIEIEJPIHJKJKCPKIDWKGCPJTHSJNIHCPFTCPKOHSJZKPIHCPDWCPJYKKJOIHCPFTCPKPINJTJYEYRHHYPSDY
UR:ETH-SIGN-REQUEST/3-5/LPAXAHCFAXAMCYBBGTHYTPHDNDECENCPKIDWKGCPJTHSJNIHCPFTCPJTJLJTIAIHCPDWCPJYKKJOIHCPFTCPKPINJTJYEYECENCPKIDWKGCPJTHSJNIHCPFTCPIEIHHSIEJZINJTIHCPDWCPJYKKJOIHCPFTCPKPINJTJYEYECENCPKIHLKIDWCPJOJPINJNHSJPKKGHKKJOIHCPFTCPGDIHJPJNINJYCPDWCPIEJLJNHSINJTCPFTKGCPJTHSJNIHCPFTCPGOGUFYCXFXJLINJTCPDWCPKOIHJPJKINJLJTCPFTCPEYCPDWCPIAISHSINJTGAIECPFTEHDWGSDWASGE
UR:ETH-SIGN-REQUEST/4-5/LPAAAHCFAXAMCYBBGTHYTPHDNDCPKOIHJPINIYKKINJTIOFXJLJTJYJPHSIAJYCPFTCPDYKSFPDYIDETENESESEHIAENEYEHETIDEOENIAEHIEEHESFYEEHSEYIHESFEIDDYIAFEEOENDYENIHFWEEETCPKIDWCPJNIHJKJKHSIOIHCPFTKGCPJLKTJTIHJPCPFTCPDYKSESETECETFEIYFGFYEYEOEYFWEEDYEOEOFEEEEMIEESDYDYDYEOFYEEEHFEFXEOEEFEIAHSFEIEHSESEECPDWCPJKJOIHJTIEIHJPCPFTCPDYKSENENHSESETESEOIAFXDYEMFYIDCFRFJN
UR:ETH-SIGN-REQUEST/5-5/LPAHAHCFAXAMCYBBGTHYTPHDNDESEHFYESECENEEEEFPFEFYFYDYECFYDYEOIYESECIHEHIEFWFPETFPIYCPDWCPKOHSJZKPIHCPFTCPEHDYDYDYDYDYDYDYDYCPDWCPJTJLJTIAIHCPFTCPDYCPDWCPIEIHHSIEJZINJTIHCPFTCPEHEMESEYEOEHDYEEDYDYCPKIKIAXAOAAADAHTAADDYOEADLECSDWYKCSFNYKAEYKAEWKAEWKAOCYJKSKTNBKAMGHMKHDWSZCCNDNFZEOVEKIMHAEFSFPWPEEWPPLTNMWATJTFWINJYGHJLJLJZCXHGHSJZJZIHJYAESAEMGODP
a701d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a07025902aa7b227479706573223a7b22454950373132446f6d61696e223a5b7b226e616d65223a226e616d65222c2274797065223a22737472696e67227d2c7b226e616d65223a2276657273696f6e222c2274797065223a22737472696e67227d2c7b226e616d65223a22636861696e4964222c2274797065223a2275696e74323536227d2c7b226e616d65223a22766572696679696e67436f6e7472616374222c2274797065223a2261646472657373227d5d2c225065726d6974223a5b7b226e616d65223a226f776e6572222c2274797065223a2261646472657373227d2c7b226e616d65223a227370656e646572222c2274797065223a2261646472657373227d2c7b226e616d65223a2276616c7565222c2274797065223a2275696e74323536227d2c7b226e616d65223a226e6f6e6365222c2274797065223a2275696e74323536227d2c7b226e616d65223a22646561646c696e65222c2274797065223a2275696e74323536227d5d7d2c227072696d61727954797065223a225065726d6974222c22646f6d61696e223a7b226e616d65223a2255534420436f696e222c2276657273696f6e223a2232222c22636861696e4964223a312c22766572696679696e67436f6e7472616374223a22307841306238363939316336323138623336633164313944346132653945623063453336303665423438227d2c226d657373616765223a7b226f776e6572223a22307839383538456646443233324234303333453437643930303033443431454333344563614564613934222c227370656e646572223a22307836366139383933634330374439314439353634344145444430354430336639356531644241384166222c2276616c7565223a22313030303030303030222c226e6f6e6365223a2230222c22646561646c696e65223a2231373932333130343030227d7d0302040105d90130a2018a182cf5183cf500f500f400f4021a73c5da0a06549858effd232b4033e47d90003d41ec34ecaeda94076e426974546f6f6c2057616c6c6574
レスポンス(BitTool Signer → ウォレット)
{
"request-id": {
"uuid": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a07"
},
"signature": "1f088554b0fae267470e9d0ade42bd4de30d2370964b7069a849c5208fda814e3c378e391d4054ad11cda2846fa667c99979899c282786205305ba717523ce241b"
}
QR テキストと生の CBOR を表示
UR:ETH-SIGNATURE/OEADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTATAOHDFPCTAYLPGHPFZSVOIOFLBANTBKUEFWRYGTVLBTCNJOMTGRJOINPDGASKCXMYTNLYGLFNEMMNESCAFZGHPMBYSNOELRJLOLIOSONLKKLDNSDEDILNCXGUAHRDJSKPCNTODKCWCTVYCYYA
a201d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a070258411f088554b0fae267470e9d0ade42bd4de30d2370964b7069a849c5208fda814e3c378e391d4054ad11cda2846fa667c99979899c282786205305ba717523ce241b
ウォレット側で組み立てた結果
0x1f088554b0fae267470e9d0ade42bd4de30d2370964b7069a849c5208fda814e3c378e391d4054ad11cda2846fa667c99979899c282786205305ba717523ce241b
Safe(マルチシグ)のオーナー
BitTool Signer を Safe のオーナーの 1 人として使うには、オーナーのペアリング済みアドレスから SafeTx を EIP-712(データタイプ 2)として署名します。キー 6 は Safe のアドレスではなく、オーナー のアドレスです。BitTool Signer は CALL/DELEGATECALL、MultiSend、オーナー・モジュール・ガードの変更、ガス払い戻しのパラメーターをデコードし、危険なものについてはリスクレベルを引き上げます。オーナーの署名を集めてソートし、送信するのはウォレット側の役割です。