Referencia para desarrolladores
EIP-712
Los datos tipados exactos que verifican los contratos y el relayer. Las cadenas de tipo y los hashes salen de las constantes que exportan los contratos y se comparan con las definiciones de TypeScript al compilar.
Tipos
| Tipo | Dominio | Quién firma | Verificado on-chain |
|---|---|---|---|
OpenPosition | exchange | billetera o clave de sesión | sí |
Cadena del tipo OpenPosition(address user,uint32 instrumentId,bool isLong,uint128 size,uint32 leverage,bool useDebt,uint256 nonce,uint64 deadline)Typehash 0xfce2fb41f9ff0457a0f012e62cfd6a7cff4e8439ae20008ab6979c740ba5a983 | |||
Close | exchange | billetera o clave de sesión | sí |
Cadena del tipo Close(address user,uint256[] positionIds,uint256 nonce,uint64 deadline)Typehash 0x9cc23a52214afa42e1ae53cdb2e79dc2d0cd33c33faca383ed3b149300adcb13 | |||
WithdrawToCore | exchange | solo la billetera | sí |
Cadena del tipo WithdrawToCore(address user,uint256 amount,uint256 nonce,uint64 deadline)Typehash 0xac4ddb8d63e9d7a862c5d61ce47517623a448262414a7eef6797102104b31214 | |||
RegisterSessionKey | exchange | solo la billetera | sí |
Cadena del tipo RegisterSessionKey(address user,address key,uint64 expiry,address feeAddress,uint256 nonce,uint64 deadline)Typehash 0xd3d9a309f635415423ab81e7e3fb16d2117cc8e1edc90506adde9eaa3855edd2 | |||
RegisterSessionKeyV2 | exchange | solo la billetera | sí |
Cadena del tipo RegisterSessionKeyV2(address user,address key,uint64 expiry,address feeAddress,uint64 maxBuilderFee,address referrer,uint256 nonce,uint64 deadline)Typehash 0x768549c4ec62ba892ffe75fc24ce07bdbe7e6b6f0f359e49248461f08920a885 | |||
RevokeSessionKeys | exchange | solo la billetera | sí |
Cadena del tipo RevokeSessionKeys(address user,address[] keys,bool all,uint256 nonce,uint64 deadline)Typehash 0x01026316a272dd97577cb59b037b3a0753aaf9bb1e3e933c358f48655bc6f9a0 | |||
Stake | staking | solo la billetera | sí |
Cadena del tipo Stake(address user,uint256 amount,uint256 nonce,uint64 deadline)Typehash 0x0e9469f2731f138fe05733a3ab1961961d9def010d73419c3f5b55ae6d64e8b0 | |||
Unstake | staking | solo la billetera | sí |
Cadena del tipo Unstake(address user,uint256 amount,uint256 nonce,uint64 deadline)Typehash 0x1ecc9b0f79f4bb74abad4adb49babe57570219b3bc83a569a9b25299f833a9ce | |||
Claim | staking | solo la billetera | sí |
Cadena del tipo Claim(address user,uint256 nonce,uint64 deadline)Typehash 0x98df9450683706f5e3c8e5a81515893081ae7460248fbba60c7781957adc9f8f | |||
Distribute | staking | solo la billetera | sí |
Cadena del tipo Distribute(address user,uint256 nonce,uint64 deadline)Typehash 0x23f3bc470a64f8283203a55adc575bcd5f81b7c537b6831c6886e4a0e2101e5a | |||
CancelIntent | cancel | billetera o clave de sesión | no (solo el relayer) |
Cadena del tipo CancelIntent(address user,bytes32 intentId,uint256 deadline)Typehash 0xa35cd971369839445ca1bec7da15d6528a097bd9c3d0ebaf7d5d4f368f537b71 | |||
Dominios EIP-712: Mainnet · Chain id 999
Próximamente: se publicará aquí cuando los contratos estén desplegados en esta red.
Dominios
Todo se firma en uno de estos tres dominios:
- Exchange: el contrato verificador es el proxy del Exchange. Trading, retiros y claves de sesión. El SessionKeyManager verifica estas firmas para el Exchange.
- Staking: el contrato verificador es el proxy de Staking. Staking, retiro del staking, cobro y distribución.
- Cancel: el contrato verificador es el proxy del Exchange, con un nombre propio. Solo lo comprueba el relayer; ningún contrato lo hace.
Los tres usan el dominio completo de cuatro campos (name, version, chainId, verifyingContract). Ambos contratos exponen su dominio mediante eip712Domain() de ERC-5267.
Nonces y plazos
Los nonces no tienen orden: cada cuenta tiene un mapa de bits, y un nonce n usa el bit n mod 256 de la palabra n / 256. Cualquier nonce sin usar sirve, en cualquier orden. Se puede quemar un nonce on-chain sin firmar nada llamando a invalidateUnorderedNonces(word, mask) desde la billetera.
Los clientes firman plazos de 1 hora; el relayer acepta plazos de hasta 61 minutos.
Formato de transmisión
En la transmisión, cada campo entero es una cadena decimal canónica y cada dirección y hash va en hexadecimal en minúsculas; la firma viaja como v, r, s junto a los campos del mensaje. Se rechazan las firmas con s alto.
Ids de intención
El relayer identifica cada mensaje firmado con
intentId = keccak256( keccak256(utf8(intentIdTag)) ‖ digest ‖ signer )
empaquetado sin relleno: el hash de la etiqueta, de 32 bytes, el digest EIP-712, de 32 bytes, y el firmante recuperado, de 20 bytes (la clave de sesión, en los mensajes firmados con ella). La etiqueta de cada red figura en direcciones de los contratos. Los bytes de la firma no forman parte del id, así que una firma alterada por maleabilidad no puede producir un id nuevo.