Referência para desenvolvedores
EIP-712
Os dados tipados exatos que os contratos e o relayer verificam. As strings de tipo e os hashes vêm das constantes exportadas pelos contratos e são conferidos contra as definições em TypeScript na build.
Tipos
| Tipo | Domínio | Quem assina | Verificado on-chain |
|---|---|---|---|
OpenPosition | exchange | carteira ou chave de sessão | sim |
String do tipo OpenPosition(address user,uint32 instrumentId,bool isLong,uint128 size,uint32 leverage,bool useDebt,uint256 nonce,uint64 deadline)Typehash 0xfce2fb41f9ff0457a0f012e62cfd6a7cff4e8439ae20008ab6979c740ba5a983 | |||
Close | exchange | carteira ou chave de sessão | sim |
String do tipo Close(address user,uint256[] positionIds,uint256 nonce,uint64 deadline)Typehash 0x9cc23a52214afa42e1ae53cdb2e79dc2d0cd33c33faca383ed3b149300adcb13 | |||
WithdrawToCore | exchange | só a carteira | sim |
String do tipo WithdrawToCore(address user,uint256 amount,uint256 nonce,uint64 deadline)Typehash 0xac4ddb8d63e9d7a862c5d61ce47517623a448262414a7eef6797102104b31214 | |||
RegisterSessionKey | exchange | só a carteira | sim |
String do tipo RegisterSessionKey(address user,address key,uint64 expiry,address feeAddress,uint256 nonce,uint64 deadline)Typehash 0xd3d9a309f635415423ab81e7e3fb16d2117cc8e1edc90506adde9eaa3855edd2 | |||
RegisterSessionKeyV2 | exchange | só a carteira | sim |
String do tipo RegisterSessionKeyV2(address user,address key,uint64 expiry,address feeAddress,uint64 maxBuilderFee,address referrer,uint256 nonce,uint64 deadline)Typehash 0x768549c4ec62ba892ffe75fc24ce07bdbe7e6b6f0f359e49248461f08920a885 | |||
RevokeSessionKeys | exchange | só a carteira | sim |
String do tipo RevokeSessionKeys(address user,address[] keys,bool all,uint256 nonce,uint64 deadline)Typehash 0x01026316a272dd97577cb59b037b3a0753aaf9bb1e3e933c358f48655bc6f9a0 | |||
Stake | staking | só a carteira | sim |
String do tipo Stake(address user,uint256 amount,uint256 nonce,uint64 deadline)Typehash 0x0e9469f2731f138fe05733a3ab1961961d9def010d73419c3f5b55ae6d64e8b0 | |||
Unstake | staking | só a carteira | sim |
String do tipo Unstake(address user,uint256 amount,uint256 nonce,uint64 deadline)Typehash 0x1ecc9b0f79f4bb74abad4adb49babe57570219b3bc83a569a9b25299f833a9ce | |||
Claim | staking | só a carteira | sim |
String do tipo Claim(address user,uint256 nonce,uint64 deadline)Typehash 0x98df9450683706f5e3c8e5a81515893081ae7460248fbba60c7781957adc9f8f | |||
Distribute | staking | só a carteira | sim |
String do tipo Distribute(address user,uint256 nonce,uint64 deadline)Typehash 0x23f3bc470a64f8283203a55adc575bcd5f81b7c537b6831c6886e4a0e2101e5a | |||
CancelIntent | cancel | carteira ou chave de sessão | não (só o relayer) |
String do tipo CancelIntent(address user,bytes32 intentId,uint256 deadline)Typehash 0xa35cd971369839445ca1bec7da15d6528a097bd9c3d0ebaf7d5d4f368f537b71 | |||
Domínios EIP-712: Mainnet · Chain id 999
Em breve: publicado aqui assim que os contratos forem implantados nesta rede.
Domínios
Tudo é assinado em um destes três domínios:
- Exchange: o contrato verificador é o proxy do Exchange. Trading, saques e chaves de sessão. O SessionKeyManager verifica essas assinaturas para o Exchange.
- Staking: o contrato verificador é o proxy do Staking. Entrar e sair do staking, resgatar e distribuir.
- Cancel: o contrato verificador é o proxy do Exchange, com nome próprio. Só o relayer o verifica; nenhum contrato faz isso.
Os três usam o domínio completo de quatro campos (name, version, chainId, verifyingContract). Os dois contratos expõem o domínio por eip712Domain() do ERC-5267.
Nonces e prazos
Os nonces não têm ordem: cada conta tem um bitmap, e um nonce n usa o bit n mod 256 da palavra n / 256. Qualquer nonce não usado serve, em qualquer ordem. Um nonce pode ser queimado on-chain sem assinar nada, chamando invalidateUnorderedNonces(word, mask) pela carteira.
Os clientes assinam prazos de 1 hora; o relayer aceita prazos de até 61 minutos.
Formato de transmissão
Na transmissão, todo campo inteiro é uma string decimal canônica, e todo endereço e hash vai em hexadecimal minúsculo; a assinatura viaja como v, r, s ao lado dos campos da mensagem. Assinaturas com s alto são rejeitadas.
Ids de intenção
O relayer identifica cada mensagem assinada por
intentId = keccak256( keccak256(utf8(intentIdTag)) ‖ digest ‖ signer )
empacotado sem preenchimento: o hash da tag, de 32 bytes, o digest EIP-712, de 32 bytes, e o assinante recuperado, de 20 bytes (a chave de sessão, nas mensagens assinadas por ela). A tag de cada rede está listada em endereços dos contratos. Os bytes da assinatura não fazem parte do id, então uma assinatura alterada por maleabilidade não consegue produzir um id novo.