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를 포함한 서명되지 않은 legacy 트랜잭션 RLP: rlp([nonce, gasPrice, gas, to, value, data, chainId, 0, 0]) | legacy 가스를 사용하는 체인의 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 트랜잭션(type 3), EIP-7702 트랜잭션(type 4), 체인 ID가 없는 비보호 legacy 트랜잭션, 원시 32바이트 해시에 대한 eth_sign은 지원하지 않습니다. 다른 체인 ID에 대한 요청은 거부됩니다.
EIP-712 규칙
BitTool Signer는 타입 데이터를 선언된 그대로 해시하며 값에 엄격합니다. 화면에는 한 가지로 보이면서 해시는 다르게 계산되는 값은 전형적인 피싱 수법이기 때문입니다.
bool값은 문자열이 아닌 JSONtrue/false여야 합니다.- 정수는 253 − 1까지만 JSON 숫자로 쓸 수 있습니다. 그보다 큰 값은 앞자리 0이 없는 10진수 문자열이나
0x16진수 문자열이어야 합니다. address값은0x+ 16진수 40자리이며, 대소문자가 섞인 주소는 유효한 EIP-55 체크섬을 가져야 합니다.bytesN은 정확히 N바이트여야 합니다.message에는 타입에 선언된 필드만 정확히 있어야 합니다. 누락된 필드도, 추가 필드도 허용되지 않습니다.EIP712Domain에는name,version,chainId,verifyingContract,salt만 넣을 수 있으며, 도메인 구분자(domain separator)에는 선언된 순서가 사용됩니다.
잘 알려진 구조는 완전히 해석해 검토 화면에 보여 줍니다: ERC-2612 / DAI Permit, Permit2(single, batch, transfer-from), Safe SafeTx, NFT 마켓플레이스 주문(Seaport, LooksRare, Blur). 그 밖의 구조는 필드별로 보여 주고 부분 해석(partially decoded)으로 표시합니다.
개인 메시지
1바이트부터 8,192바이트까지의 임의 바이트입니다. 유효한 UTF-8은 텍스트로 보여 주고, 그 밖의 데이터는 hex로 보여 주며 해석 불가(opaque)로 표시합니다. 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 legacy 트랜잭션 | chainId × 2 + 35 + yParity (EIP-155), 빅엔디언, 필요한 최소 바이트 수 | 65바이트 이상 |
4 타입 트랜잭션 | yParity (0 또는 1) | 65 |
2, 3 메시지 | 27 + yParity | 65 |
따라서 v는 64번째 바이트부터 끝까지를 부호 없는 빅엔디언 정수로 읽어야 합니다. 예를 들어 Avalanche(체인 ID 43114)에서 legacy v는 86263 또는 86264로 3바이트이며, 서명 길이는 67바이트입니다. 항상 64번째 바이트만 v로 읽는 코드는 체인 ID가 110 이상인 체인에서 동작하지 않습니다.
마무리 단계:
- 요청 ID를 확인합니다.
- 예상한 다이제스트(트랜잭션 해시, EIP-191 해시 또는 EIP-712 해시)에서 서명자를 복구해 페어링된 주소와 비교합니다.
- 트랜잭션이라면 서명되지 않은 트랜잭션에
r,s, parity를 넣어 직렬화하고, 브로드캐스트하기 전에 트랜잭션 해시를 확인합니다.
코드
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 전송
- Legacy (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으로 보냅니다. 토큰 컨트랙트로 보내는 type-2 트랜잭션이며, calldata는 transfer(address,uint256)입니다.
요청 (내 지갑 → 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
체인 ID 56에서 legacy(type 0) EIP-155 트랜잭션으로 0.05 BNB를 보냅니다. 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의 legacy 트랜잭션입니다. 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의 소유자 중 하나로 사용하려면, 소유자의 페어링된 주소에서 SafeTx를 EIP-712(데이터 타입 2)로 서명하세요. 키 6에는 Safe의 주소가 아니라 소유자의 주소를 넣습니다. BitTool Signer는 CALL/DELEGATECALL, MultiSend, 소유자/모듈/가드 변경, 가스 환급 파라미터를 해석하며, 위험한 항목은 위험 수준을 높여 표시합니다. 소유자 서명을 수집하고 정렬해 제출하는 일은 지갑이 담당합니다.