Справочник для разработчиков
EIP-712
Точные типизированные данные, которые проверяют контракты и релейер. Строки типов и хеши берутся из экспортируемых констант контрактов и при сборке сверяются с определениями на TypeScript.
Типы
| Тип | Домен | Кто подписывает | Проверка в блокчейне |
|---|---|---|---|
OpenPosition | exchange | кошелёк или сеансовый ключ | да |
Строка типа OpenPosition(address user,uint32 instrumentId,bool isLong,uint128 size,uint32 leverage,bool useDebt,uint256 nonce,uint64 deadline)Typehash 0xfce2fb41f9ff0457a0f012e62cfd6a7cff4e8439ae20008ab6979c740ba5a983 | |||
Close | exchange | кошелёк или сеансовый ключ | да |
Строка типа Close(address user,uint256[] positionIds,uint256 nonce,uint64 deadline)Typehash 0x9cc23a52214afa42e1ae53cdb2e79dc2d0cd33c33faca383ed3b149300adcb13 | |||
WithdrawToCore | exchange | только кошелёк | да |
Строка типа WithdrawToCore(address user,uint256 amount,uint256 nonce,uint64 deadline)Typehash 0xac4ddb8d63e9d7a862c5d61ce47517623a448262414a7eef6797102104b31214 | |||
RegisterSessionKey | exchange | только кошелёк | да |
Строка типа RegisterSessionKey(address user,address key,uint64 expiry,address feeAddress,uint256 nonce,uint64 deadline)Typehash 0xd3d9a309f635415423ab81e7e3fb16d2117cc8e1edc90506adde9eaa3855edd2 | |||
RegisterSessionKeyV2 | exchange | только кошелёк | да |
Строка типа RegisterSessionKeyV2(address user,address key,uint64 expiry,address feeAddress,uint64 maxBuilderFee,address referrer,uint256 nonce,uint64 deadline)Typehash 0x768549c4ec62ba892ffe75fc24ce07bdbe7e6b6f0f359e49248461f08920a885 | |||
RevokeSessionKeys | exchange | только кошелёк | да |
Строка типа RevokeSessionKeys(address user,address[] keys,bool all,uint256 nonce,uint64 deadline)Typehash 0x01026316a272dd97577cb59b037b3a0753aaf9bb1e3e933c358f48655bc6f9a0 | |||
Stake | staking | только кошелёк | да |
Строка типа Stake(address user,uint256 amount,uint256 nonce,uint64 deadline)Typehash 0x0e9469f2731f138fe05733a3ab1961961d9def010d73419c3f5b55ae6d64e8b0 | |||
Unstake | staking | только кошелёк | да |
Строка типа Unstake(address user,uint256 amount,uint256 nonce,uint64 deadline)Typehash 0x1ecc9b0f79f4bb74abad4adb49babe57570219b3bc83a569a9b25299f833a9ce | |||
Claim | staking | только кошелёк | да |
Строка типа Claim(address user,uint256 nonce,uint64 deadline)Typehash 0x98df9450683706f5e3c8e5a81515893081ae7460248fbba60c7781957adc9f8f | |||
Distribute | staking | только кошелёк | да |
Строка типа Distribute(address user,uint256 nonce,uint64 deadline)Typehash 0x23f3bc470a64f8283203a55adc575bcd5f81b7c537b6831c6886e4a0e2101e5a | |||
CancelIntent | cancel | кошелёк или сеансовый ключ | нет (только релейер) |
Строка типа CancelIntent(address user,bytes32 intentId,uint256 deadline)Typehash 0xa35cd971369839445ca1bec7da15d6528a097bd9c3d0ebaf7d5d4f368f537b71 | |||
Домены EIP-712: Основная сеть · Chain id 999
Скоро: появится здесь, когда контракты будут развёрнуты в этой сети.
Домены
Все подписи делаются в трёх доменах:
- Exchange — проверяющий контракт: прокси Exchange. Торговля, выводы и сеансовые ключи. Эти подписи для Exchange проверяет SessionKeyManager.
- Staking — проверяющий контракт: прокси Staking. Стейкинг, вывод из стейкинга, получение наград и распределение.
- Cancel — проверяющий контракт: прокси Exchange, но со своим именем. Его проверяет только релейер, ни один контракт этого не делает.
Все три используют полный домен из четырёх полей (name, version, chainId, verifyingContract). Оба контракта отдают свой домен через eip712Domain() из ERC-5267.
Nonce и сроки
Nonce неупорядоченные: у каждого аккаунта есть битовая карта, и nonce n использует бит n mod 256 слова n / 256. Подходит любой неиспользованный nonce, в любом порядке. Nonce можно сжечь ончейн, ничего не подписывая, вызвав invalidateUnorderedNonces(word, mask) из кошелька.
Клиенты подписывают срок на 1 час вперёд; релейер принимает сроки до 61 минута вперёд.
Формат передачи
При передаче каждое целочисленное поле — каноническая десятичная строка, а каждый адрес и хеш — шестнадцатеричная строка в нижнем регистре; подпись передаётся как v, r, s рядом с полями сообщения. Подписи с высоким s отклоняются.
Id интентов
Релейер идентифицирует каждое подписанное сообщение по значению
intentId = keccak256( keccak256(utf8(intentIdTag)) ‖ digest ‖ signer )
Упаковка без выравнивания: 32-байтный хеш тега, 32-байтный дайджест EIP-712 и 20-байтный восстановленный подписант (для сообщений, подписанных сеансовым ключом, — сам сеансовый ключ). Тег каждой сети указан на странице Адреса контрактов. Байты подписи в id не входят, поэтому подпись, изменённая за счёт пластичности, не может дать новый id.