开发者参考
EIP-712
合约和中继验证的精确类型化数据。类型字符串和哈希取自合约导出的常量,并在构建时与 TypeScript 定义核对。
类型
| 类型 | 域 | 签名方 | 链上验证 |
|---|---|---|---|
OpenPosition | exchange | 钱包或会话密钥 | 是 |
类型字符串 OpenPosition(address user,uint32 instrumentId,bool isLong,uint128 size,uint32 leverage,bool useDebt,uint256 nonce,uint64 deadline)类型哈希 0xfce2fb41f9ff0457a0f012e62cfd6a7cff4e8439ae20008ab6979c740ba5a983 | |||
Close | exchange | 钱包或会话密钥 | 是 |
类型字符串 Close(address user,uint256[] positionIds,uint256 nonce,uint64 deadline)类型哈希 0x9cc23a52214afa42e1ae53cdb2e79dc2d0cd33c33faca383ed3b149300adcb13 | |||
WithdrawToCore | exchange | 仅钱包 | 是 |
类型字符串 WithdrawToCore(address user,uint256 amount,uint256 nonce,uint64 deadline)类型哈希 0xac4ddb8d63e9d7a862c5d61ce47517623a448262414a7eef6797102104b31214 | |||
RegisterSessionKey | exchange | 仅钱包 | 是 |
类型字符串 RegisterSessionKey(address user,address key,uint64 expiry,address feeAddress,uint256 nonce,uint64 deadline)类型哈希 0xd3d9a309f635415423ab81e7e3fb16d2117cc8e1edc90506adde9eaa3855edd2 | |||
RegisterSessionKeyV2 | exchange | 仅钱包 | 是 |
类型字符串 RegisterSessionKeyV2(address user,address key,uint64 expiry,address feeAddress,uint64 maxBuilderFee,address referrer,uint256 nonce,uint64 deadline)类型哈希 0x768549c4ec62ba892ffe75fc24ce07bdbe7e6b6f0f359e49248461f08920a885 | |||
RevokeSessionKeys | exchange | 仅钱包 | 是 |
类型字符串 RevokeSessionKeys(address user,address[] keys,bool all,uint256 nonce,uint64 deadline)类型哈希 0x01026316a272dd97577cb59b037b3a0753aaf9bb1e3e933c358f48655bc6f9a0 | |||
Stake | staking | 仅钱包 | 是 |
类型字符串 Stake(address user,uint256 amount,uint256 nonce,uint64 deadline)类型哈希 0x0e9469f2731f138fe05733a3ab1961961d9def010d73419c3f5b55ae6d64e8b0 | |||
Unstake | staking | 仅钱包 | 是 |
类型字符串 Unstake(address user,uint256 amount,uint256 nonce,uint64 deadline)类型哈希 0x1ecc9b0f79f4bb74abad4adb49babe57570219b3bc83a569a9b25299f833a9ce | |||
Claim | staking | 仅钱包 | 是 |
类型字符串 Claim(address user,uint256 nonce,uint64 deadline)类型哈希 0x98df9450683706f5e3c8e5a81515893081ae7460248fbba60c7781957adc9f8f | |||
Distribute | staking | 仅钱包 | 是 |
类型字符串 Distribute(address user,uint256 nonce,uint64 deadline)类型哈希 0x23f3bc470a64f8283203a55adc575bcd5f81b7c537b6831c6886e4a0e2101e5a | |||
CancelIntent | cancel | 钱包或会话密钥 | 否(仅中继) |
类型字符串 CancelIntent(address user,bytes32 intentId,uint256 deadline)类型哈希 0xa35cd971369839445ca1bec7da15d6528a097bd9c3d0ebaf7d5d4f368f537b71 | |||
EIP-712 域: 主网 · 链 ID 999
尚未部署。部署清单生成后,这里会显示合约地址。
EIP-712 域: 测试网 · 链 ID 998
尚未部署。部署清单生成后,这里会显示合约地址。
EIP-712 域: 本地开发网 · 链 ID 31337
| 域 | 名称 | 版本 | 验证合约 | 域分隔符 |
|---|---|---|---|---|
exchange | BRAND Exchange | 1 | 0x7f15d9a4c024f5dfd02f05fdc29d878303557a7a | 0x32feb5fa802dc6038aa5b03343479b376a22e23d22111997dac15fa1c22d8234 |
staking | BRAND Staking | 1 | 0x9884648892a3863f736c7b60717601402238f7e9 | 0x50b8602ac68d63e54de8bf922c15ad7033b27cabffb2f84e65928cb93215af9d |
cancel | BRAND Intent Cancel | 1 | 0x7f15d9a4c024f5dfd02f05fdc29d878303557a7a | 0xa275f0050bf700eb0965aff68c4b08936432a7395dd933727c9eff930b8dbe1b |
签名域
所有消息由三个域签名:
- Exchange:验证合约为 Exchange 代理合约。用于交易、提现和会话密钥。SessionKeyManager 为 Exchange 验证这些签名。
- Staking:验证合约为 Staking 代理合约。用于质押、解除质押、领取和分配。
- Cancel:验证合约为 Exchange 代理合约,但名称不同。只有中继检查它,没有合约验证。
三个域都使用完整的四字段格式(name、version、chainId、verifyingContract)。两个合约都通过 ERC-5267 的 eip712Domain() 公开自己的域。
Nonce 与截止时间
Nonce 无需按顺序使用:每个账户有一个位图,nonce n 使用第 n / 256 个字中的第 n mod 256 位。任何未使用的 nonce 都可以按任意顺序使用。也可以用钱包调用 invalidateUnorderedNonces(word, mask) 在链上作废 nonce,无需签名。
客户端签署的截止时间为 1 小时 之后;中继接受最长 61 分钟 之后的截止时间。
传输格式
传输时,所有整数字段都是规范的十进制字符串,所有地址和哈希都是小写十六进制;签名以 v、r、s 与消息字段并列传输。高 s 值的签名会被拒绝。
意图 ID
中继以如下方式标识每条已签名消息:
intentId = keccak256( keccak256(utf8(intentIdTag)) ‖ digest ‖ signer )
三部分不加填充直接拼接:32 字节的标签哈希、32 字节的 EIP-712 摘要和 20 字节的恢复出的签名者(会话密钥签名的消息即为会话密钥)。各网络的标签见合约。签名字节不参与计算,因此篡改签名的可塑性无法产生新的 ID。
最后更新: