Skip to content

solidity: Add sapphire-localnet tests - #95

Merged
matevz merged 3 commits into
masterfrom
matevz/feature/sapphire-localnet-tests
May 13, 2026
Merged

solidity: Add sapphire-localnet tests#95
matevz merged 3 commits into
masterfrom
matevz/feature/sapphire-localnet-tests

Conversation

@matevz

@matevz matevz commented Mar 16, 2026

Copy link
Copy Markdown
Member

This PR:

  • integrates sapphire-localnet into solidity smart contract tests beside the built-in hardhat network
  • correctly uses mocked authToken for all smart contract calls that require authentication
  • uses sapphire-wrapper for encrypted end-to-end transactions and calls
  • uses unwrapped client for deploying the contract
  • correctly waits for every transaction to finish before proceeding
  • bumps @oasisprotocol/sapphire-hardhat to 2.22.3 to speed up tests
  • removes helpers for fetching historic blocks and receipts live from base sepolia RPC now that the new deposit code has been

@matevz
matevz changed the base branch from master to ptrus/feature/jwt-auth March 16, 2026 12:32
@ptrus
ptrus force-pushed the ptrus/feature/jwt-auth branch 3 times, most recently from 38a7928 to 55ea115 Compare March 17, 2026 10:02
@matevz matevz self-assigned this Mar 17, 2026
@ptrus
ptrus force-pushed the ptrus/feature/jwt-auth branch 3 times, most recently from 82167a8 to 4a3b5b3 Compare March 17, 2026 14:51
@ptrus
ptrus force-pushed the ptrus/feature/jwt-auth branch from 4a3b5b3 to 3f09d88 Compare March 18, 2026 22:37
Base automatically changed from ptrus/feature/jwt-auth to master March 18, 2026 22:39
@matevz
matevz force-pushed the matevz/feature/sapphire-localnet-tests branch from f5e2a13 to 41d4389 Compare March 19, 2026 10:09
@matevz

matevz commented Mar 19, 2026

Copy link
Copy Markdown
Member Author

Getting failed test during UUPS proxy deployment here: https://github.com/oasisprotocol/accounting-module/blob/65b46afad4d83672cb0cc59adc7225647cfb1e30/solidity/test/Accounting.E2E.ts#L112

Symptoms:

  • running on latest sapphire-localnet fails for the first time
  • rerunning the test works
  • running tests on hardhat localnet or emerald-localnet works for the first time
  • enabling/disabling sapphire-paratime ts wrapper doesn't make a change

Workaround:

  • repeat deploying UUPS by proxy until it succeeds
Details
  1) Accounting
       "before all" hook for "Should expose createLockNonces, modifyLockNonces, transferLockedNonces":
     Error: The deployment clashes with an existing one at 0xc9ef83ab1C0D47A585Ec8a3cb3C7C93AABC98659.

Deployments: {
  "existing": {
    "address": "0xc9ef83ab1C0D47A585Ec8a3cb3C7C93AABC98659",
    "txHash": "0x7d5fcb725eaba36a2314f281464e4f13585d9fc61e58683eec28a0cf34fc962a",
    "layout": {
      "solcVersion": "0.8.24",
      "storage": [
        {
          "label": "usedSignatures",
          "offset": 0,
          "slot": "0",
          "type": "t_mapping(t_bytes_memory_ptr,t_bool)",
          "contract": "EIP712SignatureVerifier",
          "src": "contracts/EIP712SignatureVerifier.sol:36"
        },
        {
          "label": "withdrawalNonces",
          "offset": 0,
          "slot": "1",
          "type": "t_mapping(t_address,t_uint256)",
          "contract": "EIP712SignatureVerifier",
          "src": "contracts/EIP712SignatureVerifier.sol:39"
        },
        {
          "label": "transferNonces",
          "offset": 0,
          "slot": "2",
          "type": "t_mapping(t_address,t_uint256)",
          "contract": "EIP712SignatureVerifier",
          "src": "contracts/EIP712SignatureVerifier.sol:42"
        },
        {
          "label": "__gap",
          "offset": 0,
          "slot": "3",
          "type": "t_array(t_uint256)47_storage",
          "contract": "EIP712SignatureVerifier",
          "src": "contracts/EIP712SignatureVerifier.sol:272"
        },
        {
          "label": "evmAddress",
          "offset": 0,
          "slot": "50",
          "type": "t_address",
          "contract": "EVMSignerAndVerifier",
          "src": "contracts/EVMSignerAndVerifier.sol:31"
        },
        {
          "label": "secretKey",
          "offset": 0,
          "slot": "51",
          "type": "t_bytes32",
          "contract": "EVMSignerAndVerifier",
          "src": "contracts/EVMSignerAndVerifier.sol:32"
        },
        {
          "label": "shoyuBashi",
          "offset": 0,
          "slot": "52",
          "type": "t_contract(IShoyuBashi)15279",
          "contract": "EVMSignerAndVerifier",
          "src": "contracts/EVMSignerAndVerifier.sol:33"
        },
        {
          "label": "provethVerifier",
          "offset": 0,
          "slot": "53",
          "type": "t_contract(IProvethVerifier)15196",
          "contract": "EVMSignerAndVerifier",
          "src": "contracts/EVMSignerAndVerifier.sol:34"
        },
        {
          "label": "nonces",
          "offset": 0,
          "slot": "54",
          "type": "t_mapping(t_uint256,t_uint64)",
          "contract": "EVMSignerAndVerifier",
          "src": "contracts/EVMSignerAndVerifier.sol:36"
        },
        {
          "label": "gasPrices",
          "offset": 0,
          "slot": "55",
          "type": "t_mapping(t_uint256,t_uint256)",
          "contract": "EVMSignerAndVerifier",
          "src": "contracts/EVMSignerAndVerifier.sol:37"
        },
        {
          "label": "__gap",
          "offset": 0,
          "slot": "56",
          "type": "t_array(t_uint256)44_storage",
          "contract": "EVMSignerAndVerifier",
          "src": "contracts/EVMSignerAndVerifier.sol:700"
        },
        {
          "label": "balances",
          "offset": 0,
          "slot": "100",
          "type": "t_mapping(t_address,t_mapping(t_bytes32,t_uint256))",
          "contract": "Accounting",
          "src": "contracts/Accounting.sol:31"
        },
        {
          "label": "tokens",
          "offset": 0,
          "slot": "101",
          "type": "t_mapping(t_bytes32,t_struct(TokenInfo)14762_storage)",
          "contract": "Accounting",
          "src": "contracts/Accounting.sol:33"
        },
        {
          "label": "processedDeposits",
          "offset": 0,
          "slot": "102",
          "type": "t_mapping(t_bytes32,t_bool)",
          "contract": "Accounting",
          "src": "contracts/Accounting.sol:34"
        },
        {
          "label": "userInfo",
          "offset": 0,
          "slot": "103",
          "type": "t_mapping(t_address,t_struct(UserInfo)14767_storage)",
          "contract": "Accounting",
          "src": "contracts/Accounting.sol:35"
        },
        {
          "label": "withdrawals",
          "offset": 0,
          "slot": "104",
          "type": "t_array(t_struct(WithdrawalRequest)11480_storage)dyn_storage",
          "contract": "Accounting",
          "src": "contracts/Accounting.sol:37"
        },
        {
          "label": "nextLockId",
          "offset": 0,
          "slot": "105",
          "type": "t_uint256",
          "contract": "Accounting",
          "src": "contracts/Accounting.sol:39"
        },
        {
          "label": "__gap",
          "offset": 0,
          "slot": "106",
          "type": "t_array(t_uint256)44_storage",
          "contract": "Accounting",
          "src": "contracts/Accounting.sol:837"
        }
      ],
      "types": {
        "t_address": {
          "label": "address",
          "numberOfBytes": "20"
        },
        "t_bool": {
          "label": "bool",
          "numberOfBytes": "1"
        },
        "t_bytes32": {
          "label": "bytes32",
          "numberOfBytes": "32"
        },
        "t_string_storage": {
          "label": "string",
          "numberOfBytes": "32"
        },
        "t_struct(EIP712Storage)1204_storage": {
          "label": "struct EIP712Upgradeable.EIP712Storage",
          "members": [
            {
              "label": "_hashedName",
              "type": "t_bytes32",
              "offset": 0,
              "slot": "0"
            },
            {
              "label": "_hashedVersion",
              "type": "t_bytes32",
              "offset": 0,
              "slot": "1"
            },
            {
              "label": "_name",
              "type": "t_string_storage",
              "offset": 0,
              "slot": "2"
            },
            {
              "label": "_version",
              "type": "t_string_storage",
              "offset": 0,
              "slot": "3"
            }
          ],
          "numberOfBytes": "128"
        },
        "t_struct(InitializableStorage)1040_storage": {
          "label": "struct Initializable.InitializableStorage",
          "members": [
            {
              "label": "_initialized",
              "type": "t_uint64",
              "offset": 0,
              "slot": "0"
            },
            {
              "label": "_initializing",
              "type": "t_bool",
              "offset": 8,
              "slot": "0"
            }
          ],
          "numberOfBytes": "32"
        },
        "t_struct(OwnableStorage)980_storage": {
          "label": "struct OwnableUpgradeable.OwnableStorage",
          "members": [
            {
              "label": "_owner",
              "type": "t_address",
              "offset": 0,
              "slot": "0"
            }
          ],
          "numberOfBytes": "32"
        },
        "t_uint64": {
          "label": "uint64",
          "numberOfBytes": "8"
        },
        "t_array(t_struct(FundLock)14778_storage)dyn_storage": {
          "label": "struct FundLock[]",
          "numberOfBytes": "32"
        },
        "t_array(t_struct(WithdrawalRequest)11480_storage)dyn_storage": {
          "label": "struct Accounting.WithdrawalRequest[]",
          "numberOfBytes": "32"
        },
        "t_array(t_uint256)44_storage": {
          "label": "uint256[44]",
          "numberOfBytes": "1408"
        },
        "t_array(t_uint256)47_storage": {
          "label": "uint256[47]",
          "numberOfBytes": "1504"
        },
        "t_bytes_memory_ptr": {
          "label": "bytes",
          "numberOfBytes": "32"
        },
        "t_bytes_storage": {
          "label": "bytes",
          "numberOfBytes": "32"
        },
        "t_contract(IProvethVerifier)15196": {
          "label": "contract IProvethVerifier",
          "numberOfBytes": "20"
        },
        "t_contract(IShoyuBashi)15279": {
          "label": "contract IShoyuBashi",
          "numberOfBytes": "20"
        },
        "t_enum(TokenType)14756": {
          "label": "enum TokenType",
          "members": [
            "NativeEVM",
            "ERC20"
          ],
          "numberOfBytes": "1"
        },
        "t_mapping(t_address,t_mapping(t_bytes32,t_uint256))": {
          "label": "mapping(address => mapping(bytes32 => uint256))",
          "numberOfBytes": "32"
        },
        "t_mapping(t_address,t_struct(UserInfo)14767_storage)": {
          "label": "mapping(address => struct UserInfo)",
          "numberOfBytes": "32"
        },
        "t_mapping(t_address,t_uint256)": {
          "label": "mapping(address => uint256)",
          "numberOfBytes": "32"
        },
        "t_mapping(t_bytes32,t_bool)": {
          "label": "mapping(bytes32 => bool)",
          "numberOfBytes": "32"
        },
        "t_mapping(t_bytes32,t_struct(TokenInfo)14762_storage)": {
          "label": "mapping(bytes32 => struct TokenInfo)",
          "numberOfBytes": "32"
        },
        "t_mapping(t_bytes32,t_uint256)": {
          "label": "mapping(bytes32 => uint256)",
          "numberOfBytes": "32"
        },
        "t_mapping(t_bytes_memory_ptr,t_bool)": {
          "label": "mapping(bytes => bool)",
          "numberOfBytes": "32"
        },
        "t_mapping(t_uint256,t_uint256)": {
          "label": "mapping(uint256 => uint256)",
          "numberOfBytes": "32"
        },
        "t_mapping(t_uint256,t_uint64)": {
          "label": "mapping(uint256 => uint64)",
          "numberOfBytes": "32"
        },
        "t_struct(FundLock)14778_storage": {
          "label": "struct FundLock",
          "members": [
            {
              "label": "lockId",
              "type": "t_uint256",
              "offset": 0,
              "slot": "0"
            },
            {
              "label": "serviceId",
              "type": "t_address",
              "offset": 0,
              "slot": "1"
            },
            {
              "label": "tokenId",
              "type": "t_bytes32",
              "offset": 0,
              "slot": "2"
            },
            {
              "label": "amount",
              "type": "t_uint256",
              "offset": 0,
              "slot": "3"
            },
            {
              "label": "expiry",
              "type": "t_uint256",
              "offset": 0,
              "slot": "4"
            }
          ],
          "numberOfBytes": "160"
        },
        "t_struct(TokenInfo)14762_storage": {
          "label": "struct TokenInfo",
          "members": [
            {
              "label": "tokenType",
              "type": "t_enum(TokenType)14756",
              "offset": 0,
              "slot": "0"
            },
            {
              "label": "data",
              "type": "t_bytes_storage",
              "offset": 0,
              "slot": "1"
            }
          ],
          "numberOfBytes": "64"
        },
        "t_struct(UserInfo)14767_storage": {
          "label": "struct UserInfo",
          "members": [
            {
              "label": "activeLocks",
              "type": "t_array(t_struct(FundLock)14778_storage)dyn_storage",
              "offset": 0,
              "slot": "0"
            }
          ],
          "numberOfBytes": "32"
        },
        "t_struct(WithdrawalRequest)11480_storage": {
          "label": "struct Accounting.WithdrawalRequest",
          "members": [
            {
              "label": "userAddress",
              "type": "t_address",
              "offset": 0,
              "slot": "0"
            },
            {
              "label": "amount",
              "type": "t_uint256",
              "offset": 0,
              "slot": "1"
            },
            {
              "label": "blockNumber",
              "type": "t_uint256",
              "offset": 0,
              "slot": "2"
            },
            {
              "label": "tokenId",
              "type": "t_bytes32",
              "offset": 0,
              "slot": "3"
            },
            {
              "label": "resolved",
              "type": "t_bool",
              "offset": 0,
              "slot": "4"
            },
            {
              "label": "txIdentifier",
              "type": "t_bytes_storage",
              "offset": 0,
              "slot": "5"
            }
          ],
          "numberOfBytes": "192"
        },
        "t_uint256": {
          "label": "uint256",
          "numberOfBytes": "32"
        }
      },
      "namespaces": {
        "erc7201:openzeppelin.storage.Ownable": [
          {
            "contract": "OwnableUpgradeable",
            "label": "_owner",
            "type": "t_address",
            "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:24",
            "offset": 0,
            "slot": "0"
          }
        ],
        "erc7201:openzeppelin.storage.EIP712": [
          {
            "contract": "EIP712Upgradeable",
            "label": "_hashedName",
            "type": "t_bytes32",
            "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:38",
            "offset": 0,
            "slot": "0"
          },
          {
            "contract": "EIP712Upgradeable",
            "label": "_hashedVersion",
            "type": "t_bytes32",
            "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:40",
            "offset": 0,
            "slot": "1"
          },
          {
            "contract": "EIP712Upgradeable",
            "label": "_name",
            "type": "t_string_storage",
            "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:42",
            "offset": 0,
            "slot": "2"
          },
          {
            "contract": "EIP712Upgradeable",
            "label": "_version",
            "type": "t_string_storage",
            "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:43",
            "offset": 0,
            "slot": "3"
          }
        ],
        "erc7201:openzeppelin.storage.Initializable": [
          {
            "contract": "Initializable",
            "label": "_initialized",
            "type": "t_uint64",
            "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
            "offset": 0,
            "slot": "0"
          },
          {
            "contract": "Initializable",
            "label": "_initializing",
            "type": "t_bool",
            "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
            "offset": 8,
            "slot": "0"
          }
        ]
      }
    }
  },
  "updated": {
    "abi": [
      "constructor(address)",
      "error AddressEmptyCode(address)",
      "error AddressMismatch()",
      "error ChainIdMismatch()",
      "error DER_Split_Error()",
      "error DepositAlreadyProcessed()",
      "error ECDSAInvalidSignature()",
      "error ECDSAInvalidSignatureLength(uint256)",
      "error ECDSAInvalidSignatureS(bytes32)",
      "error ERC1967InvalidImplementation(address)",
      "error ERC1967NonPayable()",
      "error FailedCall()",
      "error GasPriceNotSet(uint256)",
      "error InsufficientBalance()",
      "error InsufficientLockedAmount()",
      "error InvalidAddress()",
      "error InvalidAmount()",
      "error InvalidBlockHash()",
      "error InvalidDeposit()",
      "error InvalidERC20TokenDataLength()",
      "error InvalidExpiry()",
      "error InvalidGasPrice()",
      "error InvalidInitialization()",
      "error InvalidLockId()",
      "error InvalidNativeTokenDataLength()",
      "error InvalidNonce()",
      "error InvalidSignature()",
      "error InvalidSiweAuth()",
      "error InvalidSliceRange()",
      "error InvalidTransactionData()",
      "error InvalidTransferSelector()",
      "error InvalidTxDataLength()",
      "error LockNotExpired()",
      "error NotInitializing()",
      "error OwnableInvalidOwner(address)",
      "error OwnableUnauthorizedAccount(address)",
      "error ReceiptIndexMismatch()",
      "error SliceOutOfBounds()",
      "error TooManyActiveLocks()",
      "error UUPSUnauthorizedCallContext()",
      "error UUPSUnsupportedProxiableUUID(bytes32)",
      "error Unauthorized()",
      "error UnknownTransactionType()",
      "error UnsupportedTokenType()",
      "error WithdrawalTooSoon()",
      "error recoverV_Error()",
      "event Deposit(address indexed,bytes32 indexed,uint256)",
      "event EIP712DomainChanged()",
      "event GasPriceSet(uint256 indexed,uint256)",
      "event Initialized(uint64)",
      "event OwnershipTransferred(address indexed,address indexed)",
      "event TokenRegistered(bytes32 indexed,uint8)",
      "event Upgraded(address indexed)",
      "event Withdrawal(address indexed,bytes32 indexed,uint256,uint256)",
      "event WithdrawalResolved(uint256 indexed,address indexed,bytes32 indexed,uint256,uint256)",
      "function UPGRADE_INTERFACE_VERSION() view returns (string)",
      "function balanceOf(address,bytes32,bytes) view returns (uint256)",
      "function createLock(address,address,bytes32,uint256,uint256,uint256,bytes)",
      "function createLockNonces(address) view returns (uint256)",
      "function creditEVMDeposit(address,bytes32,(bytes,bytes,bytes),(bytes,bytes))",
      "function decodeEVMErc20TokenData(bytes) pure returns (uint256,address)",
      "function decodeEVMNativeTokenData(bytes) pure returns (uint256)",
      "function eip712Domain() view returns (bytes1,string,string,uint256,address,bytes32,uint256[])",
      "function encodeEVMErc20TokenData(uint256,address) pure returns (bytes)",
      "function encodeEVMNativeTokenData(uint256) pure returns (bytes)",
      "function evmAddress() view returns (address)",
      "function gasLimitERC20() view returns (uint64)",
      "function gasLimitNative() view returns (uint64)",
      "function gasPrices(uint256) view returns (uint256)",
      "function getBalance(address,bytes32) view returns (uint256)",
      "function getBlockNumber(bytes) pure returns (uint256)",
      "function getServiceLocks(address,bytes) view returns ((uint256,address,bytes32,uint256,uint256)[])",
      "function getTokenId((uint8,bytes)) pure returns (bytes32)",
      "function getUserLocks(address,bytes) view returns ((uint256,address,bytes32,uint256,uint256)[])",
      "function initialize(address,address,address)",
      "function modifyLock(address,uint256,uint256,uint256,uint256,bytes)",
      "function modifyLockNonces(address) view returns (uint256)",
      "function nonces(uint256) view returns (uint64)",
      "function owner() view returns (address)",
      "function processedDeposits(bytes32) view returns (bool)",
      "function provethVerifier() view returns (address)",
      "function proxiableUUID() view returns (bytes32)",
      "function renounceOwnership() pure",
      "function requestWithdrawal(address,bytes32,uint256,uint256,bytes)",
      "function resolveWithdrawal(uint256) returns (bytes)",
      "function setBalance(address,bytes32,uint256)",
      "function setGasPrice(uint256,uint256)",
      "function setTokenInfo((uint8,bytes))",
      "function shoyuBashi() view returns (address)",
      "function siweAuth() view returns (address)",
      "function tokens(bytes32) view returns (uint8,bytes)",
      "function transferBalance(address,address,bytes32,uint256,uint256,bytes)",
      "function transferFromLock(address,address,uint256,uint256,uint256,bytes)",
      "function transferLockedNonces(address) view returns (uint256)",
      "function transferNonces(address) view returns (uint256)",
      "function transferOwnership(address)",
      "function unlockAllExpiredLocks(address) returns (uint256)",
      "function unlockSingleLock(address,uint256)",
      "function upgradeToAndCall(address,bytes) payable",
      "function verifyBlockHash(bytes32,uint256,uint256) view",
      "function withdrawalCount() view returns (uint256)",
      "function withdrawalNonces(address) view returns (uint256)",
      "function withdrawals(uint256) view returns (address,uint256,uint256,bytes32,bool,bytes)"
    ],
    "address": "0xc9ef83ab1C0D47A585Ec8a3cb3C7C93AABC98659",
    "txHash": "0x5164210a3be0fd49b4e2e712fcd49365aa551504044f3d7b54d5d7fcff65fffa",
    "deployTransaction": {
      "_type": "TransactionResponse",
      "accessList": null,
      "blockNumber": 22,
      "blockHash": "0xc4325dc2c623074a12ad99d576e5d0629c46095ff429f3d589f199fde9155ba7",
      "blobVersionedHashes": null,
      "chainId": "23293",
      "data": "0x60c0346200013e57601f62005bbe38819003918201601f19168301926001600160401b0392909183851183861017620001435781602092849260409788528339810103126200013e57516001600160a01b03811691908290036200013e57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff82861c166200012d578080831603620000e8575b5050508015620000d75760a05251615a6490816200015a82396080518181816109660152610f11015260a051818181610ecf015261435d0152f35b815163013d4af160e21b8152600490fd5b6001600160401b0319909116811790915582519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a13880806200009c565b845163f92ee8a960e01b8152600490fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806304773f24146103175780631128a7c714610312578063141a468c1461030d5780631522289d14610308578063210c5ff6146103035780632ee82ac8146102fe5780632f923f4b146102f957806337317114146102f45780633ba196d1146102ef5780633f0d2d50146102ea57806340c5faf0146102e55780634f1ef286146102e05780634f4c8d0b146102db57806350ec99a7146102d657806352d1902d146102d1578063579ea1dd146102cc5780635cc07076146102c75780635f431afb146102c257806364de9a13146102bd5780636934c747146102b85780636a7be528146102b3578063715018a6146102ae57806371706cbe146102a957806374882542146102a45780637a3e6c4e1461029f57806384b0196e1461029a5780638690b9601461029557806387d4f7da146102905780638b88f8a51461028b5780638d13c675146102865780638da5cb5b14610281578063904194a31461027c5780639311d61214610277578063963d560914610272578063a6c5e7371461026d578063a7cb050714610268578063ad3cb1cc14610263578063bfd893e51461025e578063c0c53b8b14610259578063c4624e5914610254578063c60622a11461024f578063c79d5ec51461024a578063e6c83ca114610245578063e84eb81414610240578063f2fde38b1461023b578063f6f0e8a614610236578063f7b27910146102315763ff908b791461022c57600080fd5b61250e565b6123fb565b6123be565b612391565b612365565b61231d565b612300565b6122c3565b612276565b61212d565b612011565b611fcb565b611f45565b611f2d565b611d31565b611d08565b611ca2565b611c3f565b611b71565b611b48565b611a38565b611951565b6118a4565b61167a565b611523565b611505565b6114ef565b6114b2565b61143f565b611277565b6111ba565b6110d1565b610f57565b610efe565b610eb9565b610a91565b610951565b6108e8565b6108ab565b61087e565b610841565b6107d3565b6107b5565b61079d565b61075d565b610728565b610708565b610378565b60005b83811061032f5750506000910152565b818101518382015260200161031f565b906020916103588151809281855285808601910161031c565b601f01601f1916010190565b90602061037592818152019061033f565b90565b3461052a5760208060031936011261052a5760043561039681610f8a565b509060016103a86002840154436125c2565b106105185781546001600160a01b03166003830154916001840154916103e06103db856000526065602052604060002090565b6125cf565b80516103eb81611c8b565b6103f481611c8b565b6104b45795600461043261042a610410846104599b0151612632565b9361041d60058b0161107e565b8051810182019101612613565b868585613085565b965b0191610448610444845460ff1690565b1590565b61045d575b60405180898982610364565b0390f35b61048f7fcfdfcdaea35564a3916e6ace177a20ccbcc900892acd85abeb8bad8798fb80e493600160ff19825416179055565b6040805195865260208601929092526001600160a01b031693a438808080808061044d565b600181516104c181611c8b565b6104ca81611c8b565b0361050657600461050088866104fa866104ea6104599d8d980151612753565b92909461041d6005879a0161107e565b93612f97565b96610434565b6040516335e2df5560e21b8152600490fd5b60405163452ebbd360e01b8152600490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761056057604052565b61052f565b60a081019081106001600160401b0382111761056057604052565b606081019081106001600160401b0382111761056057604052565b60c081019081106001600160401b0382111761056057604052565b602081019081106001600160401b0382111761056057604052565b60e081019081106001600160401b0382111761056057604052565b61010081019081106001600160401b0382111761056057604052565b90601f801991011681019081106001600160401b0382111761056057604052565b604051906106368261059b565b565b6040519061063682610565565b6040519060e082018281106001600160401b0382111761056057604052565b6040519061063682610545565b6001600160401b03811161056057601f01601f191660200190565b92919261069882610671565b916106a66040519384610608565b82948184528183011161052a578281602093846000960137010152565b9080601f8301121561052a578160206103759335910161068c565b602060031982011261052a57600435906001600160401b03821161052a57610375916004016106c3565b3461052a57602061072061071b366106de565b612632565b604051908152f35b3461052a57602036600319011261052a57600435600052603660205260206001600160401b0360406000205416604051908152f35b3461052a57602036600319011261052a5761045960405160043560208201526020815261078981610545565b60405191829160208352602083019061033f565b3461052a5760206107206107b0366106de565b61272a565b3461052a57600036600319011261052a576020604051620186a08152f35b3461052a57600036600319011261052a576035546040516001600160a01b039091168152602090f35b6001600160a01b0381160361052a57565b6001600160a01b0316600090815260646020526040902090565b6001600160a01b0316600090815260676020526040902090565b3461052a57602036600319011261052a5760043561085e816107fc565b60018060a01b031660005260026020526020604060002054604051908152f35b3461052a576040610896610891366106de565b612753565b82519182526001600160a01b03166020820152f35b3461052a57602036600319011261052a576004356108c8816107fc565b60018060a01b031660005260006020526020604060002054604051908152f35b3461052a57602036600319011261052a576004356000526066602052602060ff604060002054166040519015158152f35b90604060031983011261052a57600435610932816107fc565b91602435906001600160401b03821161052a57610375916004016106c3565b61095a36610919565b6001600160a01b0391907f00000000000000000000000000000000000000000000000000000000000000008316308114908115610a67575b50610a555760206004936109a4613d80565b6040516352d1902d60e01b8152948591829086165afa60009381610a24575b506109e957604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b906000805160206159cf8339815191528303610a0b57610a09925061473c565b005b604051632a87526960e21b815260048101849052602490fd5b610a4791945060203d602011610a4e575b610a3f8183610608565b810190612f09565b92386109c3565b503d610a35565b60405163703e46dd60e11b8152600490fd5b9050836000805160206159cf8339815191525416141538610992565b9081604091031261052a5790565b3461052a5760031960803682011261052a5760048035610ab0816107fc565b602435916044356001600160401b0380821161052a57606082840196833603011261052a5760643590811161052a57610afc6024610af4610b039336908701610a83565b93018761277c565b369161068c565b928351602080950120610b19610afc848061277c565b85815191012003610ea857603554610b41906001600160a01b03165b6001600160a01b031690565b604092835197632770f30d60e21b8952600098898180610b63858b830161285e565b0381875afa8015610e78578893610b8a610bb192610bbf948e8092610e8d575b5050613430565b505050989495939296919790998d5192839182019488869091604092825260208201520190565b03601f198101835282610608565b51902097610be1610bda8a6000526066602052604060002090565b5460ff1690565b610e7d57610c128f918c8e610bf6878061277c565b9490925196879586948594635ea4d4f160e01b865285016128d4565b03915afa908115610e78576001918f9182610c349392610e55575b5050613b87565b5003610e45578181610c5c610afc610c556107b0610afc85610c679861277c565b928061277c565b8d8151910120612f18565b6001600160a01b038781169a909283168b9003610e3557610c956103db8d6000526065602052604060002090565b8051610ca081611c8b565b610ca981611c8b565b610dac570151610cb890612632565b03610d9c57603254610cd2906001600160a01b0316610b35565b911603610d8c5751610d7c57935b8415610d6e575091610d4d86610d3e7f19dacbf83c5de6658e14cbf7bcae5c15eca2eedecf1c66fbca928e4d351bea0f9694610d39610d2c610d68986000526066602052604060002090565b805460ff19166001179055565b61080d565b90600052602052604060002090565b610d58838254612980565b9055519081529081906020820190565b0390a380f35b835163162908e360e11b8152fd5b505050516359177c0560e11b8152fd5b8451635972996f60e11b81528690fd5b865163a179f8c960e01b81528890fd5b909192955060018151610dbe81611c8b565b610dc781611c8b565b03610e25570151610dd790612753565b9103610d9c57831690831603610d8c57610df090613be0565b603254909290610e08906001600160a01b0316610b35565b911603610e155793610ce0565b50505051634cd87fb560e01b8152fd5b88516335e2df5560e21b81528a90fd5b8851634cd87fb560e01b81528a90fd5b8851635972996f60e11b81528a90fd5b610e7192503d8091833e610e698183610608565b8101906127ae565b8f80610c2d565b6128c8565b8a51631beb710560e11b81528c90fd5b610ea192503d8091833e610e698183610608565b388e610b83565b60405163fe9319a960e01b81528390fd5b3461052a57600036600319011261052a576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461052a57600036600319011261052a577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610a555760206040516000805160206159cf8339815191528152f35b3461052a57600036600319011261052a5760206040516161a88152f35b634e487b7160e01b600052603260045260246000fd5b606854811015610fa95760686000526006602060002091020190600090565b610f74565b90600182811c92168015610fde575b6020831014610fc857565b634e487b7160e01b600052602260045260246000fd5b91607f1691610fbd565b805460009392610ff782610fae565b9182825260209360019160018116908160001461105f575060011461101e575b5050505050565b90939495506000929192528360002092846000945b83861061104b57505050500101903880808080611017565b805485870183015294019385908201611033565b60ff19168685015250505090151560051b010191503880808080611017565b906106366110929260405193848092610fe8565b0383610608565b9261037596959260c0959260018060a01b03168552602085015260408401526060830152151560808201528160a0820152019061033f565b3461052a57602036600319011261052a5760043560685481101561052a576110f890610f8a565b5060018060a01b038154166104596005600184015493600281015460038201549061113c60ff600485015416936111356040518097819301610fe8565b0385610608565b60405196879687611099565b60208082019080835283518092528060408094019401926000905b83821061117257505050505090565b845180518752808401516001600160a01b0316878501528082015187830152606080820151908801526080908101519087015260a09095019493820193600190910190611163565b3461052a576111d36111cb36610919565b819291613c44565b60018060a01b031660005260206067602052604060002080546111f58161298d565b916112036040519384610608565b81835260208301906000526020600020936000915b83831061122d57604051806104598782611148565b60058260019261123c896129a4565b815201960192019194611218565b9181601f8401121561052a578235916001600160401b03831161052a576020838186019501011161052a57565b3461052a5760c036600319011261052a5760048035611295816107fc565b6024356112a1816107fc565b604435916064359360843560a4356001600160401b03811161052a576112ca903690840161124a565b91871561142e576001600160a01b038516600090815260016020526040902054810361141d57604080517f19fd50f57c0824db1f9852cbc5746d61f8eb0430a11242541e567f1c917e634a602082019081526001600160a01b038089169383019390935291881660608201526080810189905260a081018a905260c081019290925261137e9392611378929091611370916113688160e08101610bb1565b519020614c3c565b92369161068c565b90614cbc565b6001600160a01b0383811691160361140e576001600160a01b03821660009081526001602052604090206113b28154612bfb565b9055846113c285610d3e8561080d565b54106113ff575091610d3e6113f3926113e183610d3e6113fb9761080d565b6113ec8782546125c2565b905561080d565b918254612980565b9055005b604051631e9acf1760e31b8152fd5b604051638baa579f60e01b8152fd5b604051633ab3447f60e11b81528490fd5b60405163162908e360e11b81528490fd5b3461052a57606036600319011261052a5760043561145c816107fc565b6044356001600160401b03811161052a5761147e6114849136906004016106c3565b82613c44565b60018060a01b0316600052606460205260406000206024356000526020526020604060002054604051908152f35b3461052a57602036600319011261052a576004356114cf816107fc565b60018060a01b031660005260046020526020604060002054604051908152f35b3461052a57600036600319011261052a57600080fd5b3461052a57600036600319011261052a576020606854604051908152f35b3461052a5760c036600319011261052a5760048035611541816107fc565b60243590604435906064359360a4356001600160401b03811161052a5761156b903690830161124a565b92909461158a61157a83610827565b6115848382613c62565b906129e9565b509383850196875492838a1061164057871580948195611636575b5061162557906115bc92918a896084359288613ca1565b156115c657858555005b6115cf8161080d565b91846115ea6002860154809590600052602052604060002090565b54106113ff575091611604600392610d3e61161a9561080d565b61160f8582546125c2565b905501918254612980565b905538808080858555005b60405163162908e360e11b81528690fd5b90508a14386115a5565b60405162d36c8560e81b81528690fd5b602060031982011261052a57600435906001600160401b03821161052a5761037591600401610a83565b3461052a5761168836611650565b611690613d80565b61169981612dd6565b60009181835260206065602052604084206116b383612a1b565b60028110156118175760ff801983541691161781556001809101916116db602085018561277c565b926001600160401b038411610560576116fe846116f88754610fae565b87612ad8565b8792601f851160011461177d5750509261175983611760947f3a262eb33a02a292f2c36348228569dde5260c9081d7cd7a04e3d778751e2964979461176c978b92611772575b50508160011b916000199060031b1c19161790565b9055612a1b565b60405191829182612b12565b0390a280f35b013590503880611744565b9290601f1985169061179487600052602060002090565b948a915b83831061180057505050937f3a262eb33a02a292f2c36348228569dde5260c9081d7cd7a04e3d778751e2964969361176c96936001938361176098106117e6575b505050811b019055612a1b565b0135600019600384901b60f8161c191690553880806117d9565b858501358755958601959381019391810191611798565b611c75565b9161185090949194600f60f81b845261184260209660e0602087015260e086019061033f565b90848203604086015261033f565b92606083015260018060a01b03166080820152600060a082015260c08183039101526020808451928381520193019160005b828110611890575050505090565b835185529381019392810192600101611882565b3461052a57600036600319011261052a576000805160206159af83398151915254158061193a575b156118fd576118d9613db9565b6118e1613e6b565b906104596118ed612b22565b604051938493309146918661181c565b60405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606490fd5b50600080516020615a0f83398151915254156118cc565b3461052a57604036600319011261052a5760043561196e816107fc565b6001600160a01b038116600090815260676020526040902061199260243582613c62565b916119a66119a084846129e9565b506129a4565b90606082019081516119e4575b610a09846119df876119d96119d16119cb8554612546565b856129e9565b5091846129e9565b90612b59565b612bab565b60808395929301514210611a2657611a1d6113f3610a09966040611a0c6119df97519561080d565b910151600052602052604060002090565b905592386119b3565b60405163342ad40160e11b8152600490fd5b3461052a5760e036600319011261052a576004803590611a57826107fc565b60243590611a64826107fc565b60843560643560443560c4356001600160401b03811161052a57611a8b903690860161124a565b90428511156116405783156116255790611aac9160a4358686868b8d613efa565b611ab586610827565b93600a85541015611b395782611ace83610d3e8a61080d565b54106113ff5750611ae581610d3e610a099861080d565b611af08382546125c2565b9055611b2560695495611b0a611b0588612bfb565b606955565b611b12610638565b9687526001600160a01b03166020870152565b604085015260608401526080830152612c0a565b6040516313b8d32f60e21b8152fd5b3461052a57600036600319011261052a576034546040516001600160a01b039091168152602090f35b3461052a57602036600319011261052a57600435611b8e816107fc565b611b9781610827565b906000908254805b611bae57604051838152602090f35b611bb790612c6e565b611bc46119a082866129e9565b608081015142101580611c32575b611bde575b5080611b9f565b819381611bfb6113f36060611c2c950151926040611a0c8961080d565b9055611c1e611c13611c0d8854612546565b886129e9565b506119d985896129e9565b611c2786612bab565b612bfb565b92611bd7565b5060608101511515611bd2565b3461052a57600036600319011261052a5760008051602061596f833981519152546040516001600160a01b039091168152602090f35b634e487b7160e01b600052602160045260246000fd5b6002111561181757565b9060028210156118175752565b3461052a57602036600319011261052a576004356000526065602052611cf760406000206104596001611ceb60ff84541693611ce46040518094819301610fe8565b0382610608565b60405193848094611c95565b60406020840152604083019061033f565b3461052a57600036600319011261052a576032546040516001600160a01b039091168152602090f35b3461052a5760a036600319011261052a57600435611d4e816107fc565b602435906044356084356001600160401b03811161052a57611d77611d8391369060040161124a565b90606435848787613fbb565b80611d9184610d3e8561080d565b5410611f1b57611da483610d3e8461080d565b611daf8282546125c2565b9055611dc86103db846000526065602052604060002090565b928351611dd481611c8b565b611ddd81611c8b565b611e9a57611df16020610a09950151612632565b9181610bb1611e1f611e0286614069565b604080516001600160401b03909216602083015290928391820190565b60408051848152602081019690965290946001600160a01b038716917fafd2d4df6ed0018933528ddce8f646e31029396c7c31c0cbb22e7d31fb51199191a35b611e79611e6a610629565b6001600160a01b039095168552565b602084015243604084015260608301526000608083015260a0820152612c7b565b60018451611ea781611c8b565b611eb081611c8b565b0361050657611ec56020610a09950151612753565b509181610bb1611ed7611e0286614069565b60408051848152602081019690965290946001600160a01b038716917fafd2d4df6ed0018933528ddce8f646e31029396c7c31c0cbb22e7d31fb51199191a3611e5f565b604051631e9acf1760e31b8152600490fd5b3461052a576020610720611f4036611650565b612dd6565b3461052a57604036600319011261052a57600435602435611f64613d80565b8015611fa65760207fcdd9fb6238fdb1612459fea65f829cfca9f51c256eb7d67e4ed0c36ee593fd7891836000526037825280604060002055604051908152a2005b60405163f3eb44e560e01b8152600490fd5b60405190611fc5826105b6565b60008252565b3461052a57600036600319011261052a57610459604051611feb81610545565b60058152640352e302e360dc1b602082015260405191829160208352602083019061033f565b3461052a5760c036600319011261052a5760043561202e816107fc565b60243561203a816107fc565b60443560643560a4356001600160401b03811161052a5761205f90369060040161124a565b829491941561211b576120ab9061207587610827565b956120808688613c62565b978561208c8a8a6129e9565b509786608435936120a660018c015460018060a01b031690565b6140a3565b60038301928354908382106121095760026120d76120e8946120d0876113f3966125c2565b885561080d565b910154600052602052604060002090565b905554156120f257005b6119df610a09926119d96119d16119cb8554612546565b604051630c06c8ff60e01b8152600490fd5b60405163162908e360e11b8152600490fd5b3461052a57606036600319011261052a5760043561214a816107fc565b60243590612157826107fc565b604435612163816107fc565b6000805160206159ef83398151915254926001600160401b0360ff8560401c161594168015908161226e575b6001149081612264575b15908161225b575b50612249576000805160206159ef833981519152805467ffffffffffffffff191660011790556121d5928461222457614167565b6121db57005b6000805160206159ef833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b6000805160206159ef833981519152805460ff60401b1916600160401b179055614167565b60405163f92ee8a960e01b8152600490fd5b905015386121a1565b303b159150612199565b85915061218f565b3461052a57604036600319011261052a57610459602435612296816107fc565b60408051600435602082015260609290921b6001600160601b031916908201526034815261078981610580565b3461052a57602036600319011261052a576004356122e0816107fc565b60018060a01b031660005260036020526020604060002054604051908152f35b3461052a57604036600319011261052a57600435611484816107fc565b3461052a57606036600319011261052a5760043561233a816107fc565b6001600160a01b03166000908152606460209081526040808320602435845290915290206044359055005b3461052a57602036600319011261052a5760043560005260376020526020604060002054604051908152f35b3461052a57602036600319011261052a57610a096004356123b1816107fc565b6123b9613d80565b612e20565b3461052a57602036600319011261052a576004356123db816107fc565b60018060a01b031660005260016020526020604060002054604051908152f35b3461052a5761240936610919565b6001600160a01b039061241b90614327565b169081156124fd5761242c90610827565b805490916000805b8381106124c8575061244590612e94565b9260009160005b84811061246157604051806104598882611148565b81612483610b35600161247485886129e9565b5001546001600160a01b031690565b14612491575b60010161244c565b926124c06001916124a56119a087876129e9565b6124af828a612716565b526124ba8189612716565b50612bfb565b939050612489565b826124db610b356001612474858a6129e9565b146124e9575b600101612434565b906124f5600191612bfb565b9190506124e1565b6040516282b42960e81b8152600490fd5b3461052a57606036600319011261052a57610a09604435602435600435612f18565b634e487b7160e01b600052601160045260246000fd5b60001981019190821161255557565b612530565b60221981019190821161255557565b601a1981019190821161255557565b60bf1981019190821161255557565b607f1981019190821161255557565b602003906020821161255557565b60f61981019190821161255557565b60b61981019190821161255557565b9190820391821161255557565b906040516125dc81610545565b809260ff8154169160028310156118175761260f60209260019483526126086040518096819301610fe8565b0384610608565b0152565b9081602091031261052a57516001600160401b038116810361052a5790565b6020815103612642576020015190565b60405163493c7f1160e01b8152600490fd5b805115610fa95760200190565b805160011015610fa95760400190565b805160021015610fa95760600190565b805160031015610fa95760800190565b805160041015610fa95760a00190565b805160051015610fa95760c00190565b805160061015610fa95760e00190565b805160071015610fa9576101000190565b805160091015610fa9576101400190565b8051600a1015610fa9576101600190565b8051600b1015610fa9576101800190565b805160081015610fa9576101200190565b8051821015610fa95760209160051b010190565b61273661273b91613143565b613169565b805160081015610fa957610120610375910151613237565b90603482510361276a576034602083015192015190565b60405163483d123960e01b8152600490fd5b903590601e198136030182121561052a57018035906001600160401b03821161052a5760200191813603831361052a57565b60208183031261052a578051906001600160401b03821161052a570181601f8201121561052a5780516127e081610671565b926127ee6040519485610608565b8184526020828401011161052a57610375916020808501910161031c565b9035601e198236030181121561052a5701602081359101916001600160401b03821161052a57813603831361052a57565b908060209392818452848401376000828201840152601f01601f1916010190565b9060606103759260208152612886612876848061280c565b846020850152608084019161283d565b906128b96128ae61289a602087018761280c565b601f1985870381016040870152959161283d565b94604081019061280c565b9390928286030191015261283d565b6040513d6000823e3d90fd5b906128ec90610375949360408452604084019161283d565b90602081830391015261291e612913612905848061280c565b60408552604085019161283d565b92602081019061280c565b91602081850391015261283d565b90601b820180921161255557565b906023820180921161255557565b906001820180921161255557565b600401908160041161255557565b906004820180921161255557565b906002820180921161255557565b9190820180921161255557565b6001600160401b0381116105605760051b60200190565b906040516129b181610565565b8254815260018301546001600160a01b0316602082015260028301546040820152600383015460608201526004909201546080830152565b8054821015610fa9576000526005602060002091020190600090565b634e487b7160e01b600052600060045260246000fd5b35600281101561052a5790565b818110612a33575050565b60008155600101612a28565b90601f8211612a4c575050565b6106369160008051602061594f8339815191526000526020600020906020601f840160051c83019310612a87575b601f0160051c0190612a28565b9091508190612a7a565b90601f8211612a9e575050565b6106369160008051602061598f8339815191526000526020600020906020601f840160051c83019310612a8757601f0160051c0190612a28565b9190601f8111612ae757505050565b610636926000526020600020906020601f840160051c83019310612a8757601f0160051c0190612a28565b6020810192916106369190611c95565b604051612b2e816105b6565b60008152906000368137565b80546001600160a01b0319166001600160a01b03909216919091179055565b9190612ba657808203612b6a575050565b6004818192548455612b8b60018060a01b0360018301541660018601612b3a565b60028101546002850155600381015460038501550154910155565b612a05565b80548015612be5576000190190612bc282826129e9565b612ba6576004816000809355826001820155826002820155826003820155015555565b634e487b7160e01b600052603160045260246000fd5b60001981146125555760010190565b8054600160401b81101561056057612c27916001820181556129e9565b919091612ba657805182556020810151600491608091612c53906001600160a01b031660018601612b3a565b60408101516002850155606081015160038501550151910155565b8015612555576000190190565b6068549190600160401b83101561056057612c9e60019360018101606855610f8a565b612ba6578151612cb7906001600160a01b031682612b3a565b60a06005602092602085015160018201556040850151600282015560608501516003820155612cfb60808601511515600483019060ff801983541691151516179055565b01920151938451916001600160401b03831161056057612d2583612d1f8654610fae565b86612ad8565b602091601f8411600114612d685750508190612d59939495600092612d5d5750508160011b916000199060031b1c19161790565b9055565b015190503880611744565b95601f92919219841696612d8186600052602060002090565b936000915b898310612dbf5750505083600195969710612da6575b505050811b019055565b015160001960f88460031b161c19169055388080612d9c565b838501518655948501949381019391810191612d86565b612e1a612df0612de583612a1b565b92602081019061277c565b610bb1604093929351938492612e0a602085018098611c95565b604080850152606084019161283d565b51902090565b6001600160a01b03908116908115612e7b5760008051602061596f83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b90612e9e8261298d565b604090612eae6040519182610608565b8381528093612ebf601f199161298d565b019160005b838110612ed15750505050565b6020908251612edf81610565565b60008152826000818301526000858301526000606083015260006080830152828601015201612ec4565b9081602091031261052a575190565b603454604051631422364560e01b8152600481019490945260248401929092529190602090829060449082906001600160a01b03165afa908115610e7857600091612f78575b5003612f6657565b604051631f03465b60e11b8152600490fd5b612f91915060203d602011610a4e57610a3f8183610608565b38612f5e565b94939290612faf866000526037602052604060002090565b541561306c5760405163a9059cbb60e01b60208201526001600160a01b0391909116602482015260448082019290925290815292936103759390612ff4606483610608565b6032546001600160a01b0316916130566033549461301c846000526037602052604060002090565b54613037613028610645565b6001600160401b039099168952565b6020880152620186a060408801525b6001600160a01b03166060870152565b6000608086015260a085015260c0840152614413565b604051632c8ed83f60e11b815260048101879052602490fd5b93929161309c856000526037602052604060002090565b541561311157610375939460018060a01b0360325416916130f5603354946130ce846000526037602052604060002090565b546001600160401b036130df610645565b9816885260208801526161a86040880152613046565b6080850152613102611fb8565b60a085015260c0840152614413565b604051632c8ed83f60e11b815260048101869052602490fd5b6040519061313782610545565b60006020838281520152565b61314b61312a565b5060208151916040519261315e84610545565b835201602082015290565b613172816145a1565b1561052a57613180816145c8565b6131898161298d565b916131976040519384610608565b818352601f196131a68361298d565b0160005b8181106132205750506131cb6020809201516131c58161462a565b90612980565b6000905b8382106131dd575050505090565b613218816131ec60019361468f565b906131f5610664565b8281528187820152613207868a612716565b526132128589612716565b50612980565b9101906131cf565b60209061322b61312a565b828288010152016131aa565b8051801515908161326d575b501561052a5761325290614710565b90519060208110613261575090565b6020036101000a900490565b60219150111538613243565b805160021015610fa95760220190565b805160011015610fa95760210190565b805160031015610fa95760230190565b805160041015610fa95760240190565b908151811015610fa9570160200190565b6040519061014082018281106001600160401b0382111761056057604052600982528160005b61012081106132fd575050565b8060606020809385010152016132f0565b6040519061012082018281106001600160401b0382111761056057604052600882528160005b6101008110613341575050565b806060602080938501015201613334565b906133656020928281519485920161031c565b0190565b9061063660216040518094600160f91b6020830152613391815180926020868601910161031c565b8101036001810185520183610608565b9061063660216040518094600160f81b6020830152613391815180926020868601910161031c565b60ff16601b019060ff821161255557565b60ff60379116019060ff821161255557565b60ff60809116019060ff821161255557565b60ff60c09116019060ff821161255557565b811561341a570490565b634e487b7160e01b600052601260045260246000fd5b60ff61345561344f61344184612654565b516001600160f81b03191690565b60f81c90565b1660c081106136bb57509061346982613143565b61347290613169565b9161347c83612654565b5161348690613237565b61348f84612661565b5161349990613237565b936134a381612671565b516134ad90613237565b6134b682612681565b516134c0906148d4565b926134ca83612691565b516134d490613237565b926134de816126a1565b516134e8906148f3565b926134f2826126b1565b516134fc90613237565b92613506836126c1565b5161351090613237565b9261351a90612705565b5161352490613237565b9161352e8561255a565b60011c9a61353a6132ca565b92613544906150c2565b61354d90614957565b61355684612654565b5261356083612654565b5061356a906150c2565b61357390614957565b61357c83612661565b5261358682612661565b50613590906150c2565b61359990614957565b6135a282612671565b526135ac81612671565b506135b68761492e565b6135bf82612681565b526135c981612681565b506135d3866150c2565b6135dc90614957565b6135e582612691565b526135ef81612691565b506135f985614957565b613602826126a1565b5261360c816126a1565b506136168a6150c2565b61361f90614957565b613628826126b1565b52613632816126b1565b5061363b615017565b61364490614957565b61364d826126c1565b52613657816126c1565b50613660615017565b61366990614957565b61367282612705565b5261367c81612705565b5061368690614afb565b80519060200120818361369886612546565b6001166136a49061292c565b60ff166136b093614c24565b968051906020012097565b6001810361390d5750805190816020820120916136d79161482f565b6136e090613143565b6136e990613169565b916136f383612654565b516136fd90613237565b9261370781612661565b5161371190613237565b61371a82612671565b5161372490613237565b9161372e81612681565b5161373890613237565b61374182612691565b5161374b906148d4565b93613755836126a1565b5161375f90613237565b938861376a856126b1565b51613774906148f3565b9461377e81612705565b5161378890613237565b94613792826126d2565b5161379c90613237565b946137a6836126e3565b516137b090613237565b946137b961330e565b946137c3906150c2565b6137cc90614957565b6137d586612654565b526137df85612654565b506137e9906150c2565b6137f290614957565b6137fb85612661565b5261380584612661565b5061380f906150c2565b61381890614957565b61382184612671565b5261382b83612671565b50613835906150c2565b61383e90614957565b61384783612681565b5261385182612681565b5061385b8861492e565b61386483612691565b5261386e82612691565b50613878876150c2565b61388190614957565b61388a836126a1565b52613894826126a1565b5061389e86614957565b6138a7836126b1565b526138b1826126b1565b506138bb906126c1565b516138c590614acf565b6138ce826126c1565b526138d8816126c1565b506138e290614afb565b6138eb906133a1565b80519060200120818360ff8616613901906133c9565b61390a93614c24565b96565b600203613b7557805190816020820120916139279161482f565b61393090613143565b61393990613169565b9161394383612654565b5161394d90613237565b9261395781612661565b5161396190613237565b9061396b81612671565b5161397590613237565b61397e82612681565b5161398890613237565b61399183612691565b5161399b90613237565b916139a5846126a1565b516139af906148d4565b94886139ba866126b1565b516139c490613237565b956139ce816126c1565b516139d8906148f3565b956139e2826126d2565b516139ec90613237565b956139f6836126e3565b51613a0090613237565b95613a0a846126f4565b51613a1490613237565b95613a1d6132ca565b95613a27906150c2565b613a3090614957565b613a3987612654565b52613a4386612654565b50613a4d906150c2565b613a5690614957565b613a5f86612661565b52613a6985612661565b50613a73906150c2565b613a7c90614957565b613a8585612671565b52613a8f84612671565b50613a99906150c2565b613aa290614957565b613aab84612681565b52613ab583612681565b50613abf906150c2565b613ac890614957565b613ad183612691565b52613adb82612691565b50613ae58861492e565b613aee836126a1565b52613af8826126a1565b50613b02876150c2565b613b0b90614957565b613b14836126b1565b52613b1e826126b1565b50613b2886614957565b613b31836126c1565b52613b3b826126c1565b50613b4590612705565b51613b4f90614acf565b613b5882612705565b52613b6281612705565b50613b6c90614afb565b6138eb90613369565b6040516374ad0a5360e11b8152600490fd5b805115610fa9576127368160c06020613ba994015160f81c10613bd057613143565b90815115610fa957610375613bca613bc46020850151613237565b93612661565b51613237565b8051613bdb9161482f565b613143565b906044825103613c325760208201516001600160e01b0319166356fa634560e01b01613c205760248201516044909201516001600160a01b039092169190565b60405163bdfd723960e01b8152600490fd5b604051637bf375bb60e01b8152600490fd5b90613c4e90614327565b6001600160a01b039182169116036124fd57565b9060005b8254811015613c8f5781613c7a82856129e9565b505414613c8957600101613c66565b91505090565b60405163aefe60c360e01b8152600490fd5b959193929094613cc38760018060a01b03166000526003602052604060002090565b548403613d6e5761137061137892613d34956040519060208201927fd89b0bed31ea949494ebd9e074cf82fecd094d3d1867fd23b33865943f759195845260018060a01b03998a8d169b8c60408601526060850152608084015260a083015260c082015260c08152611368816105d1565b1603613d5c576001600160a01b031660009081526003602052604090205b612d598154612bfb565b604051638baa579f60e01b8152600490fd5b604051633ab3447f60e11b8152600490fd5b60008051602061596f833981519152546001600160a01b03163303613da157565b60405163118cdaa760e01b8152336004820152602490fd5b6040519060008260008051602061594f833981519152918254613ddb81610fae565b90818452602094600191600181169081600014613e495750600114613e0a575b50505061063692500383610608565b600090815285812095935091905b818310613e315750506106369350820101388080613dfb565b85548884018501529485019487945091830191613e18565b9250505061063694925060ff191682840152151560051b820101388080613dfb565b6040519060008260008051602061598f833981519152918254613e8d81610fae565b90818452602094600191600181169081600014613e495750600114613ebb5750505061063692500383610608565b600090815285812095935091905b818310613ee25750506106369350820101388080613dfb565b85548884018501529485019487945091830191613ec9565b969293959095949194613f1f8860018060a01b03166000526002602052604060002090565b548303613d6e578795613f999561137894611370936040519260208401947fe2528e74ac1420fa842d7c85b3d1e6008cbe3e38ad5e34d240575923300e1d9b865260018060a01b0380809d169d8e6040880152166060860152608085015260a084015260c083015260e082015260e08152611368816105ec565b1603613d5c576001600160a01b03166000908152600260205260409020613d52565b9490939192613fdc8660018060a01b03166000526000602052604060002090565b548103613d6e57614047926113706113789260405160208101917f5b26e64d3650b6ed089bed5d8a059a08332727bd2f0b8d36a28026c57eab6d0f835260018060a01b0398898c169a8b60408501526060840152608083015260a082015260a081526113688161059b565b1603613d5c576001600160a01b03166000908152602081905260409020613d52565b600052603660205260406000208054906001600160401b039182811692808414612555576001840116906001600160401b03191617905590565b9692959095949391946140c88860018060a01b03166000526004602052604060002090565b548503613d6e5760409561414595611378946113709389519a60208c01947f79d4eca6a26e2943df129acdd40d025cf9e9079c3af704ecba9da26b7685eaea86528c60018060a01b039c8d8094169101521660608c015260808b015260a08a015260c0890152868916978860e082015260e08152611368816105ec565b1603613d5c576001600160a01b03166000908152600460205260409020613d52565b929190614172614cc9565b61417a614cc9565b6040519361418785610545565b6010855260206f4163636f756e74696e674d6f64756c6560801b6020870152604051956141b387610545565b60019160018852603160f81b60208901526141cc614cc9565b6141d4614cc9565b8151916001600160401b0383116105605760008051602061594f83398151915293614208846142038754610fae565b612a3f565b602092601f85116001146142885750508261427e98999361424b959361424493600092612d5d5750508160011b916000199060031b1c19161790565b90556153ef565b61426260006000805160206159af83398151915255565b6142796000600080516020615a0f83398151915255565b614cf8565b6106366001606955565b60008051602061594f833981519152600052929190601f198516907f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d946000915b8383106143105750505092600192859261427e9b9c9661424b9896106142f7575b505050811b0190556153ef565b015160001960f88460031b161c191690553880806142ea565b8486015187559586019594810194918101916142c9565b805161433257503390565b6020614359916040518093819263310c6cb960e11b8352846004840152602483019061033f565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610e7857600091614399575090565b90506020813d6020116143c6575b816143b460209383610608565b8101031261052a5751610375816107fc565b3d91506143a7565b908160011b918083046002149015171561255557565b908160081b91808304610100149015171561255557565b600381901b91906001600160fd1b0381160361255557565b929161441d614dbc565b5060c08101805194604095600080886144e1614510614455835161444081610580565b8581526020978689830152858201528a614ddb565b835161447d888281614470818301968781519384920161031c565b8101038084520182610608565b51902099614489614dbc565b508351908782015286815261449d81610545565b8351908b888301528782526144b182610545565b61450485516144bf816105b6565b8781526144f4875196879460808d87019a60048c5287015260a086019061033f565b601f19958686830301606087015261033f565b908484830301608085015261033f565b03908101835282610608565b51906006600160981b015afa90614525614f42565b911561456f5750610375959661454c61456893614544614563946154cd565b978891615699565b8501926131c561455c8551612569565b91516143ce565b61293a565b9052614ddb565b60649088519062461bcd60e51b82526004820152600c60248201526b1cda59db8e8819985a5b195960a21b6044820152fd5b8051156145c257602060c09101515160001a106145bd57600190565b600090565b50600090565b8051156145c257600090602081019081516145e28161462a565b8101809111612555579151905181018091116125555791905b8281106146085750905090565b6146118161468f565b8101809111612555576146249091612bfb565b906145fb565b5160001a608081101561463d5750600090565b60b881108015614679575b156146535750600190565b60c081101561466d57614668610375916125b3565b612948565b614668610375916125a4565b5060c08110158015614648575060f88110614648565b805160001a9060808210156146a5575050600190565b60b88210156146bb575061466861037591612587565b9060c08110156146df5760b51991600160b783602003016101000a91015104010190565b9060f88210156146f6575061466861037591612578565b60010151602082900360f7016101000a90040160f5190190565b906020820191614720835161462a565b9251908382018092116125555751928303928311612555579190565b90813b156147c2576000805160206159cf83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28051156147a7576147a491614f72565b50565b5050346147b057565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b604051906147f082610545565b6001825260203681840137565b9061480782610671565b6148146040519182610608565b8281528092614825601f1991610671565b0190602036910137565b919091600190836001116148c257805184116148b05760001984019384118061255557829161485d866147fd565b956000926000945b614872575b505050505050565b8061255557818510156148ab5785856148976134416148918499612948565b876132b9565b861a6148a3828c6132b9565b530194614865565b61486a565b604051633b99b53d60e01b8152600490fd5b60405163a7836e7d60e01b8152600490fd5b601581510361052a576001600160a01b03906148ef90613237565b1690565b80511561052a5761490661037591614710565b614912819392936147fd565b928360200190614f9f565b614929610375916150c2565b614957565b60405160609190911b6001600160601b0319166020820152601481526103759061492981610545565b90600091805192600193600181149081614ab7575b501561497757509150565b81519360388510156149db575092610bb1610375926149d594956149b86149a860ff6149a16147e3565b96166133ec565b60f81b6001600160f81b03191690565b901a6149c384612654565b535b6040519485936020850190613352565b90613352565b9091908290600190805b614a87575b50506149fd6149f882612948565b6147fd565b92614a156149a8614a1060ff85166133ec565b6133da565b811a614a2085612654565b5360015b82811115614a42575050506149d592935090610bb1610375926149c5565b80614a706149a8614a6a614a6a614a64614a5f614a82978a6125c2565b614f90565b8c613410565b60ff1690565b831a614a7c82886132b9565b53612bfb565b614a24565b9091614a938388613410565b15614ab157614aa4614aaa91612bfb565b926143e4565b90806149e5565b916149ea565b905015610fa9576080602083015160f81c103861496c565b614ad981516147fd565b90815115614af7578060206103759201519051908360200190614f9f565b5090565b614b049061514f565b805160006038821015614b755750602061037591614b2f6149a860ff614b286147e3565b93166133fe565b60001a614b3b82612654565b535b6040519381614b55869351809286808701910161031c565b8201614b698251809386808501910161031c565b01038084520182610608565b909260019290915b614b878486613410565b15614ba457614b98614b9e91612bfb565b936143e4565b92614b7d565b909250929092614bb66149f882612948565b91614bc96149a8614a1060ff85166133fe565b60001a614bd584612654565b5360015b82811115614bef57505050602061037591614b3d565b80614c126149a8614a6a614a6a614c0c614a5f614c1f978a6125c2565b87613410565b60001a614a7c82876132b9565b614bd9565b916103759391614c33936151e7565b9092919261526b565b604290614c47615773565b614c4f615873565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152614c9e8161059b565b519020906040519161190160f01b8352600283015260228201522090565b61037591614c33916152f8565b60ff6000805160206159ef8339815191525460401c1615614ce657565b604051631afcd79f60e31b8152600490fd5b9091614d02614cc9565b6001600160a01b03918216928315614daa578216918215614daa57811615614daa5761063692614d3f614d8892614d37614cc9565b6123b9614cc9565b6001603355603280546001600160a01b031990811673284a3fe2939a4e4859e6321537d4264533e3d54917909155603480549091166001600160a01b0392909216919091179055565b603580546001600160a01b0319166001600160a01b0392909216919091179055565b60405163e6c4247b60e01b8152600490fd5b60405190614dc982610580565b60006040838281528260208201520152565b614f29602061037593614ecf60a0614df16132ca565b95614e1a614e15614e0983516001600160401b031690565b6001600160401b031690565b61491d565b614e2388612654565b52614e2d87612654565b50614e3a8582015161491d565b614e4388612661565b52614e4d87612661565b50614e68614e15614e0960408401516001600160401b031690565b614e7188612671565b52614e7b87612671565b506060810151614e93906001600160a01b031661492e565b614e9c88612681565b52614ea687612681565b50614eb4608082015161491d565b614ebd88612691565b52614ec787612691565b500151614957565b614ed8856126a1565b52614ee2846126a1565b50614ef0604082015161491d565b614ef9856126b1565b52614f03846126b1565b50614f0e815161491d565b614f17856126c1565b52614f21846126c1565b50015161491d565b614f3282612705565b52614f3c81612705565b50614afb565b3d15614f6d573d90614f5382610671565b91614f616040519384610608565b82523d6000602084013e565b606090565b60008061037593602081519101845af4614f8a614f42565b91615334565b601f8111612555576101000a90565b9290919283156150115792915b602093848410614fe15780518252848101809111612555579381018091116125555791601f1981019081116125555791614fac565b9193509180614fef57505050565b614ffe614a5f61500392612596565b612546565b905182518216911916179052565b50915050565b6040519060209161503481610bb160208201602090600081520190565b6000926000905b808210615091575b506150506149f882612596565b9160005b83518110156150895760019061507661344161506f86612bfb565b95856132b9565b871a61508282876132b9565b5301615054565b509193505050565b906150af6150a261344183866132b9565b6001600160f81b03191690565b6150bc576001019061503b565b90615043565b906040516150dd81610bb16020956020830160209181520190565b6000926000905b80821061512b575b506150f96149f882612596565b9160005b83518110156150895760019061511861344161506f86612bfb565b871a61512482876132b9565b53016150fd565b9061513c6150a261344183866132b9565b61514957600101906150e4565b906150ec565b8051156151de5790600091825b81518410156151855761517d6001916151758685612716565b515190612980565b93019261515c565b615191919293506147fd565b906020808301936000945b83518610156151d6576151ce6001916151c46151b88988612716565b51868151910183615397565b6151758887612716565b95019461519c565b509350505090565b50610375612b22565b91906fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841161525557926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa15610e785780516001600160a01b0381161561524c57918190565b50809160019190565b50505060009160039190565b6004111561181757565b61527481615261565b8061527d575050565b61528681615261565b600181036152a05760405163f645eedf60e01b8152600490fd5b6152a981615261565b600281036152ca5760405163fce698f760e01b815260048101839052602490fd5b806152d6600392615261565b146152de5750565b6040516335e2f38360e21b81526004810191909152602490fd5b81519190604183036153295761532292506020820151906060604084015193015160001a906151e7565b9192909190565b505060009160029190565b9061535b575080511561534957602081519101fd5b60405163d6bda27560e01b8152600490fd5b8151158061538e575b61536c575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15615364565b92905b6020938484106153cf5781518152848101809111612555579381018091116125555791601f198101908111612555579161539a565b9290919350600019906020036101000a0190811990511690825116179052565b9081516001600160401b0381116105605760008051602061598f833981519152906154238161541e8454610fae565b612a91565b602080601f831160011461545657508190612d59939495600092612d5d5750508160011b916000199060031b1c19161790565b60008051602061598f833981519152600052601f198316959091907f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75926000905b8882106154b557505083600195969710612da657505050811b019055565b80600185968294968601518155019501930190615497565b906154d6614dbc565b916008815110615661576001600160f81b0319600360fc1b816154fb61344185612654565b160361566157600160f91b808261551461344186613279565b16036156615761552c614a6a61344f61344186613289565b9161553f614a6a61344f61344187613299565b92602184116156615761555184612956565b9061556d614a6a61344f61344161556786612948565b8a6132b9565b9360218511615661576155866150a2613441858a6132b9565b03615661578061559e6155998688612980565b612964565b03615661576155ae865191612972565b03615661576155bc90612972565b9060049060218514615673575b6021841461562e575b50906020809286010151940101519160208110615617575b50602081106155ff575b509083526020830152565b61560b61561091612596565b6143fb565b1c386155f4565b61560b61562691949294612596565b1c91386155ea565b61563e61344184889694966132b9565b166156615760206156586156528294612948565b92612546565b939192506155d2565b6040516386cd05c560e01b8152600490fd5b80949150615683613441876132a9565b1661566157615693600591612546565b936155c9565b916040810190601b8252805192602082019060206156d5835160405197848960609194939260808201958252601b602083015260408201520152565b866000978892838052039060015afa15610e785784516001600160a01b03968716961686900361570757505050505050565b6157398593601c602096525192516040519384938460609194939260808201958252601c602083015260408201520152565b838052039060015afa15610e7857516001600160a01b0316036157615738808080808061486a565b604051634532600d60e01b8152600490fd5b60405160009060008051602061594f833981519152918183549161579683610fae565b808352602093848401966001916001811690816000146158535750600114615814575b5050506157c892500382610608565b519081156157d4572090565b50506000805160206159af8339815191525480156157ef5790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b600090815285812095935091905b81831061583b5750506157c893508201013880806157b9565b85548784018501529485019486945091830191615822565b925050506157c894925060ff19168652151560051b8201013880806157b9565b60405160009060008051602061598f833981519152918183549161589683610fae565b8083526020938484019660019160018116908160001461592e57506001146158ef575b5050506158c892500382610608565b519081156158d4572090565b5050600080516020615a0f8339815191525480156157ef5790565b600090815285812095935091905b8183106159165750506158c893508201013880806158b9565b855487840185015294850194869450918301916158fd565b925050506158c894925060ff19168652151560051b8201013880806158b956fea16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1029016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101a26469706673582212200600628726a9b65e29cc80183a123b4ce1705cf7b37475eba964d78e3f026f9564736f6c634300081800330000000000000000000000006cb8c7aa62f44d1d878f5bddc301c6b513ce5a44",
      "from": "0x6102b9a641982a43EbA99121d7eA5f5abc52Daa5",
      "gasLimit": "5107130",
      "gasPrice": "100000000000",
      "hash": "0x5164210a3be0fd49b4e2e712fcd49365aa551504044f3d7b54d5d7fcff65fffa",
      "maxFeePerGas": "100000000000",
      "maxPriorityFeePerGas": "100000000000",
      "maxFeePerBlobGas": null,
      "nonce": 3,
      "signature": {
        "_type": "signature",
        "networkV": "46622",
        "r": "0xdfcc744d2cff2c4d14e09d6ffae665f9f88e786b9991e008301ae5287cfda30b",
        "s": "0x54b65d4b7c2ae0cefce045c8695b25512a27b3274f0dba27c0027ea4f7e086f1",
        "v": 28
      },
      "to": null,
      "type": 0,
      "value": "0"
    },
    "layout": {
      "solcVersion": "0.8.24",
      "storage": [
        {
          "label": "withdrawalNonces",
          "offset": 0,
          "slot": "0",
          "type": "t_mapping(t_address,t_uint256)",
          "contract": "EIP712SignatureVerifier",
          "src": "contracts/EIP712SignatureVerifier.sol:36"
        },
        {
          "label": "transferNonces",
          "offset": 0,
          "slot": "1",
          "type": "t_mapping(t_address,t_uint256)",
          "contract": "EIP712SignatureVerifier",
          "src": "contracts/EIP712SignatureVerifier.sol:39"
        },
        {
          "label": "createLockNonces",
          "offset": 0,
          "slot": "2",
          "type": "t_mapping(t_address,t_uint256)",
          "contract": "EIP712SignatureVerifier",
          "src": "contracts/EIP712SignatureVerifier.sol:42"
        },
        {
          "label": "modifyLockNonces",
          "offset": 0,
          "slot": "3",
          "type": "t_mapping(t_address,t_uint256)",
          "contract": "EIP712SignatureVerifier",
          "src": "contracts/EIP712SignatureVerifier.sol:45"
        },
        {
          "label": "transferLockedNonces",
          "offset": 0,
          "slot": "4",
          "type": "t_mapping(t_address,t_uint256)",
          "contract": "EIP712SignatureVerifier",
          "src": "contracts/EIP712SignatureVerifier.sol:48"
        },
        {
          "label": "__gap",
          "offset": 0,
          "slot": "5",
          "type": "t_array(t_uint256)45_storage",
          "contract": "EIP712SignatureVerifier",
          "src": "contracts/EIP712SignatureVerifier.sol:298"
        },
        {
          "label": "evmAddress",
          "offset": 0,
          "slot": "50",
          "type": "t_address",
          "contract": "EVMSignerAndVerifier",
          "src": "contracts/EVMSignerAndVerifier.sol:31"
        },
        {
          "label": "secretKey",
          "offset": 0,
          "slot": "51",
          "type": "t_bytes32",
          "contract": "EVMSignerAndVerifier",
          "src": "contracts/EVMSignerAndVerifier.sol:32"
        },
        {
          "label": "shoyuBashi",
          "offset": 0,
          "slot": "52",
          "type": "t_contract(IShoyuBashi)15311",
          "contract": "EVMSignerAndVerifier",
          "src": "contracts/EVMSignerAndVerifier.sol:33"
        },
        {
          "label": "provethVerifier",
          "offset": 0,
          "slot": "53",
          "type": "t_contract(IProvethVerifier)15228",
          "contract": "EVMSignerAndVerifier",
          "src": "contracts/EVMSignerAndVerifier.sol:34"
        },
        {
          "label": "nonces",
          "offset": 0,
          "slot": "54",
          "type": "t_mapping(t_uint256,t_uint64)",
          "contract": "EVMSignerAndVerifier",
          "src": "contracts/EVMSignerAndVerifier.sol:36"
        },
        {
          "label": "gasPrices",
          "offset": 0,
          "slot": "55",
          "type": "t_mapping(t_uint256,t_uint256)",
          "contract": "EVMSignerAndVerifier",
          "src": "contracts/EVMSignerAndVerifier.sol:37"
        },
        {
          "label": "__gap",
          "offset": 0,
          "slot": "56",
          "type": "t_array(t_uint256)44_storage",
          "contract": "EVMSignerAndVerifier",
          "src": "contracts/EVMSignerAndVerifier.sol:700"
        },
        {
          "label": "balances",
          "offset": 0,
          "slot": "100",
          "type": "t_mapping(t_address,t_mapping(t_bytes32,t_uint256))",
          "contract": "Accounting",
          "src": "contracts/Accounting.sol:31"
        },
        {
          "label": "tokens",
          "offset": 0,
          "slot": "101",
          "type": "t_mapping(t_bytes32,t_struct(TokenInfo)14793_storage)",
          "contract": "Accounting",
          "src": "contracts/Accounting.sol:33"
        },
        {
          "label": "processedDeposits",
          "offset": 0,
          "slot": "102",
          "type": "t_mapping(t_bytes32,t_bool)",
          "contract": "Accounting",
          "src": "contracts/Accounting.sol:34"
        },
        {
          "label": "userInfo",
          "offset": 0,
          "slot": "103",
          "type": "t_mapping(t_address,t_struct(UserInfo)14798_storage)",
          "contract": "Accounting",
          "src": "contracts/Accounting.sol:35"
        },
        {
          "label": "withdrawals",
          "offset": 0,
          "slot": "104",
          "type": "t_array(t_struct(WithdrawalRequest)11480_storage)dyn_storage",
          "contract": "Accounting",
          "src": "contracts/Accounting.sol:37"
        },
        {
          "label": "nextLockId",
          "offset": 0,
          "slot": "105",
          "type": "t_uint256",
          "contract": "Accounting",
          "src": "contracts/Accounting.sol:39"
        },
        {
          "label": "__gap",
          "offset": 0,
          "slot": "106",
          "type": "t_array(t_uint256)44_storage",
          "contract": "Accounting",
          "src": "contracts/Accounting.sol:853"
        }
      ],
      "types": {
        "t_address": {
          "label": "address",
          "numberOfBytes": "20"
        },
        "t_bool": {
          "label": "bool",
          "numberOfBytes": "1"
        },
        "t_bytes32": {
          "label": "bytes32",
          "numberOfBytes": "32"
        },
        "t_string_storage": {
          "label": "string",
          "numberOfBytes": "32"
        },
        "t_struct(EIP712Storage)1204_storage": {
          "label": "struct EIP712Upgradeable.EIP712Storage",
          "members": [
            {
              "label": "_hashedName",
              "type": "t_bytes32",
              "offset": 0,
              "slot": "0"
            },
            {
              "label": "_hashedVersion",
              "type": "t_bytes32",
              "offset": 0,
              "slot": "1"
            },
            {
              "label": "_name",
              "type": "t_string_storage",
              "offset": 0,
              "slot": "2"
            },
            {
              "label": "_version",
              "type": "t_string_storage",
              "offset": 0,
              "slot": "3"
            }
          ],
          "numberOfBytes": "128"
        },
        "t_struct(InitializableStorage)1040_storage": {
          "label": "struct Initializable.InitializableStorage",
          "members": [
            {
              "label": "_initialized",
              "type": "t_uint64",
              "offset": 0,
              "slot": "0"
            },
            {
              "label": "_initializing",
              "type": "t_bool",
              "offset": 8,
              "slot": "0"
            }
          ],
          "numberOfBytes": "32"
        },
        "t_struct(OwnableStorage)980_storage": {
          "label": "struct OwnableUpgradeable.OwnableStorage",
          "members": [
            {
              "label": "_owner",
              "type": "t_address",
              "offset": 0,
              "slot": "0"
            }
          ],
          "numberOfBytes": "32"
        },
        "t_uint64": {
          "label": "uint64",
          "numberOfBytes": "8"
        },
        "t_array(t_struct(FundLock)14809_storage)dyn_storage": {
          "label": "struct FundLock[]",
          "numberOfBytes": "32"
        },
        "t_array(t_struct(WithdrawalRequest)11480_storage)dyn_storage": {
          "label": "struct Accounting.WithdrawalRequest[]",
          "numberOfBytes": "32"
        },
        "t_array(t_uint256)44_storage": {
          "label": "uint256[44]",
          "numberOfBytes": "1408"
        },
        "t_array(t_uint256)45_storage": {
          "label": "uint256[45]",
          "numberOfBytes": "1440"
        },
        "t_bytes_storage": {
          "label": "bytes",
          "numberOfBytes": "32"
        },
        "t_contract(IProvethVerifier)15228": {
          "label": "contract IProvethVerifier",
          "numberOfBytes": "20"
        },
        "t_contract(IShoyuBashi)15311": {
          "label": "contract IShoyuBashi",
          "numberOfBytes": "20"
        },
        "t_enum(TokenType)14787": {
          "label": "enum TokenType",
          "members": [
            "NativeEVM",
            "ERC20"
          ],
          "numberOfBytes": "1"
        },
        "t_mapping(t_address,t_mapping(t_bytes32,t_uint256))": {
          "label": "mapping(address => mapping(bytes32 => uint256))",
          "numberOfBytes": "32"
        },
        "t_mapping(t_address,t_struct(UserInfo)14798_storage)": {
          "label": "mapping(address => struct UserInfo)",
          "numberOfBytes": "32"
        },
        "t_mapping(t_address,t_uint256)": {
          "label": "mapping(address => uint256)",
          "numberOfBytes": "32"
        },
        "t_mapping(t_bytes32,t_bool)": {
          "label": "mapping(bytes32 => bool)",
          "numberOfBytes": "32"
        },
        "t_mapping(t_bytes32,t_struct(TokenInfo)14793_storage)": {
          "label": "mapping(bytes32 => struct TokenInfo)",
          "numberOfBytes": "32"
        },
        "t_mapping(t_bytes32,t_uint256)": {
          "label": "mapping(bytes32 => uint256)",
          "numberOfBytes": "32"
        },
        "t_mapping(t_uint256,t_uint256)": {
          "label": "mapping(uint256 => uint256)",
          "numberOfBytes": "32"
        },
        "t_mapping(t_uint256,t_uint64)": {
          "label": "mapping(uint256 => uint64)",
          "numberOfBytes": "32"
        },
        "t_struct(FundLock)14809_storage": {
          "label": "struct FundLock",
          "members": [
            {
              "label": "lockId",
              "type": "t_uint256",
              "offset": 0,
              "slot": "0"
            },
            {
              "label": "serviceId",
              "type": "t_address",
              "offset": 0,
              "slot": "1"
            },
            {
              "label": "tokenId",
              "type": "t_bytes32",
              "offset": 0,
              "slot": "2"
            },
            {
              "label": "amount",
              "type": "t_uint256",
              "offset": 0,
              "slot": "3"
            },
            {
              "label": "expiry",
              "type": "t_uint256",
              "offset": 0,
              "slot": "4"
            }
          ],
          "numberOfBytes": "160"
        },
        "t_struct(TokenInfo)14793_storage": {
          "label": "struct TokenInfo",
          "members": [
            {
              "label": "tokenType",
              "type": "t_enum(TokenType)14787",
              "offset": 0,
              "slot": "0"
            },
            {
              "label": "data",
              "type": "t_bytes_storage",
              "offset": 0,
              "slot": "1"
            }
          ],
          "numberOfBytes": "64"
        },
        "t_struct(UserInfo)14798_storage": {
          "label": "struct UserInfo",
          "members": [
            {
              "label": "activeLocks",
              "type": "t_array(t_struct(FundLock)14809_storage)dyn_storage",
              "offset": 0,
              "slot": "0"
            }
          ],
          "numberOfBytes": "32"
        },
        "t_struct(WithdrawalRequest)11480_storage": {
          "label": "struct Accounting.WithdrawalRequest",
          "members": [
            {
              "label": "userAddress",
              "type": "t_address",
              "offset": 0,
              "slot": "0"
            },
            {
              "label": "amount",
              "type": "t_uint256",
              "offset": 0,
              "slot": "1"
            },
            {
              "label": "blockNumber",
              "type": "t_uint256",
              "offset": 0,
              "slot": "2"
            },
            {
              "label": "tokenId",
              "type": "t_bytes32",
              "offset": 0,
              "slot": "3"
            },
            {
              "label": "resolved",
              "type": "t_bool",
              "offset": 0,
              "slot": "4"
            },
            {
              "label": "txIdentifier",
              "type": "t_bytes_storage",
              "offset": 0,
              "slot": "5"
            }
          ],
          "numberOfBytes": "192"
        },
        "t_uint256": {
          "label": "uint256",
          "numberOfBytes": "32"
        }
      },
      "namespaces": {
        "erc7201:openzeppelin.storage.Ownable": [
          {
            "contract": "OwnableUpgradeable",
            "label": "_owner",
            "type": "t_address",
            "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:24",
            "offset": 0,
            "slot": "0"
          }
        ],
        "erc7201:openzeppelin.storage.EIP712": [
          {
            "contract": "EIP712Upgradeable",
            "label": "_hashedName",
            "type": "t_bytes32",
            "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:38",
            "offset": 0,
            "slot": "0"
          },
          {
            "contract": "EIP712Upgradeable",
            "label": "_hashedVersion",
            "type": "t_bytes32",
            "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:40",
            "offset": 0,
            "slot": "1"
          },
          {
            "contract": "EIP712Upgradeable",
            "label": "_name",
            "type": "t_string_storage",
            "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:42",
            "offset": 0,
            "slot": "2"
          },
          {
            "contract": "EIP712Upgradeable",
            "label": "_version",
            "type": "t_string_storage",
            "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol:43",
            "offset": 0,
            "slot": "3"
          }
        ],
        "erc7201:openzeppelin.storage.Initializable": [
          {
            "contract": "Initializable",
            "label": "_initialized",
            "type": "t_uint64",
            "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
            "offset": 0,
            "slot": "0"
          },
          {
            "contract": "Initializable",
            "label": "_initializing",
            "type": "t_bool",
            "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
            "offset": 8,
            "slot": "0"
          }
        ]
      }
    }
  }
}


      at checkForAddressClash (node_modules/@openzeppelin/upgrades-core/src/impl-store.ts:254:13)
      at processTicksAndRejections (node:internal/process/task_queues:105:5)
      at async /home/oa/accounting-module/solidity/node_modules/@openzeppelin/upgrades-core/src/impl-store.ts:78:11
      at async Manifest.lockedRun (node_modules/@openzeppelin/upgrades-core/src/manifest.ts:282:14)
      at async fetchOrDeployGeneric (node_modules/@openzeppelin/upgrades-core/src/impl-store.ts:52:24)
      at async deployImpl (node_modules/@openzeppelin/hardhat-upgrades/src/utils/deploy-impl.ts:109:22)
      at async deployProxyImpl (node_modules/@openzeppelin/hardhat-upgrades/src/utils/deploy-impl.ts:77:9)
      at async Proxy.deployProxy (node_modules/@openzeppelin/hardhat-upgrades/src/deploy-proxy.ts:55:28)
      at async Context.<anonymous> (test/Accounting.E2E.ts:125:18)

@matevz

matevz commented Mar 20, 2026

Copy link
Copy Markdown
Member Author

Getting flaky results for the "User should be able to deposit" test here:

https://github.com/oasisprotocol/accounting-module/blob/65b46afad4d83672cb0cc59adc7225647cfb1e30/solidity/test/Accounting.E2E.ts#L210

  1) Accounting
       User should be able to do simple deposit:
     Error: Timeout of 40000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/home/oa/accounting-module/solidity/test/Accounting.E2E.ts)

Symptoms and fix attempts:

  • no effect when disabling/enabling Sapphire typescript wrapper
  • adding const tx = await mockShoyubashi.setUnanimousHash(...); await tx.wait(); doesn't help
  • adding 1 second timeout doesn't help
  • fails ~58% of time
  • fails on both sapphire-localnet and emerald-localnet using oasisprotocol/oasis-web3-gateway@40bf2d3
  • also fails on reverted sapphire-localnet based on oasis-core 25.6 oasisprotocol/oasis-web3-gateway@eaf43b9
  • I tried printing hash of the transaction and cross-examine it on Explorer. I got a reproducible behavior!
    • If the printed tx hash matches the one on explorer, the test always passes.
    • The test always fails, when the printed tx hash is different than the one shown on the explorer.
    • => It seems the tx hash propagation or computation inside the web3 gateway or Sapphire paratime is causing issues.
  • I commented out const provider = new ethers.JsonRpcProvider("https://sepolia.base.org"); if there is perhaps a race condition between two providers, but it didn't help.

@matevz
matevz force-pushed the matevz/feature/sapphire-localnet-tests branch from 8669abf to acd543f Compare March 23, 2026 16:14
@matevz

matevz commented Apr 1, 2026

Copy link
Copy Markdown
Member Author

Created oasisprotocol/sapphire-paratime#686 and oasisprotocol/sapphire-paratime#687 during implementation.

@matevz
matevz force-pushed the matevz/feature/sapphire-localnet-tests branch from 642449e to 2244ab1 Compare April 9, 2026 12:32
@matevz
matevz marked this pull request as ready for review April 9, 2026 15:23
@matevz
matevz force-pushed the matevz/feature/sapphire-localnet-tests branch from 8d02e59 to f9aef91 Compare April 10, 2026 09:55
@matevz matevz changed the title Add sapphire-localnet tests solidity: Add sapphire-localnet tests Apr 10, 2026
@matevz
matevz force-pushed the matevz/feature/sapphire-localnet-tests branch from f9aef91 to c5c3f2b Compare April 13, 2026 09:35

@ptrus ptrus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some minor suggestions

Comment thread solidity/test/Accounting.E2E.ts Outdated
Comment thread solidity/test/Accounting.E2E.ts
Comment thread solidity/test/Accounting.E2E.ts Outdated
Comment thread solidity/test/utils.ts
@matevz
matevz force-pushed the matevz/feature/sapphire-localnet-tests branch 3 times, most recently from 2929927 to dda3207 Compare April 29, 2026 12:51
@matevz
matevz force-pushed the matevz/feature/sapphire-localnet-tests branch from dda3207 to 164ed25 Compare May 7, 2026 14:11
@matevz

matevz commented May 7, 2026

Copy link
Copy Markdown
Member Author

Getting failed test during UUPS proxy deployment here: https://github.com/oasisprotocol/accounting-module/blob/65b46afad4d83672cb0cc59adc7225647cfb1e30/solidity/test/Accounting.E2E.ts#L112

Symptoms:

* running on latest sapphire-localnet fails for the first time

* rerunning the test works

* running tests on hardhat localnet or emerald-localnet works for the first time

* enabling/disabling sapphire-paratime ts wrapper doesn't make a change

Workaround:

* repeat deploying UUPS by proxy until it succeeds

Details

May be related to recent hardhat ignition failures in CI in the recent sapphire javascript clients oasisprotocol/sapphire-paratime#702 (comment) ?

@matevz
matevz force-pushed the matevz/feature/sapphire-localnet-tests branch 6 times, most recently from 2463547 to e3653d4 Compare May 13, 2026 06:19
@matevz
matevz force-pushed the matevz/feature/sapphire-localnet-tests branch from e3653d4 to b08ee0e Compare May 13, 2026 06:22
@matevz
matevz merged commit a465e73 into master May 13, 2026
3 checks passed
@matevz
matevz deleted the matevz/feature/sapphire-localnet-tests branch May 13, 2026 07:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants