Перейти к содержимому

    Нажмите /, чтобы искать, и [ или ], чтобы перейти к предыдущей или следующей странице.

    Справочник для разработчиков

    EIP-712

    Точные типизированные данные, которые проверяют контракты и релейер. Строки типов и хеши берутся из экспортируемых констант контрактов и при сборке сверяются с определениями на TypeScript.

    Типы

    ТипДоменКто подписываетПроверка в блокчейне
    OpenPositionexchangeкошелёк или сеансовый ключда
    Строка типа OpenPosition(address user,uint32 instrumentId,bool isLong,uint128 size,uint32 leverage,bool useDebt,uint256 nonce,uint64 deadline)
    Typehash 0xfce2fb41f9ff0457a0f012e62cfd6a7cff4e8439ae20008ab6979c740ba5a983
    Closeexchangeкошелёк или сеансовый ключда
    Строка типа Close(address user,uint256[] positionIds,uint256 nonce,uint64 deadline)
    Typehash 0x9cc23a52214afa42e1ae53cdb2e79dc2d0cd33c33faca383ed3b149300adcb13
    WithdrawToCoreexchangeтолько кошелёкда
    Строка типа WithdrawToCore(address user,uint256 amount,uint256 nonce,uint64 deadline)
    Typehash 0xac4ddb8d63e9d7a862c5d61ce47517623a448262414a7eef6797102104b31214
    RegisterSessionKeyexchangeтолько кошелёкда
    Строка типа RegisterSessionKey(address user,address key,uint64 expiry,address feeAddress,uint256 nonce,uint64 deadline)
    Typehash 0xd3d9a309f635415423ab81e7e3fb16d2117cc8e1edc90506adde9eaa3855edd2
    RegisterSessionKeyV2exchangeтолько кошелёкда
    Строка типа RegisterSessionKeyV2(address user,address key,uint64 expiry,address feeAddress,uint64 maxBuilderFee,address referrer,uint256 nonce,uint64 deadline)
    Typehash 0x768549c4ec62ba892ffe75fc24ce07bdbe7e6b6f0f359e49248461f08920a885
    RevokeSessionKeysexchangeтолько кошелёкда
    Строка типа RevokeSessionKeys(address user,address[] keys,bool all,uint256 nonce,uint64 deadline)
    Typehash 0x01026316a272dd97577cb59b037b3a0753aaf9bb1e3e933c358f48655bc6f9a0
    Stakestakingтолько кошелёкда
    Строка типа Stake(address user,uint256 amount,uint256 nonce,uint64 deadline)
    Typehash 0x0e9469f2731f138fe05733a3ab1961961d9def010d73419c3f5b55ae6d64e8b0
    Unstakestakingтолько кошелёкда
    Строка типа Unstake(address user,uint256 amount,uint256 nonce,uint64 deadline)
    Typehash 0x1ecc9b0f79f4bb74abad4adb49babe57570219b3bc83a569a9b25299f833a9ce
    Claimstakingтолько кошелёкда
    Строка типа Claim(address user,uint256 nonce,uint64 deadline)
    Typehash 0x98df9450683706f5e3c8e5a81515893081ae7460248fbba60c7781957adc9f8f
    Distributestakingтолько кошелёкда
    Строка типа Distribute(address user,uint256 nonce,uint64 deadline)
    Typehash 0x23f3bc470a64f8283203a55adc575bcd5f81b7c537b6831c6886e4a0e2101e5a
    CancelIntentcancelкошелёк или сеансовый ключнет (только релейер)
    Строка типа 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.

    Обновлено: