{
  "contractName": "FeeHandlerRouter",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "bridgeAddress",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "IncorrectFeeSupplied",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "fromDomainID",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "destinationDomainID",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "resourceID",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "fee",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        }
      ],
      "name": "FeeCollected",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "FeeDistributed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleGranted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleRevoked",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "whitelistAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "isWhitelisted",
          "type": "bool"
        }
      ],
      "name": "WhitelistChanged",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DEFAULT_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function",
      "constant": true
    },
    {
      "inputs": [],
      "name": "_bridgeAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function",
      "constant": true
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "_domainResourceIDToFeeHandlerAddress",
      "outputs": [
        {
          "internalType": "contract IFeeHandler",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function",
      "constant": true
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "_whitelist",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function",
      "constant": true
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleAdmin",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function",
      "constant": true
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "index",
          "type": "uint256"
        }
      ],
      "name": "getRoleMember",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function",
      "constant": true
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleMemberCount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function",
      "constant": true
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "getRoleMemberIndex",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function",
      "constant": true
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function",
      "constant": true
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "renounceRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "revokeRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "feeHandlerType",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "pure",
      "type": "function",
      "constant": true
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "destinationDomainID",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "resourceID",
          "type": "bytes32"
        },
        {
          "internalType": "contract IFeeHandler",
          "name": "handlerAddress",
          "type": "address"
        }
      ],
      "name": "adminSetResourceHandler",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "whitelistAddress",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "isWhitelisted",
          "type": "bool"
        }
      ],
      "name": "adminSetWhitelist",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "uint8",
          "name": "fromDomainID",
          "type": "uint8"
        },
        {
          "internalType": "uint8",
          "name": "destinationDomainID",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "resourceID",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "depositData",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "feeData",
          "type": "bytes"
        }
      ],
      "name": "collectFee",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function",
      "payable": true
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "uint8",
          "name": "fromDomainID",
          "type": "uint8"
        },
        {
          "internalType": "uint8",
          "name": "destinationDomainID",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "resourceID",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "depositData",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "feeData",
          "type": "bytes"
        }
      ],
      "name": "calculateFee",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "fee",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function",
      "constant": true
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.8.11+commit.d7f03943\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bridgeAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"IncorrectFeeSupplied\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"fromDomainID\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"destinationDomainID\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"resourceID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"FeeCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FeeDistributed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"whitelistAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isWhitelisted\",\"type\":\"bool\"}],\"name\":\"WhitelistChanged\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"_bridgeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"_domainResourceIDToFeeHandlerAddress\",\"outputs\":[{\"internalType\":\"contract IFeeHandler\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"_whitelist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"destinationDomainID\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"resourceID\",\"type\":\"bytes32\"},{\"internalType\":\"contract IFeeHandler\",\"name\":\"handlerAddress\",\"type\":\"address\"}],\"name\":\"adminSetResourceHandler\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"whitelistAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isWhitelisted\",\"type\":\"bool\"}],\"name\":\"adminSetWhitelist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"fromDomainID\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"destinationDomainID\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"resourceID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"depositData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"feeData\",\"type\":\"bytes\"}],\"name\":\"calculateFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"fromDomainID\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"destinationDomainID\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"resourceID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"depositData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"feeData\",\"type\":\"bytes\"}],\"name\":\"collectFee\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeHandlerType\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getRoleMemberIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"ChainSafe Systems.\",\"kind\":\"dev\",\"methods\":{\"adminSetResourceHandler(uint8,bytes32,address)\":{\"params\":{\"destinationDomainID\":\"ID of chain FeeHandler contracts will be called.\",\"handlerAddress\":\"Address of FeeHandler which will be called for specified resourceID.\",\"resourceID\":\"ResourceID for which the corresponding FeeHandler will collect/calcualte fee.\"}},\"adminSetWhitelist(address,bool)\":{\"params\":{\"isWhitelisted\":\"Set to true to exempt an address from paying fees.\",\"whitelistAddress\":\"Address to be whitelisted.\"}},\"calculateFee(address,uint8,uint8,bytes32,bytes,bytes)\":{\"params\":{\"depositData\":\"Additional data to be passed to specified handler.\",\"destinationDomainID\":\"ID of chain deposit will be bridged to.\",\"feeData\":\"Additional data to be passed to the fee handler.\",\"fromDomainID\":\"ID of the source chain.\",\"resourceID\":\"ResourceID to be used when making deposits.\",\"sender\":\"Sender of the deposit.\"},\"returns\":{\"fee\":\"Returns the fee amount.\",\"tokenAddress\":\"Returns the address of the token to be used for fee.\"}},\"collectFee(address,uint8,uint8,bytes32,bytes,bytes)\":{\"params\":{\"depositData\":\"Additional data to be passed to specified handler.\",\"destinationDomainID\":\"ID of chain deposit will be bridged to.\",\"feeData\":\"Additional data to be passed to the fee handler.\",\"fromDomainID\":\"ID of the source chain.\",\"resourceID\":\"ResourceID to be used when making deposits.\",\"sender\":\"Sender of the deposit.\"}},\"constructor\":{\"params\":{\"bridgeAddress\":\"Contract address of previously deployed Bridge.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getRoleMember(bytes32,uint256)\":{\"details\":\"Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information.\"},\"getRoleMemberCount(bytes32)\":{\"details\":\"Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role.\"},\"getRoleMemberIndex(bytes32,address)\":{\"details\":\"Returns the index of the account that have `role`.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role.\"}},\"title\":\"Handles FeeHandler routing for resources.\",\"version\":1},\"userdoc\":{\"events\":{\"FeeCollected(address,uint8,uint8,bytes32,uint256,address)\":{\"notice\":\"This event is emitted when the fee is collected.\"},\"FeeDistributed(address,address,uint256)\":{\"notice\":\"This event is emitted when the fee is distributed to an address.\"}},\"kind\":\"user\",\"methods\":{\"adminSetResourceHandler(uint8,bytes32,address)\":{\"notice\":\"Maps the {handlerAddress} to {resourceID} to {destinationDomainID} in {_domainResourceIDToFeeHandlerAddress}.\"},\"adminSetWhitelist(address,bool)\":{\"notice\":\"Sets or revokes fee whitelist from an address.\"},\"calculateFee(address,uint8,uint8,bytes32,bytes,bytes)\":{\"notice\":\"Initiates calculating fee with corresponding fee handler contract using IFeeHandler interface.\"},\"collectFee(address,uint8,uint8,bytes32,bytes,bytes)\":{\"notice\":\"Initiates collecting fee with corresponding fee handler contract using IFeeHandler interface.\"},\"feeHandlerType()\":{\"notice\":\"Getter function for fee handler type\"}},\"notice\":\"This contract is intended to be used with the Bridge contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"project:/contracts/handlers/FeeHandlerRouter.sol\":\"FeeHandlerRouter\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0x2ccf9d2313a313d41a791505f2b5abfdc62191b5d4334f7f7a82691c088a1c87\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b3a57d0854b2fdce6ebff933a48dca2445643d1eccfc27f00292e937f26c6a58\",\"dweb:/ipfs/QmW45rZooS9TqR4YXUbjRbtf2Bpb5ouSarBvfW1LdGprvV\"]},\"@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x9772845c886f87a3aab315f8d6b68aa599027c20f441b131cd4afaf65b588900\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad2f29a9c17a4f746416c9e254e17671f43c409dbfa6e4d7d76c3e4a83212d31\",\"dweb:/ipfs/QmTqU65L6iu6yqmXKzcNLPioR8etzKPWycpDJCm17ifVdS\"]},\"project:/contracts/handlers/FeeHandlerRouter.sol\":{\"keccak256\":\"0x8c4c094e60ddda1f6e6baf5ebf4cf5566f6e14c4a89d4542a11a003896d4fc4e\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://bc29d335b79f7d780f88f39177bc29e3db77dde9647edfdde31c3d39ae983c00\",\"dweb:/ipfs/QmRh1ZVMUHZUL5KNHfZGzSWoUZThV6kCS7SnvSDPgpHqhC\"]},\"project:/contracts/interfaces/IFeeHandler.sol\":{\"keccak256\":\"0xb91ebf155a2ec6e36d2e5f884f829075cff788aaa367d6ffb09d3f956cb5384a\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://102bea5ee61e82b2ed2c0db49dac1bfda190fde61ec25cc8d5988d1aad496e9b\",\"dweb:/ipfs/QmUonDedQaYyP5pz71JvmzMm9f9wg96ZpCYowSr9RMKs1U\"]},\"project:/contracts/utils/AccessControl.sol\":{\"keccak256\":\"0x46ee81e56b1cca67473670a3f59fb02ec8abda297fac02c79d705a3442588499\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://40869a99895bc5f746f8b55ab7d20eb4fce323e50540d2d0944e1930f5eea334\",\"dweb:/ipfs/QmVaCmqGRywSFyqPj1auXmDYQzDFy4uywknXTB3QMLCzkm\"]}},\"version\":1}",
  "bytecode": "0x60a06040523480156200001157600080fd5b50604051620011013803806200110183398101604081905262000034916200013e565b6001600160a01b0381166080526200004e60003362000055565b5062000170565b62000061828262000065565b5050565b6000828152602081815260409091206200008a9183906200084e620000cc821b17901c565b15620000615760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d90600090a45050565b6000620000e3836001600160a01b038416620000ec565b90505b92915050565b60008181526001830160205260408120546200013557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620000e6565b506000620000e6565b6000602082840312156200015157600080fd5b81516001600160a01b03811681146200016957600080fd5b9392505050565b608051610f6e62000193600039600081816101ad01526108c70152610f6e6000f3fe6080604052600436106100fe5760003560e01c8063542774b511610095578063ca15c87311610064578063ca15c87314610302578063cfdb63ac14610322578063d547741f14610352578063ef4f081f14610372578063f1382b26146103af57600080fd5b8063542774b5146102685780639010d07c1461029d57806391d14854146102bd578063a217fddf146102ed57600080fd5b8063318c136e116100d1578063318c136e1461019b57806336568abe146101e75780633d94ebc6146102075780634e0df3f61461024857600080fd5b80631af5fe3814610103578063248a9ca31461012557806325307065146101685780632f2ff15d1461017b575b600080fd5b34801561010f57600080fd5b5061012361011e366004610bcd565b6103cf565b005b34801561013157600080fd5b50610155610140366004610c0d565b60009081526020819052604090206002015490565b6040519081526020015b60405180910390f35b610123610176366004610c6f565b610414565b34801561018757600080fd5b50610123610196366004610d1c565b610504565b3480156101a757600080fd5b506101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161015f565b3480156101f357600080fd5b50610123610202366004610d1c565b610592565b34801561021357600080fd5b506101cf610222366004610d4c565b60016020908152600092835260408084209091529082529020546001600160a01b031681565b34801561025457600080fd5b50610155610263366004610d1c565b61060c565b34801561027457600080fd5b5060408051808201825260068152653937baba32b960d11b6020820152905161015f9190610d76565b3480156102a957600080fd5b506101cf6102b8366004610dcb565b610637565b3480156102c957600080fd5b506102dd6102d8366004610d1c565b610656565b604051901515815260200161015f565b3480156102f957600080fd5b50610155600081565b34801561030e57600080fd5b5061015561031d366004610c0d565b61066e565b34801561032e57600080fd5b506102dd61033d366004610ded565b60026020526000908152604090205460ff1681565b34801561035e57600080fd5b5061012361036d366004610d1c565b610685565b34801561037e57600080fd5b5061039261038d366004610c6f565b610706565b604080519283526001600160a01b0390911660208301520161015f565b3480156103bb57600080fd5b506101236103ca366004610e0a565b6107e3565b6103d7610863565b60ff9290921660009081526001602090815260408083209383529290522080546001600160a01b0319166001600160a01b03909216919091179055565b61041c6108bc565b6001600160a01b03881660009081526002602052604090205460ff161561046857341561046357604051634dc2c71160e01b81523460048201526024015b60405180910390fd5b6104fa565b60ff8616600090815260016020908152604080832088845290915290819020549051632530706560e01b81526001600160a01b0390911690819063253070659034906104c6908d908d908d908d908d908d908d908d90600401610e66565b6000604051808303818588803b1580156104df57600080fd5b505af11580156104f3573d6000803e3d6000fd5b5050505050505b5050505050505050565b6000828152602081905260409020600201546105209033610656565b6105845760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526e0818591b5a5b881d1bc819dc985b9d608a1b606482015260840161045a565b61058e8282610934565b5050565b6001600160a01b03811633146106025760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161045a565b61058e828261098d565b6000828152602081815260408083206001600160a01b03851684526001019091529020545b92915050565b600082815260208190526040812061064f90836109e6565b9392505050565b600082815260208190526040812061064f90836109f2565b600081815260208190526040812061063190610a14565b6000828152602081905260409020600201546106a19033610656565b6106025760405162461bcd60e51b815260206004820152603060248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526f2061646d696e20746f207265766f6b6560801b606482015260840161045a565b6001600160a01b038816600090815260026020526040812054819060ff1615610734575060009050806107d6565b60ff881660009081526001602090815260408083208a84529091529081902054905163ef4f081f60e01b81526001600160a01b0390911690819063ef4f081f90610790908e908e908e908e908e908e908e908e90600401610e66565b6040805180830381865afa1580156107ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d09190610ec2565b92509250505b9850989650505050505050565b6107eb610863565b6001600160a01b038216600081815260026020908152604091829020805460ff19168515159081179091558251938452908301527fb840a1dbd8b09a3dc45161bba92dfb9aba643c0e44c085a447f839d1d02cf13b910160405180910390a15050565b600061064f836001600160a01b038416610a1e565b61086e600033610656565b6108ba5760405162461bcd60e51b815260206004820152601e60248201527f73656e64657220646f65736e277420686176652061646d696e20726f6c650000604482015260640161045a565b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108ba5760405162461bcd60e51b815260206004820152601e60248201527f73656e646572206d7573742062652062726964676520636f6e74726163740000604482015260640161045a565b600082815260208190526040902061094c908261084e565b1561058e5760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d90600090a45050565b60008281526020819052604090206109a59082610a6d565b1561058e5760405133906001600160a01b0383169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90600090a45050565b600061064f8383610a82565b6001600160a01b0381166000908152600183016020526040812054151561064f565b6000610631825490565b6000818152600183016020526040812054610a6557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610631565b506000610631565b600061064f836001600160a01b038416610aac565b6000826000018281548110610a9957610a99610ee7565b9060005260206000200154905092915050565b60008181526001830160205260408120548015610b95576000610ad0600183610efd565b8554909150600090610ae490600190610efd565b9050818114610b49576000866000018281548110610b0457610b04610ee7565b9060005260206000200154905080876000018481548110610b2757610b27610ee7565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610b5a57610b5a610f22565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610631565b6000915050610631565b803560ff81168114610bb057600080fd5b919050565b6001600160a01b0381168114610bca57600080fd5b50565b600080600060608486031215610be257600080fd5b610beb84610b9f565b9250602084013591506040840135610c0281610bb5565b809150509250925092565b600060208284031215610c1f57600080fd5b5035919050565b60008083601f840112610c3857600080fd5b50813567ffffffffffffffff811115610c5057600080fd5b602083019150836020828501011115610c6857600080fd5b9250929050565b60008060008060008060008060c0898b031215610c8b57600080fd5b8835610c9681610bb5565b9750610ca460208a01610b9f565b9650610cb260408a01610b9f565b955060608901359450608089013567ffffffffffffffff80821115610cd657600080fd5b610ce28c838d01610c26565b909650945060a08b0135915080821115610cfb57600080fd5b50610d088b828c01610c26565b999c989b5096995094979396929594505050565b60008060408385031215610d2f57600080fd5b823591506020830135610d4181610bb5565b809150509250929050565b60008060408385031215610d5f57600080fd5b610d6883610b9f565b946020939093013593505050565b600060208083528351808285015260005b81811015610da357858101830151858201604001528201610d87565b81811115610db5576000604083870101525b50601f01601f1916929092016040019392505050565b60008060408385031215610dde57600080fd5b50508035926020909101359150565b600060208284031215610dff57600080fd5b813561064f81610bb5565b60008060408385031215610e1d57600080fd5b8235610e2881610bb5565b915060208301358015158114610d4157600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038916815260ff8816602082015260ff8716604082015285606082015260c060808201526000610ea060c083018688610e3d565b82810360a0840152610eb3818587610e3d565b9b9a5050505050505050505050565b60008060408385031215610ed557600080fd5b825191506020830151610d4181610bb5565b634e487b7160e01b600052603260045260246000fd5b600082821015610f1d57634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220915468361be823ae5365f3f0230f8e14544000fb9f122eaf015075b2b069eabd64736f6c634300080b0033",
  "deployedBytecode": "0x6080604052600436106100fe5760003560e01c8063542774b511610095578063ca15c87311610064578063ca15c87314610302578063cfdb63ac14610322578063d547741f14610352578063ef4f081f14610372578063f1382b26146103af57600080fd5b8063542774b5146102685780639010d07c1461029d57806391d14854146102bd578063a217fddf146102ed57600080fd5b8063318c136e116100d1578063318c136e1461019b57806336568abe146101e75780633d94ebc6146102075780634e0df3f61461024857600080fd5b80631af5fe3814610103578063248a9ca31461012557806325307065146101685780632f2ff15d1461017b575b600080fd5b34801561010f57600080fd5b5061012361011e366004610bcd565b6103cf565b005b34801561013157600080fd5b50610155610140366004610c0d565b60009081526020819052604090206002015490565b6040519081526020015b60405180910390f35b610123610176366004610c6f565b610414565b34801561018757600080fd5b50610123610196366004610d1c565b610504565b3480156101a757600080fd5b506101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161015f565b3480156101f357600080fd5b50610123610202366004610d1c565b610592565b34801561021357600080fd5b506101cf610222366004610d4c565b60016020908152600092835260408084209091529082529020546001600160a01b031681565b34801561025457600080fd5b50610155610263366004610d1c565b61060c565b34801561027457600080fd5b5060408051808201825260068152653937baba32b960d11b6020820152905161015f9190610d76565b3480156102a957600080fd5b506101cf6102b8366004610dcb565b610637565b3480156102c957600080fd5b506102dd6102d8366004610d1c565b610656565b604051901515815260200161015f565b3480156102f957600080fd5b50610155600081565b34801561030e57600080fd5b5061015561031d366004610c0d565b61066e565b34801561032e57600080fd5b506102dd61033d366004610ded565b60026020526000908152604090205460ff1681565b34801561035e57600080fd5b5061012361036d366004610d1c565b610685565b34801561037e57600080fd5b5061039261038d366004610c6f565b610706565b604080519283526001600160a01b0390911660208301520161015f565b3480156103bb57600080fd5b506101236103ca366004610e0a565b6107e3565b6103d7610863565b60ff9290921660009081526001602090815260408083209383529290522080546001600160a01b0319166001600160a01b03909216919091179055565b61041c6108bc565b6001600160a01b03881660009081526002602052604090205460ff161561046857341561046357604051634dc2c71160e01b81523460048201526024015b60405180910390fd5b6104fa565b60ff8616600090815260016020908152604080832088845290915290819020549051632530706560e01b81526001600160a01b0390911690819063253070659034906104c6908d908d908d908d908d908d908d908d90600401610e66565b6000604051808303818588803b1580156104df57600080fd5b505af11580156104f3573d6000803e3d6000fd5b5050505050505b5050505050505050565b6000828152602081905260409020600201546105209033610656565b6105845760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526e0818591b5a5b881d1bc819dc985b9d608a1b606482015260840161045a565b61058e8282610934565b5050565b6001600160a01b03811633146106025760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161045a565b61058e828261098d565b6000828152602081815260408083206001600160a01b03851684526001019091529020545b92915050565b600082815260208190526040812061064f90836109e6565b9392505050565b600082815260208190526040812061064f90836109f2565b600081815260208190526040812061063190610a14565b6000828152602081905260409020600201546106a19033610656565b6106025760405162461bcd60e51b815260206004820152603060248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526f2061646d696e20746f207265766f6b6560801b606482015260840161045a565b6001600160a01b038816600090815260026020526040812054819060ff1615610734575060009050806107d6565b60ff881660009081526001602090815260408083208a84529091529081902054905163ef4f081f60e01b81526001600160a01b0390911690819063ef4f081f90610790908e908e908e908e908e908e908e908e90600401610e66565b6040805180830381865afa1580156107ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d09190610ec2565b92509250505b9850989650505050505050565b6107eb610863565b6001600160a01b038216600081815260026020908152604091829020805460ff19168515159081179091558251938452908301527fb840a1dbd8b09a3dc45161bba92dfb9aba643c0e44c085a447f839d1d02cf13b910160405180910390a15050565b600061064f836001600160a01b038416610a1e565b61086e600033610656565b6108ba5760405162461bcd60e51b815260206004820152601e60248201527f73656e64657220646f65736e277420686176652061646d696e20726f6c650000604482015260640161045a565b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108ba5760405162461bcd60e51b815260206004820152601e60248201527f73656e646572206d7573742062652062726964676520636f6e74726163740000604482015260640161045a565b600082815260208190526040902061094c908261084e565b1561058e5760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d90600090a45050565b60008281526020819052604090206109a59082610a6d565b1561058e5760405133906001600160a01b0383169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90600090a45050565b600061064f8383610a82565b6001600160a01b0381166000908152600183016020526040812054151561064f565b6000610631825490565b6000818152600183016020526040812054610a6557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610631565b506000610631565b600061064f836001600160a01b038416610aac565b6000826000018281548110610a9957610a99610ee7565b9060005260206000200154905092915050565b60008181526001830160205260408120548015610b95576000610ad0600183610efd565b8554909150600090610ae490600190610efd565b9050818114610b49576000866000018281548110610b0457610b04610ee7565b9060005260206000200154905080876000018481548110610b2757610b27610ee7565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610b5a57610b5a610f22565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610631565b6000915050610631565b803560ff81168114610bb057600080fd5b919050565b6001600160a01b0381168114610bca57600080fd5b50565b600080600060608486031215610be257600080fd5b610beb84610b9f565b9250602084013591506040840135610c0281610bb5565b809150509250925092565b600060208284031215610c1f57600080fd5b5035919050565b60008083601f840112610c3857600080fd5b50813567ffffffffffffffff811115610c5057600080fd5b602083019150836020828501011115610c6857600080fd5b9250929050565b60008060008060008060008060c0898b031215610c8b57600080fd5b8835610c9681610bb5565b9750610ca460208a01610b9f565b9650610cb260408a01610b9f565b955060608901359450608089013567ffffffffffffffff80821115610cd657600080fd5b610ce28c838d01610c26565b909650945060a08b0135915080821115610cfb57600080fd5b50610d088b828c01610c26565b999c989b5096995094979396929594505050565b60008060408385031215610d2f57600080fd5b823591506020830135610d4181610bb5565b809150509250929050565b60008060408385031215610d5f57600080fd5b610d6883610b9f565b946020939093013593505050565b600060208083528351808285015260005b81811015610da357858101830151858201604001528201610d87565b81811115610db5576000604083870101525b50601f01601f1916929092016040019392505050565b60008060408385031215610dde57600080fd5b50508035926020909101359150565b600060208284031215610dff57600080fd5b813561064f81610bb5565b60008060408385031215610e1d57600080fd5b8235610e2881610bb5565b915060208301358015158114610d4157600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038916815260ff8816602082015260ff8716604082015285606082015260c060808201526000610ea060c083018688610e3d565b82810360a0840152610eb3818587610e3d565b9b9a5050505050505050505050565b60008060408385031215610ed557600080fd5b825191506020830151610d4181610bb5565b634e487b7160e01b600052603260045260246000fd5b600082821015610f1d57634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220915468361be823ae5365f3f0230f8e14544000fb9f122eaf015075b2b069eabd64736f6c634300080b0033",
  "immutableReferences": {
    "14928": [
      {
        "length": 32,
        "start": 429
      },
      {
        "length": 32,
        "start": 2247
      }
    ]
  },
  "generatedSources": [
    {
      "ast": {
        "nodeType": "YulBlock",
        "src": "0:306:105",
        "statements": [
          {
            "nodeType": "YulBlock",
            "src": "6:3:105",
            "statements": []
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "95:209:105",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "141:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "150:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "153:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "143:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "143:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "143:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "116:7:105"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "125:9:105"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "112:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "112:23:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "137:2:105",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "108:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "108:32:105"
                  },
                  "nodeType": "YulIf",
                  "src": "105:52:105"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "166:29:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "185:9:105"
                      }
                    ],
                    "functionName": {
                      "name": "mload",
                      "nodeType": "YulIdentifier",
                      "src": "179:5:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "179:16:105"
                  },
                  "variables": [
                    {
                      "name": "value",
                      "nodeType": "YulTypedName",
                      "src": "170:5:105",
                      "type": ""
                    }
                  ]
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "258:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "267:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "270:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "260:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "260:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "260:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "value",
                            "nodeType": "YulIdentifier",
                            "src": "217:5:105"
                          },
                          {
                            "arguments": [
                              {
                                "name": "value",
                                "nodeType": "YulIdentifier",
                                "src": "228:5:105"
                              },
                              {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "243:3:105",
                                        "type": "",
                                        "value": "160"
                                      },
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "248:1:105",
                                        "type": "",
                                        "value": "1"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "shl",
                                      "nodeType": "YulIdentifier",
                                      "src": "239:3:105"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "239:11:105"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "252:1:105",
                                    "type": "",
                                    "value": "1"
                                  }
                                ],
                                "functionName": {
                                  "name": "sub",
                                  "nodeType": "YulIdentifier",
                                  "src": "235:3:105"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "235:19:105"
                              }
                            ],
                            "functionName": {
                              "name": "and",
                              "nodeType": "YulIdentifier",
                              "src": "224:3:105"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "224:31:105"
                          }
                        ],
                        "functionName": {
                          "name": "eq",
                          "nodeType": "YulIdentifier",
                          "src": "214:2:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "214:42:105"
                      }
                    ],
                    "functionName": {
                      "name": "iszero",
                      "nodeType": "YulIdentifier",
                      "src": "207:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "207:50:105"
                  },
                  "nodeType": "YulIf",
                  "src": "204:70:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "283:15:105",
                  "value": {
                    "name": "value",
                    "nodeType": "YulIdentifier",
                    "src": "293:5:105"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "283:6:105"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_address_fromMemory",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "61:9:105",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "72:7:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "84:6:105",
                "type": ""
              }
            ],
            "src": "14:290:105"
          }
        ]
      },
      "contents": "{\n    { }\n    function abi_decode_tuple_t_address_fromMemory(headStart, dataEnd) -> value0\n    {\n        if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n        let value := mload(headStart)\n        if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n        value0 := value\n    }\n}",
      "id": 105,
      "language": "Yul",
      "name": "#utility.yul"
    }
  ],
  "deployedGeneratedSources": [
    {
      "ast": {
        "nodeType": "YulBlock",
        "src": "0:9889:105",
        "statements": [
          {
            "nodeType": "YulBlock",
            "src": "6:3:105",
            "statements": []
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "61:109:105",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "71:29:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "offset",
                        "nodeType": "YulIdentifier",
                        "src": "93:6:105"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "80:12:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "80:20:105"
                  },
                  "variableNames": [
                    {
                      "name": "value",
                      "nodeType": "YulIdentifier",
                      "src": "71:5:105"
                    }
                  ]
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "148:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "157:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "160:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "150:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "150:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "150:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "value",
                            "nodeType": "YulIdentifier",
                            "src": "122:5:105"
                          },
                          {
                            "arguments": [
                              {
                                "name": "value",
                                "nodeType": "YulIdentifier",
                                "src": "133:5:105"
                              },
                              {
                                "kind": "number",
                                "nodeType": "YulLiteral",
                                "src": "140:4:105",
                                "type": "",
                                "value": "0xff"
                              }
                            ],
                            "functionName": {
                              "name": "and",
                              "nodeType": "YulIdentifier",
                              "src": "129:3:105"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "129:16:105"
                          }
                        ],
                        "functionName": {
                          "name": "eq",
                          "nodeType": "YulIdentifier",
                          "src": "119:2:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "119:27:105"
                      }
                    ],
                    "functionName": {
                      "name": "iszero",
                      "nodeType": "YulIdentifier",
                      "src": "112:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "112:35:105"
                  },
                  "nodeType": "YulIf",
                  "src": "109:55:105"
                }
              ]
            },
            "name": "abi_decode_uint8",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "offset",
                "nodeType": "YulTypedName",
                "src": "40:6:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value",
                "nodeType": "YulTypedName",
                "src": "51:5:105",
                "type": ""
              }
            ],
            "src": "14:156:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "233:86:105",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "297:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "306:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "309:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "299:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "299:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "299:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "value",
                            "nodeType": "YulIdentifier",
                            "src": "256:5:105"
                          },
                          {
                            "arguments": [
                              {
                                "name": "value",
                                "nodeType": "YulIdentifier",
                                "src": "267:5:105"
                              },
                              {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "282:3:105",
                                        "type": "",
                                        "value": "160"
                                      },
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "287:1:105",
                                        "type": "",
                                        "value": "1"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "shl",
                                      "nodeType": "YulIdentifier",
                                      "src": "278:3:105"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "278:11:105"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "291:1:105",
                                    "type": "",
                                    "value": "1"
                                  }
                                ],
                                "functionName": {
                                  "name": "sub",
                                  "nodeType": "YulIdentifier",
                                  "src": "274:3:105"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "274:19:105"
                              }
                            ],
                            "functionName": {
                              "name": "and",
                              "nodeType": "YulIdentifier",
                              "src": "263:3:105"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "263:31:105"
                          }
                        ],
                        "functionName": {
                          "name": "eq",
                          "nodeType": "YulIdentifier",
                          "src": "253:2:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "253:42:105"
                      }
                    ],
                    "functionName": {
                      "name": "iszero",
                      "nodeType": "YulIdentifier",
                      "src": "246:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "246:50:105"
                  },
                  "nodeType": "YulIf",
                  "src": "243:70:105"
                }
              ]
            },
            "name": "validator_revert_contract_IFeeHandler",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "value",
                "nodeType": "YulTypedName",
                "src": "222:5:105",
                "type": ""
              }
            ],
            "src": "175:144:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "447:296:105",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "493:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "502:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "505:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "495:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "495:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "495:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "468:7:105"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "477:9:105"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "464:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "464:23:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "489:2:105",
                        "type": "",
                        "value": "96"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "460:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "460:32:105"
                  },
                  "nodeType": "YulIf",
                  "src": "457:52:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "518:37:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "545:9:105"
                      }
                    ],
                    "functionName": {
                      "name": "abi_decode_uint8",
                      "nodeType": "YulIdentifier",
                      "src": "528:16:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "528:27:105"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "518:6:105"
                    }
                  ]
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "564:42:105",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "591:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "602:2:105",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "587:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "587:18:105"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "574:12:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "574:32:105"
                  },
                  "variableNames": [
                    {
                      "name": "value1",
                      "nodeType": "YulIdentifier",
                      "src": "564:6:105"
                    }
                  ]
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "615:45:105",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "645:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "656:2:105",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "641:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "641:18:105"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "628:12:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "628:32:105"
                  },
                  "variables": [
                    {
                      "name": "value",
                      "nodeType": "YulTypedName",
                      "src": "619:5:105",
                      "type": ""
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "value",
                        "nodeType": "YulIdentifier",
                        "src": "707:5:105"
                      }
                    ],
                    "functionName": {
                      "name": "validator_revert_contract_IFeeHandler",
                      "nodeType": "YulIdentifier",
                      "src": "669:37:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "669:44:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "669:44:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "722:15:105",
                  "value": {
                    "name": "value",
                    "nodeType": "YulIdentifier",
                    "src": "732:5:105"
                  },
                  "variableNames": [
                    {
                      "name": "value2",
                      "nodeType": "YulIdentifier",
                      "src": "722:6:105"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_uint8t_bytes32t_contract$_IFeeHandler_$18265",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "397:9:105",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "408:7:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "420:6:105",
                "type": ""
              },
              {
                "name": "value1",
                "nodeType": "YulTypedName",
                "src": "428:6:105",
                "type": ""
              },
              {
                "name": "value2",
                "nodeType": "YulTypedName",
                "src": "436:6:105",
                "type": ""
              }
            ],
            "src": "324:419:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "818:110:105",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "864:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "873:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "876:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "866:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "866:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "866:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "839:7:105"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "848:9:105"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "835:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "835:23:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "860:2:105",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "831:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "831:32:105"
                  },
                  "nodeType": "YulIf",
                  "src": "828:52:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "889:33:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "912:9:105"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "899:12:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "899:23:105"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "889:6:105"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_bytes32",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "784:9:105",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "795:7:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "807:6:105",
                "type": ""
              }
            ],
            "src": "748:180:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "1034:76:105",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "1044:26:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "1056:9:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "1067:2:105",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "1052:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1052:18:105"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "1044:4:105"
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "1086:9:105"
                      },
                      {
                        "name": "value0",
                        "nodeType": "YulIdentifier",
                        "src": "1097:6:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "1079:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1079:25:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "1079:25:105"
                }
              ]
            },
            "name": "abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "1003:9:105",
                "type": ""
              },
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "1014:6:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "1025:4:105",
                "type": ""
              }
            ],
            "src": "933:177:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "1187:275:105",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "1236:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1245:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1248:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "1238:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "1238:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "1238:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "name": "offset",
                                "nodeType": "YulIdentifier",
                                "src": "1215:6:105"
                              },
                              {
                                "kind": "number",
                                "nodeType": "YulLiteral",
                                "src": "1223:4:105",
                                "type": "",
                                "value": "0x1f"
                              }
                            ],
                            "functionName": {
                              "name": "add",
                              "nodeType": "YulIdentifier",
                              "src": "1211:3:105"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "1211:17:105"
                          },
                          {
                            "name": "end",
                            "nodeType": "YulIdentifier",
                            "src": "1230:3:105"
                          }
                        ],
                        "functionName": {
                          "name": "slt",
                          "nodeType": "YulIdentifier",
                          "src": "1207:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "1207:27:105"
                      }
                    ],
                    "functionName": {
                      "name": "iszero",
                      "nodeType": "YulIdentifier",
                      "src": "1200:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1200:35:105"
                  },
                  "nodeType": "YulIf",
                  "src": "1197:55:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "1261:30:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "offset",
                        "nodeType": "YulIdentifier",
                        "src": "1284:6:105"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "1271:12:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1271:20:105"
                  },
                  "variableNames": [
                    {
                      "name": "length",
                      "nodeType": "YulIdentifier",
                      "src": "1261:6:105"
                    }
                  ]
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "1334:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1343:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1346:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "1336:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "1336:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "1336:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "name": "length",
                        "nodeType": "YulIdentifier",
                        "src": "1306:6:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "1314:18:105",
                        "type": "",
                        "value": "0xffffffffffffffff"
                      }
                    ],
                    "functionName": {
                      "name": "gt",
                      "nodeType": "YulIdentifier",
                      "src": "1303:2:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1303:30:105"
                  },
                  "nodeType": "YulIf",
                  "src": "1300:50:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "1359:29:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "offset",
                        "nodeType": "YulIdentifier",
                        "src": "1375:6:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "1383:4:105",
                        "type": "",
                        "value": "0x20"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "1371:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1371:17:105"
                  },
                  "variableNames": [
                    {
                      "name": "arrayPos",
                      "nodeType": "YulIdentifier",
                      "src": "1359:8:105"
                    }
                  ]
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "1440:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1449:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1452:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "1442:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "1442:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "1442:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "name": "offset",
                                "nodeType": "YulIdentifier",
                                "src": "1411:6:105"
                              },
                              {
                                "name": "length",
                                "nodeType": "YulIdentifier",
                                "src": "1419:6:105"
                              }
                            ],
                            "functionName": {
                              "name": "add",
                              "nodeType": "YulIdentifier",
                              "src": "1407:3:105"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "1407:19:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "1428:4:105",
                            "type": "",
                            "value": "0x20"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "1403:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "1403:30:105"
                      },
                      {
                        "name": "end",
                        "nodeType": "YulIdentifier",
                        "src": "1435:3:105"
                      }
                    ],
                    "functionName": {
                      "name": "gt",
                      "nodeType": "YulIdentifier",
                      "src": "1400:2:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1400:39:105"
                  },
                  "nodeType": "YulIf",
                  "src": "1397:59:105"
                }
              ]
            },
            "name": "abi_decode_bytes_calldata",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "offset",
                "nodeType": "YulTypedName",
                "src": "1150:6:105",
                "type": ""
              },
              {
                "name": "end",
                "nodeType": "YulTypedName",
                "src": "1158:3:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "arrayPos",
                "nodeType": "YulTypedName",
                "src": "1166:8:105",
                "type": ""
              },
              {
                "name": "length",
                "nodeType": "YulTypedName",
                "src": "1176:6:105",
                "type": ""
              }
            ],
            "src": "1115:347:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "1656:887:105",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "1703:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1712:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1715:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "1705:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "1705:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "1705:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "1677:7:105"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "1686:9:105"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "1673:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "1673:23:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "1698:3:105",
                        "type": "",
                        "value": "192"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "1669:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1669:33:105"
                  },
                  "nodeType": "YulIf",
                  "src": "1666:53:105"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "1728:36:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "1754:9:105"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "1741:12:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1741:23:105"
                  },
                  "variables": [
                    {
                      "name": "value",
                      "nodeType": "YulTypedName",
                      "src": "1732:5:105",
                      "type": ""
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "value",
                        "nodeType": "YulIdentifier",
                        "src": "1811:5:105"
                      }
                    ],
                    "functionName": {
                      "name": "validator_revert_contract_IFeeHandler",
                      "nodeType": "YulIdentifier",
                      "src": "1773:37:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1773:44:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "1773:44:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "1826:15:105",
                  "value": {
                    "name": "value",
                    "nodeType": "YulIdentifier",
                    "src": "1836:5:105"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "1826:6:105"
                    }
                  ]
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "1850:46:105",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "1881:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "1892:2:105",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "1877:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "1877:18:105"
                      }
                    ],
                    "functionName": {
                      "name": "abi_decode_uint8",
                      "nodeType": "YulIdentifier",
                      "src": "1860:16:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1860:36:105"
                  },
                  "variableNames": [
                    {
                      "name": "value1",
                      "nodeType": "YulIdentifier",
                      "src": "1850:6:105"
                    }
                  ]
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "1905:46:105",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "1936:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "1947:2:105",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "1932:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "1932:18:105"
                      }
                    ],
                    "functionName": {
                      "name": "abi_decode_uint8",
                      "nodeType": "YulIdentifier",
                      "src": "1915:16:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1915:36:105"
                  },
                  "variableNames": [
                    {
                      "name": "value2",
                      "nodeType": "YulIdentifier",
                      "src": "1905:6:105"
                    }
                  ]
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "1960:42:105",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "1987:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "1998:2:105",
                            "type": "",
                            "value": "96"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "1983:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "1983:18:105"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "1970:12:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1970:32:105"
                  },
                  "variableNames": [
                    {
                      "name": "value3",
                      "nodeType": "YulIdentifier",
                      "src": "1960:6:105"
                    }
                  ]
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "2011:47:105",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "2042:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "2053:3:105",
                            "type": "",
                            "value": "128"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "2038:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "2038:19:105"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "2025:12:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2025:33:105"
                  },
                  "variables": [
                    {
                      "name": "offset",
                      "nodeType": "YulTypedName",
                      "src": "2015:6:105",
                      "type": ""
                    }
                  ]
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "2067:28:105",
                  "value": {
                    "kind": "number",
                    "nodeType": "YulLiteral",
                    "src": "2077:18:105",
                    "type": "",
                    "value": "0xffffffffffffffff"
                  },
                  "variables": [
                    {
                      "name": "_1",
                      "nodeType": "YulTypedName",
                      "src": "2071:2:105",
                      "type": ""
                    }
                  ]
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "2122:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "2131:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "2134:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "2124:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "2124:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "2124:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "name": "offset",
                        "nodeType": "YulIdentifier",
                        "src": "2110:6:105"
                      },
                      {
                        "name": "_1",
                        "nodeType": "YulIdentifier",
                        "src": "2118:2:105"
                      }
                    ],
                    "functionName": {
                      "name": "gt",
                      "nodeType": "YulIdentifier",
                      "src": "2107:2:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2107:14:105"
                  },
                  "nodeType": "YulIf",
                  "src": "2104:34:105"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "2147:84:105",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "2203:9:105"
                          },
                          {
                            "name": "offset",
                            "nodeType": "YulIdentifier",
                            "src": "2214:6:105"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "2199:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "2199:22:105"
                      },
                      {
                        "name": "dataEnd",
                        "nodeType": "YulIdentifier",
                        "src": "2223:7:105"
                      }
                    ],
                    "functionName": {
                      "name": "abi_decode_bytes_calldata",
                      "nodeType": "YulIdentifier",
                      "src": "2173:25:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2173:58:105"
                  },
                  "variables": [
                    {
                      "name": "value4_1",
                      "nodeType": "YulTypedName",
                      "src": "2151:8:105",
                      "type": ""
                    },
                    {
                      "name": "value5_1",
                      "nodeType": "YulTypedName",
                      "src": "2161:8:105",
                      "type": ""
                    }
                  ]
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "2240:18:105",
                  "value": {
                    "name": "value4_1",
                    "nodeType": "YulIdentifier",
                    "src": "2250:8:105"
                  },
                  "variableNames": [
                    {
                      "name": "value4",
                      "nodeType": "YulIdentifier",
                      "src": "2240:6:105"
                    }
                  ]
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "2267:18:105",
                  "value": {
                    "name": "value5_1",
                    "nodeType": "YulIdentifier",
                    "src": "2277:8:105"
                  },
                  "variableNames": [
                    {
                      "name": "value5",
                      "nodeType": "YulIdentifier",
                      "src": "2267:6:105"
                    }
                  ]
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "2294:49:105",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "2327:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "2338:3:105",
                            "type": "",
                            "value": "160"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "2323:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "2323:19:105"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "2310:12:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2310:33:105"
                  },
                  "variables": [
                    {
                      "name": "offset_1",
                      "nodeType": "YulTypedName",
                      "src": "2298:8:105",
                      "type": ""
                    }
                  ]
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "2372:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "2381:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "2384:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "2374:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "2374:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "2374:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "name": "offset_1",
                        "nodeType": "YulIdentifier",
                        "src": "2358:8:105"
                      },
                      {
                        "name": "_1",
                        "nodeType": "YulIdentifier",
                        "src": "2368:2:105"
                      }
                    ],
                    "functionName": {
                      "name": "gt",
                      "nodeType": "YulIdentifier",
                      "src": "2355:2:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2355:16:105"
                  },
                  "nodeType": "YulIf",
                  "src": "2352:36:105"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "2397:86:105",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "2453:9:105"
                          },
                          {
                            "name": "offset_1",
                            "nodeType": "YulIdentifier",
                            "src": "2464:8:105"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "2449:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "2449:24:105"
                      },
                      {
                        "name": "dataEnd",
                        "nodeType": "YulIdentifier",
                        "src": "2475:7:105"
                      }
                    ],
                    "functionName": {
                      "name": "abi_decode_bytes_calldata",
                      "nodeType": "YulIdentifier",
                      "src": "2423:25:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2423:60:105"
                  },
                  "variables": [
                    {
                      "name": "value6_1",
                      "nodeType": "YulTypedName",
                      "src": "2401:8:105",
                      "type": ""
                    },
                    {
                      "name": "value7_1",
                      "nodeType": "YulTypedName",
                      "src": "2411:8:105",
                      "type": ""
                    }
                  ]
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "2492:18:105",
                  "value": {
                    "name": "value6_1",
                    "nodeType": "YulIdentifier",
                    "src": "2502:8:105"
                  },
                  "variableNames": [
                    {
                      "name": "value6",
                      "nodeType": "YulIdentifier",
                      "src": "2492:6:105"
                    }
                  ]
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "2519:18:105",
                  "value": {
                    "name": "value7_1",
                    "nodeType": "YulIdentifier",
                    "src": "2529:8:105"
                  },
                  "variableNames": [
                    {
                      "name": "value7",
                      "nodeType": "YulIdentifier",
                      "src": "2519:6:105"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_addresst_uint8t_uint8t_bytes32t_bytes_calldata_ptrt_bytes_calldata_ptr",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "1566:9:105",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "1577:7:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "1589:6:105",
                "type": ""
              },
              {
                "name": "value1",
                "nodeType": "YulTypedName",
                "src": "1597:6:105",
                "type": ""
              },
              {
                "name": "value2",
                "nodeType": "YulTypedName",
                "src": "1605:6:105",
                "type": ""
              },
              {
                "name": "value3",
                "nodeType": "YulTypedName",
                "src": "1613:6:105",
                "type": ""
              },
              {
                "name": "value4",
                "nodeType": "YulTypedName",
                "src": "1621:6:105",
                "type": ""
              },
              {
                "name": "value5",
                "nodeType": "YulTypedName",
                "src": "1629:6:105",
                "type": ""
              },
              {
                "name": "value6",
                "nodeType": "YulTypedName",
                "src": "1637:6:105",
                "type": ""
              },
              {
                "name": "value7",
                "nodeType": "YulTypedName",
                "src": "1645:6:105",
                "type": ""
              }
            ],
            "src": "1467:1076:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "2635:241:105",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "2681:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "2690:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "2693:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "2683:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "2683:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "2683:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "2656:7:105"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "2665:9:105"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "2652:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "2652:23:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "2677:2:105",
                        "type": "",
                        "value": "64"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "2648:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2648:32:105"
                  },
                  "nodeType": "YulIf",
                  "src": "2645:52:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "2706:33:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "2729:9:105"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "2716:12:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2716:23:105"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "2706:6:105"
                    }
                  ]
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "2748:45:105",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "2778:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "2789:2:105",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "2774:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "2774:18:105"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "2761:12:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2761:32:105"
                  },
                  "variables": [
                    {
                      "name": "value",
                      "nodeType": "YulTypedName",
                      "src": "2752:5:105",
                      "type": ""
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "value",
                        "nodeType": "YulIdentifier",
                        "src": "2840:5:105"
                      }
                    ],
                    "functionName": {
                      "name": "validator_revert_contract_IFeeHandler",
                      "nodeType": "YulIdentifier",
                      "src": "2802:37:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2802:44:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "2802:44:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "2855:15:105",
                  "value": {
                    "name": "value",
                    "nodeType": "YulIdentifier",
                    "src": "2865:5:105"
                  },
                  "variableNames": [
                    {
                      "name": "value1",
                      "nodeType": "YulIdentifier",
                      "src": "2855:6:105"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_bytes32t_address",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "2593:9:105",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "2604:7:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "2616:6:105",
                "type": ""
              },
              {
                "name": "value1",
                "nodeType": "YulTypedName",
                "src": "2624:6:105",
                "type": ""
              }
            ],
            "src": "2548:328:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "2982:102:105",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "2992:26:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "3004:9:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "3015:2:105",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "3000:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3000:18:105"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "2992:4:105"
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "3034:9:105"
                      },
                      {
                        "arguments": [
                          {
                            "name": "value0",
                            "nodeType": "YulIdentifier",
                            "src": "3049:6:105"
                          },
                          {
                            "arguments": [
                              {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "3065:3:105",
                                    "type": "",
                                    "value": "160"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "3070:1:105",
                                    "type": "",
                                    "value": "1"
                                  }
                                ],
                                "functionName": {
                                  "name": "shl",
                                  "nodeType": "YulIdentifier",
                                  "src": "3061:3:105"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "3061:11:105"
                              },
                              {
                                "kind": "number",
                                "nodeType": "YulLiteral",
                                "src": "3074:1:105",
                                "type": "",
                                "value": "1"
                              }
                            ],
                            "functionName": {
                              "name": "sub",
                              "nodeType": "YulIdentifier",
                              "src": "3057:3:105"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "3057:19:105"
                          }
                        ],
                        "functionName": {
                          "name": "and",
                          "nodeType": "YulIdentifier",
                          "src": "3045:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "3045:32:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "3027:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3027:51:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "3027:51:105"
                }
              ]
            },
            "name": "abi_encode_tuple_t_address__to_t_address__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "2951:9:105",
                "type": ""
              },
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "2962:6:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "2973:4:105",
                "type": ""
              }
            ],
            "src": "2881:203:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "3174:165:105",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "3220:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "3229:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "3232:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "3222:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "3222:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "3222:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "3195:7:105"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "3204:9:105"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "3191:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "3191:23:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "3216:2:105",
                        "type": "",
                        "value": "64"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "3187:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3187:32:105"
                  },
                  "nodeType": "YulIf",
                  "src": "3184:52:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "3245:37:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "3272:9:105"
                      }
                    ],
                    "functionName": {
                      "name": "abi_decode_uint8",
                      "nodeType": "YulIdentifier",
                      "src": "3255:16:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3255:27:105"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "3245:6:105"
                    }
                  ]
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "3291:42:105",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "3318:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "3329:2:105",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "3314:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "3314:18:105"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "3301:12:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3301:32:105"
                  },
                  "variableNames": [
                    {
                      "name": "value1",
                      "nodeType": "YulIdentifier",
                      "src": "3291:6:105"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_uint8t_bytes32",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "3132:9:105",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "3143:7:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "3155:6:105",
                "type": ""
              },
              {
                "name": "value1",
                "nodeType": "YulTypedName",
                "src": "3163:6:105",
                "type": ""
              }
            ],
            "src": "3089:250:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "3466:102:105",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "3476:26:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "3488:9:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "3499:2:105",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "3484:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3484:18:105"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "3476:4:105"
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "3518:9:105"
                      },
                      {
                        "arguments": [
                          {
                            "name": "value0",
                            "nodeType": "YulIdentifier",
                            "src": "3533:6:105"
                          },
                          {
                            "arguments": [
                              {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "3549:3:105",
                                    "type": "",
                                    "value": "160"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "3554:1:105",
                                    "type": "",
                                    "value": "1"
                                  }
                                ],
                                "functionName": {
                                  "name": "shl",
                                  "nodeType": "YulIdentifier",
                                  "src": "3545:3:105"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "3545:11:105"
                              },
                              {
                                "kind": "number",
                                "nodeType": "YulLiteral",
                                "src": "3558:1:105",
                                "type": "",
                                "value": "1"
                              }
                            ],
                            "functionName": {
                              "name": "sub",
                              "nodeType": "YulIdentifier",
                              "src": "3541:3:105"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "3541:19:105"
                          }
                        ],
                        "functionName": {
                          "name": "and",
                          "nodeType": "YulIdentifier",
                          "src": "3529:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "3529:32:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "3511:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3511:51:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "3511:51:105"
                }
              ]
            },
            "name": "abi_encode_tuple_t_contract$_IFeeHandler_$18265__to_t_address__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "3435:9:105",
                "type": ""
              },
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "3446:6:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "3457:4:105",
                "type": ""
              }
            ],
            "src": "3344:224:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "3674:76:105",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "3684:26:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "3696:9:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "3707:2:105",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "3692:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3692:18:105"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "3684:4:105"
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "3726:9:105"
                      },
                      {
                        "name": "value0",
                        "nodeType": "YulIdentifier",
                        "src": "3737:6:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "3719:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3719:25:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "3719:25:105"
                }
              ]
            },
            "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "3643:9:105",
                "type": ""
              },
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "3654:6:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "3665:4:105",
                "type": ""
              }
            ],
            "src": "3573:177:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "3876:476:105",
              "statements": [
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "3886:12:105",
                  "value": {
                    "kind": "number",
                    "nodeType": "YulLiteral",
                    "src": "3896:2:105",
                    "type": "",
                    "value": "32"
                  },
                  "variables": [
                    {
                      "name": "_1",
                      "nodeType": "YulTypedName",
                      "src": "3890:2:105",
                      "type": ""
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "3914:9:105"
                      },
                      {
                        "name": "_1",
                        "nodeType": "YulIdentifier",
                        "src": "3925:2:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "3907:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3907:21:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "3907:21:105"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "3937:27:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "value0",
                        "nodeType": "YulIdentifier",
                        "src": "3957:6:105"
                      }
                    ],
                    "functionName": {
                      "name": "mload",
                      "nodeType": "YulIdentifier",
                      "src": "3951:5:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3951:13:105"
                  },
                  "variables": [
                    {
                      "name": "length",
                      "nodeType": "YulTypedName",
                      "src": "3941:6:105",
                      "type": ""
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "3984:9:105"
                          },
                          {
                            "name": "_1",
                            "nodeType": "YulIdentifier",
                            "src": "3995:2:105"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "3980:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "3980:18:105"
                      },
                      {
                        "name": "length",
                        "nodeType": "YulIdentifier",
                        "src": "4000:6:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "3973:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3973:34:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "3973:34:105"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "4016:10:105",
                  "value": {
                    "kind": "number",
                    "nodeType": "YulLiteral",
                    "src": "4025:1:105",
                    "type": "",
                    "value": "0"
                  },
                  "variables": [
                    {
                      "name": "i",
                      "nodeType": "YulTypedName",
                      "src": "4020:1:105",
                      "type": ""
                    }
                  ]
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "4085:90:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "arguments": [
                                {
                                  "arguments": [
                                    {
                                      "name": "headStart",
                                      "nodeType": "YulIdentifier",
                                      "src": "4114:9:105"
                                    },
                                    {
                                      "name": "i",
                                      "nodeType": "YulIdentifier",
                                      "src": "4125:1:105"
                                    }
                                  ],
                                  "functionName": {
                                    "name": "add",
                                    "nodeType": "YulIdentifier",
                                    "src": "4110:3:105"
                                  },
                                  "nodeType": "YulFunctionCall",
                                  "src": "4110:17:105"
                                },
                                {
                                  "kind": "number",
                                  "nodeType": "YulLiteral",
                                  "src": "4129:2:105",
                                  "type": "",
                                  "value": "64"
                                }
                              ],
                              "functionName": {
                                "name": "add",
                                "nodeType": "YulIdentifier",
                                "src": "4106:3:105"
                              },
                              "nodeType": "YulFunctionCall",
                              "src": "4106:26:105"
                            },
                            {
                              "arguments": [
                                {
                                  "arguments": [
                                    {
                                      "arguments": [
                                        {
                                          "name": "value0",
                                          "nodeType": "YulIdentifier",
                                          "src": "4148:6:105"
                                        },
                                        {
                                          "name": "i",
                                          "nodeType": "YulIdentifier",
                                          "src": "4156:1:105"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "add",
                                        "nodeType": "YulIdentifier",
                                        "src": "4144:3:105"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "4144:14:105"
                                    },
                                    {
                                      "name": "_1",
                                      "nodeType": "YulIdentifier",
                                      "src": "4160:2:105"
                                    }
                                  ],
                                  "functionName": {
                                    "name": "add",
                                    "nodeType": "YulIdentifier",
                                    "src": "4140:3:105"
                                  },
                                  "nodeType": "YulFunctionCall",
                                  "src": "4140:23:105"
                                }
                              ],
                              "functionName": {
                                "name": "mload",
                                "nodeType": "YulIdentifier",
                                "src": "4134:5:105"
                              },
                              "nodeType": "YulFunctionCall",
                              "src": "4134:30:105"
                            }
                          ],
                          "functionName": {
                            "name": "mstore",
                            "nodeType": "YulIdentifier",
                            "src": "4099:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "4099:66:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "4099:66:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "name": "i",
                        "nodeType": "YulIdentifier",
                        "src": "4046:1:105"
                      },
                      {
                        "name": "length",
                        "nodeType": "YulIdentifier",
                        "src": "4049:6:105"
                      }
                    ],
                    "functionName": {
                      "name": "lt",
                      "nodeType": "YulIdentifier",
                      "src": "4043:2:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4043:13:105"
                  },
                  "nodeType": "YulForLoop",
                  "post": {
                    "nodeType": "YulBlock",
                    "src": "4057:19:105",
                    "statements": [
                      {
                        "nodeType": "YulAssignment",
                        "src": "4059:15:105",
                        "value": {
                          "arguments": [
                            {
                              "name": "i",
                              "nodeType": "YulIdentifier",
                              "src": "4068:1:105"
                            },
                            {
                              "name": "_1",
                              "nodeType": "YulIdentifier",
                              "src": "4071:2:105"
                            }
                          ],
                          "functionName": {
                            "name": "add",
                            "nodeType": "YulIdentifier",
                            "src": "4064:3:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "4064:10:105"
                        },
                        "variableNames": [
                          {
                            "name": "i",
                            "nodeType": "YulIdentifier",
                            "src": "4059:1:105"
                          }
                        ]
                      }
                    ]
                  },
                  "pre": {
                    "nodeType": "YulBlock",
                    "src": "4039:3:105",
                    "statements": []
                  },
                  "src": "4035:140:105"
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "4209:66:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "arguments": [
                                {
                                  "arguments": [
                                    {
                                      "name": "headStart",
                                      "nodeType": "YulIdentifier",
                                      "src": "4238:9:105"
                                    },
                                    {
                                      "name": "length",
                                      "nodeType": "YulIdentifier",
                                      "src": "4249:6:105"
                                    }
                                  ],
                                  "functionName": {
                                    "name": "add",
                                    "nodeType": "YulIdentifier",
                                    "src": "4234:3:105"
                                  },
                                  "nodeType": "YulFunctionCall",
                                  "src": "4234:22:105"
                                },
                                {
                                  "kind": "number",
                                  "nodeType": "YulLiteral",
                                  "src": "4258:2:105",
                                  "type": "",
                                  "value": "64"
                                }
                              ],
                              "functionName": {
                                "name": "add",
                                "nodeType": "YulIdentifier",
                                "src": "4230:3:105"
                              },
                              "nodeType": "YulFunctionCall",
                              "src": "4230:31:105"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "4263:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "mstore",
                            "nodeType": "YulIdentifier",
                            "src": "4223:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "4223:42:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "4223:42:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "name": "i",
                        "nodeType": "YulIdentifier",
                        "src": "4190:1:105"
                      },
                      {
                        "name": "length",
                        "nodeType": "YulIdentifier",
                        "src": "4193:6:105"
                      }
                    ],
                    "functionName": {
                      "name": "gt",
                      "nodeType": "YulIdentifier",
                      "src": "4187:2:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4187:13:105"
                  },
                  "nodeType": "YulIf",
                  "src": "4184:91:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "4284:62:105",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "4300:9:105"
                          },
                          {
                            "arguments": [
                              {
                                "arguments": [
                                  {
                                    "name": "length",
                                    "nodeType": "YulIdentifier",
                                    "src": "4319:6:105"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "4327:2:105",
                                    "type": "",
                                    "value": "31"
                                  }
                                ],
                                "functionName": {
                                  "name": "add",
                                  "nodeType": "YulIdentifier",
                                  "src": "4315:3:105"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "4315:15:105"
                              },
                              {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "4336:2:105",
                                    "type": "",
                                    "value": "31"
                                  }
                                ],
                                "functionName": {
                                  "name": "not",
                                  "nodeType": "YulIdentifier",
                                  "src": "4332:3:105"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "4332:7:105"
                              }
                            ],
                            "functionName": {
                              "name": "and",
                              "nodeType": "YulIdentifier",
                              "src": "4311:3:105"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "4311:29:105"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "4296:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "4296:45:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "4343:2:105",
                        "type": "",
                        "value": "64"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "4292:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4292:54:105"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "4284:4:105"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "3845:9:105",
                "type": ""
              },
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "3856:6:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "3867:4:105",
                "type": ""
              }
            ],
            "src": "3755:597:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "4444:161:105",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "4490:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "4499:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "4502:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "4492:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "4492:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "4492:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "4465:7:105"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "4474:9:105"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "4461:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "4461:23:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "4486:2:105",
                        "type": "",
                        "value": "64"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "4457:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4457:32:105"
                  },
                  "nodeType": "YulIf",
                  "src": "4454:52:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "4515:33:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "4538:9:105"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "4525:12:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4525:23:105"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "4515:6:105"
                    }
                  ]
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "4557:42:105",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "4584:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "4595:2:105",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "4580:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "4580:18:105"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "4567:12:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4567:32:105"
                  },
                  "variableNames": [
                    {
                      "name": "value1",
                      "nodeType": "YulIdentifier",
                      "src": "4557:6:105"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_bytes32t_uint256",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "4402:9:105",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "4413:7:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "4425:6:105",
                "type": ""
              },
              {
                "name": "value1",
                "nodeType": "YulTypedName",
                "src": "4433:6:105",
                "type": ""
              }
            ],
            "src": "4357:248:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "4705:92:105",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "4715:26:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "4727:9:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "4738:2:105",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "4723:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4723:18:105"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "4715:4:105"
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "4757:9:105"
                      },
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "name": "value0",
                                "nodeType": "YulIdentifier",
                                "src": "4782:6:105"
                              }
                            ],
                            "functionName": {
                              "name": "iszero",
                              "nodeType": "YulIdentifier",
                              "src": "4775:6:105"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "4775:14:105"
                          }
                        ],
                        "functionName": {
                          "name": "iszero",
                          "nodeType": "YulIdentifier",
                          "src": "4768:6:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "4768:22:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "4750:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4750:41:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "4750:41:105"
                }
              ]
            },
            "name": "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "4674:9:105",
                "type": ""
              },
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "4685:6:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "4696:4:105",
                "type": ""
              }
            ],
            "src": "4610:187:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "4872:190:105",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "4918:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "4927:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "4930:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "4920:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "4920:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "4920:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "4893:7:105"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "4902:9:105"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "4889:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "4889:23:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "4914:2:105",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "4885:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4885:32:105"
                  },
                  "nodeType": "YulIf",
                  "src": "4882:52:105"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "4943:36:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "4969:9:105"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "4956:12:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4956:23:105"
                  },
                  "variables": [
                    {
                      "name": "value",
                      "nodeType": "YulTypedName",
                      "src": "4947:5:105",
                      "type": ""
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "value",
                        "nodeType": "YulIdentifier",
                        "src": "5026:5:105"
                      }
                    ],
                    "functionName": {
                      "name": "validator_revert_contract_IFeeHandler",
                      "nodeType": "YulIdentifier",
                      "src": "4988:37:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4988:44:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "4988:44:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "5041:15:105",
                  "value": {
                    "name": "value",
                    "nodeType": "YulIdentifier",
                    "src": "5051:5:105"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "5041:6:105"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_address",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "4838:9:105",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "4849:7:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "4861:6:105",
                "type": ""
              }
            ],
            "src": "4802:260:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "5196:145:105",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "5206:26:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "5218:9:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "5229:2:105",
                        "type": "",
                        "value": "64"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "5214:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5214:18:105"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "5206:4:105"
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "5248:9:105"
                      },
                      {
                        "name": "value0",
                        "nodeType": "YulIdentifier",
                        "src": "5259:6:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "5241:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5241:25:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "5241:25:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "5286:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "5297:2:105",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "5282:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "5282:18:105"
                      },
                      {
                        "arguments": [
                          {
                            "name": "value1",
                            "nodeType": "YulIdentifier",
                            "src": "5306:6:105"
                          },
                          {
                            "arguments": [
                              {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "5322:3:105",
                                    "type": "",
                                    "value": "160"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "5327:1:105",
                                    "type": "",
                                    "value": "1"
                                  }
                                ],
                                "functionName": {
                                  "name": "shl",
                                  "nodeType": "YulIdentifier",
                                  "src": "5318:3:105"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "5318:11:105"
                              },
                              {
                                "kind": "number",
                                "nodeType": "YulLiteral",
                                "src": "5331:1:105",
                                "type": "",
                                "value": "1"
                              }
                            ],
                            "functionName": {
                              "name": "sub",
                              "nodeType": "YulIdentifier",
                              "src": "5314:3:105"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "5314:19:105"
                          }
                        ],
                        "functionName": {
                          "name": "and",
                          "nodeType": "YulIdentifier",
                          "src": "5302:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "5302:32:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "5275:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5275:60:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "5275:60:105"
                }
              ]
            },
            "name": "abi_encode_tuple_t_uint256_t_address__to_t_uint256_t_address__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "5157:9:105",
                "type": ""
              },
              {
                "name": "value1",
                "nodeType": "YulTypedName",
                "src": "5168:6:105",
                "type": ""
              },
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "5176:6:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "5187:4:105",
                "type": ""
              }
            ],
            "src": "5067:274:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "5430:345:105",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "5476:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "5485:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "5488:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "5478:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "5478:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "5478:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "5451:7:105"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "5460:9:105"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "5447:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "5447:23:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "5472:2:105",
                        "type": "",
                        "value": "64"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "5443:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5443:32:105"
                  },
                  "nodeType": "YulIf",
                  "src": "5440:52:105"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "5501:36:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "5527:9:105"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "5514:12:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5514:23:105"
                  },
                  "variables": [
                    {
                      "name": "value",
                      "nodeType": "YulTypedName",
                      "src": "5505:5:105",
                      "type": ""
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "value",
                        "nodeType": "YulIdentifier",
                        "src": "5584:5:105"
                      }
                    ],
                    "functionName": {
                      "name": "validator_revert_contract_IFeeHandler",
                      "nodeType": "YulIdentifier",
                      "src": "5546:37:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5546:44:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "5546:44:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "5599:15:105",
                  "value": {
                    "name": "value",
                    "nodeType": "YulIdentifier",
                    "src": "5609:5:105"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "5599:6:105"
                    }
                  ]
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "5623:47:105",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "5655:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "5666:2:105",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "5651:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "5651:18:105"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "5638:12:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5638:32:105"
                  },
                  "variables": [
                    {
                      "name": "value_1",
                      "nodeType": "YulTypedName",
                      "src": "5627:7:105",
                      "type": ""
                    }
                  ]
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "5727:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "5736:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "5739:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "5729:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "5729:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "5729:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "value_1",
                            "nodeType": "YulIdentifier",
                            "src": "5692:7:105"
                          },
                          {
                            "arguments": [
                              {
                                "arguments": [
                                  {
                                    "name": "value_1",
                                    "nodeType": "YulIdentifier",
                                    "src": "5715:7:105"
                                  }
                                ],
                                "functionName": {
                                  "name": "iszero",
                                  "nodeType": "YulIdentifier",
                                  "src": "5708:6:105"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "5708:15:105"
                              }
                            ],
                            "functionName": {
                              "name": "iszero",
                              "nodeType": "YulIdentifier",
                              "src": "5701:6:105"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "5701:23:105"
                          }
                        ],
                        "functionName": {
                          "name": "eq",
                          "nodeType": "YulIdentifier",
                          "src": "5689:2:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "5689:36:105"
                      }
                    ],
                    "functionName": {
                      "name": "iszero",
                      "nodeType": "YulIdentifier",
                      "src": "5682:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5682:44:105"
                  },
                  "nodeType": "YulIf",
                  "src": "5679:64:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "5752:17:105",
                  "value": {
                    "name": "value_1",
                    "nodeType": "YulIdentifier",
                    "src": "5762:7:105"
                  },
                  "variableNames": [
                    {
                      "name": "value1",
                      "nodeType": "YulIdentifier",
                      "src": "5752:6:105"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_addresst_bool",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "5388:9:105",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "5399:7:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "5411:6:105",
                "type": ""
              },
              {
                "name": "value1",
                "nodeType": "YulTypedName",
                "src": "5419:6:105",
                "type": ""
              }
            ],
            "src": "5346:429:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "5846:200:105",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "pos",
                        "nodeType": "YulIdentifier",
                        "src": "5863:3:105"
                      },
                      {
                        "name": "length",
                        "nodeType": "YulIdentifier",
                        "src": "5868:6:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "5856:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5856:19:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "5856:19:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "pos",
                            "nodeType": "YulIdentifier",
                            "src": "5901:3:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "5906:4:105",
                            "type": "",
                            "value": "0x20"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "5897:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "5897:14:105"
                      },
                      {
                        "name": "start",
                        "nodeType": "YulIdentifier",
                        "src": "5913:5:105"
                      },
                      {
                        "name": "length",
                        "nodeType": "YulIdentifier",
                        "src": "5920:6:105"
                      }
                    ],
                    "functionName": {
                      "name": "calldatacopy",
                      "nodeType": "YulIdentifier",
                      "src": "5884:12:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5884:43:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "5884:43:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "name": "pos",
                                "nodeType": "YulIdentifier",
                                "src": "5951:3:105"
                              },
                              {
                                "name": "length",
                                "nodeType": "YulIdentifier",
                                "src": "5956:6:105"
                              }
                            ],
                            "functionName": {
                              "name": "add",
                              "nodeType": "YulIdentifier",
                              "src": "5947:3:105"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "5947:16:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "5965:4:105",
                            "type": "",
                            "value": "0x20"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "5943:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "5943:27:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "5972:1:105",
                        "type": "",
                        "value": "0"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "5936:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5936:38:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "5936:38:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "5983:57:105",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "pos",
                            "nodeType": "YulIdentifier",
                            "src": "5998:3:105"
                          },
                          {
                            "arguments": [
                              {
                                "arguments": [
                                  {
                                    "name": "length",
                                    "nodeType": "YulIdentifier",
                                    "src": "6011:6:105"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "6019:2:105",
                                    "type": "",
                                    "value": "31"
                                  }
                                ],
                                "functionName": {
                                  "name": "add",
                                  "nodeType": "YulIdentifier",
                                  "src": "6007:3:105"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "6007:15:105"
                              },
                              {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "6028:2:105",
                                    "type": "",
                                    "value": "31"
                                  }
                                ],
                                "functionName": {
                                  "name": "not",
                                  "nodeType": "YulIdentifier",
                                  "src": "6024:3:105"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "6024:7:105"
                              }
                            ],
                            "functionName": {
                              "name": "and",
                              "nodeType": "YulIdentifier",
                              "src": "6003:3:105"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "6003:29:105"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "5994:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "5994:39:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "6035:4:105",
                        "type": "",
                        "value": "0x20"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "5990:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5990:50:105"
                  },
                  "variableNames": [
                    {
                      "name": "end",
                      "nodeType": "YulIdentifier",
                      "src": "5983:3:105"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_bytes_calldata",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "start",
                "nodeType": "YulTypedName",
                "src": "5815:5:105",
                "type": ""
              },
              {
                "name": "length",
                "nodeType": "YulTypedName",
                "src": "5822:6:105",
                "type": ""
              },
              {
                "name": "pos",
                "nodeType": "YulTypedName",
                "src": "5830:3:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "end",
                "nodeType": "YulTypedName",
                "src": "5838:3:105",
                "type": ""
              }
            ],
            "src": "5780:266:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "6340:470:105",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "6357:9:105"
                      },
                      {
                        "arguments": [
                          {
                            "name": "value0",
                            "nodeType": "YulIdentifier",
                            "src": "6372:6:105"
                          },
                          {
                            "arguments": [
                              {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "6388:3:105",
                                    "type": "",
                                    "value": "160"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "6393:1:105",
                                    "type": "",
                                    "value": "1"
                                  }
                                ],
                                "functionName": {
                                  "name": "shl",
                                  "nodeType": "YulIdentifier",
                                  "src": "6384:3:105"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "6384:11:105"
                              },
                              {
                                "kind": "number",
                                "nodeType": "YulLiteral",
                                "src": "6397:1:105",
                                "type": "",
                                "value": "1"
                              }
                            ],
                            "functionName": {
                              "name": "sub",
                              "nodeType": "YulIdentifier",
                              "src": "6380:3:105"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "6380:19:105"
                          }
                        ],
                        "functionName": {
                          "name": "and",
                          "nodeType": "YulIdentifier",
                          "src": "6368:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "6368:32:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "6350:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6350:51:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "6350:51:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "6421:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "6432:2:105",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "6417:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "6417:18:105"
                      },
                      {
                        "arguments": [
                          {
                            "name": "value1",
                            "nodeType": "YulIdentifier",
                            "src": "6441:6:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "6449:4:105",
                            "type": "",
                            "value": "0xff"
                          }
                        ],
                        "functionName": {
                          "name": "and",
                          "nodeType": "YulIdentifier",
                          "src": "6437:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "6437:17:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "6410:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6410:45:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "6410:45:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "6475:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "6486:2:105",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "6471:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "6471:18:105"
                      },
                      {
                        "arguments": [
                          {
                            "name": "value2",
                            "nodeType": "YulIdentifier",
                            "src": "6495:6:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "6503:4:105",
                            "type": "",
                            "value": "0xff"
                          }
                        ],
                        "functionName": {
                          "name": "and",
                          "nodeType": "YulIdentifier",
                          "src": "6491:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "6491:17:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "6464:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6464:45:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "6464:45:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "6529:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "6540:2:105",
                            "type": "",
                            "value": "96"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "6525:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "6525:18:105"
                      },
                      {
                        "name": "value3",
                        "nodeType": "YulIdentifier",
                        "src": "6545:6:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "6518:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6518:34:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "6518:34:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "6572:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "6583:3:105",
                            "type": "",
                            "value": "128"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "6568:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "6568:19:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "6589:3:105",
                        "type": "",
                        "value": "192"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "6561:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6561:32:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "6561:32:105"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "6602:76:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "value4",
                        "nodeType": "YulIdentifier",
                        "src": "6642:6:105"
                      },
                      {
                        "name": "value5",
                        "nodeType": "YulIdentifier",
                        "src": "6650:6:105"
                      },
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "6662:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "6673:3:105",
                            "type": "",
                            "value": "192"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "6658:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "6658:19:105"
                      }
                    ],
                    "functionName": {
                      "name": "abi_encode_bytes_calldata",
                      "nodeType": "YulIdentifier",
                      "src": "6616:25:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6616:62:105"
                  },
                  "variables": [
                    {
                      "name": "tail_1",
                      "nodeType": "YulTypedName",
                      "src": "6606:6:105",
                      "type": ""
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "6698:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "6709:3:105",
                            "type": "",
                            "value": "160"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "6694:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "6694:19:105"
                      },
                      {
                        "arguments": [
                          {
                            "name": "tail_1",
                            "nodeType": "YulIdentifier",
                            "src": "6719:6:105"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "6727:9:105"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "6715:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "6715:22:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "6687:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6687:51:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "6687:51:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "6747:57:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "value6",
                        "nodeType": "YulIdentifier",
                        "src": "6781:6:105"
                      },
                      {
                        "name": "value7",
                        "nodeType": "YulIdentifier",
                        "src": "6789:6:105"
                      },
                      {
                        "name": "tail_1",
                        "nodeType": "YulIdentifier",
                        "src": "6797:6:105"
                      }
                    ],
                    "functionName": {
                      "name": "abi_encode_bytes_calldata",
                      "nodeType": "YulIdentifier",
                      "src": "6755:25:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6755:49:105"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "6747:4:105"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_address_t_uint8_t_uint8_t_bytes32_t_bytes_calldata_ptr_t_bytes_calldata_ptr__to_t_address_t_uint8_t_uint8_t_bytes32_t_bytes_memory_ptr_t_bytes_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "6253:9:105",
                "type": ""
              },
              {
                "name": "value7",
                "nodeType": "YulTypedName",
                "src": "6264:6:105",
                "type": ""
              },
              {
                "name": "value6",
                "nodeType": "YulTypedName",
                "src": "6272:6:105",
                "type": ""
              },
              {
                "name": "value5",
                "nodeType": "YulTypedName",
                "src": "6280:6:105",
                "type": ""
              },
              {
                "name": "value4",
                "nodeType": "YulTypedName",
                "src": "6288:6:105",
                "type": ""
              },
              {
                "name": "value3",
                "nodeType": "YulTypedName",
                "src": "6296:6:105",
                "type": ""
              },
              {
                "name": "value2",
                "nodeType": "YulTypedName",
                "src": "6304:6:105",
                "type": ""
              },
              {
                "name": "value1",
                "nodeType": "YulTypedName",
                "src": "6312:6:105",
                "type": ""
              },
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "6320:6:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "6331:4:105",
                "type": ""
              }
            ],
            "src": "6051:759:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "6989:237:105",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "7006:9:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "7017:2:105",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "6999:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6999:21:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "6999:21:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "7040:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "7051:2:105",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "7036:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "7036:18:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "7056:2:105",
                        "type": "",
                        "value": "47"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "7029:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7029:30:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "7029:30:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "7079:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "7090:2:105",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "7075:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "7075:18:105"
                      },
                      {
                        "hexValue": "416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "7095:34:105",
                        "type": "",
                        "value": "AccessControl: sender must be an"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "7068:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7068:62:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "7068:62:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "7150:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "7161:2:105",
                            "type": "",
                            "value": "96"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "7146:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "7146:18:105"
                      },
                      {
                        "hexValue": "2061646d696e20746f206772616e74",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "7166:17:105",
                        "type": "",
                        "value": " admin to grant"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "7139:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7139:45:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "7139:45:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "7193:27:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "7205:9:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "7216:3:105",
                        "type": "",
                        "value": "128"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "7201:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7201:19:105"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "7193:4:105"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_stringliteral_0ba7116025f1ef6b158a2bd2238e617f30e17c9e456917d901086ca4f8ad2811__to_t_string_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "6966:9:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "6980:4:105",
                "type": ""
              }
            ],
            "src": "6815:411:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "7405:237:105",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "7422:9:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "7433:2:105",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "7415:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7415:21:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "7415:21:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "7456:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "7467:2:105",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "7452:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "7452:18:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "7472:2:105",
                        "type": "",
                        "value": "47"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "7445:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7445:30:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "7445:30:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "7495:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "7506:2:105",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "7491:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "7491:18:105"
                      },
                      {
                        "hexValue": "416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e6365",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "7511:34:105",
                        "type": "",
                        "value": "AccessControl: can only renounce"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "7484:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7484:62:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "7484:62:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "7566:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "7577:2:105",
                            "type": "",
                            "value": "96"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "7562:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "7562:18:105"
                      },
                      {
                        "hexValue": "20726f6c657320666f722073656c66",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "7582:17:105",
                        "type": "",
                        "value": " roles for self"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "7555:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7555:45:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "7555:45:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "7609:27:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "7621:9:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "7632:3:105",
                        "type": "",
                        "value": "128"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "7617:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7617:19:105"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "7609:4:105"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_stringliteral_fb06fa8ff2141e8ed74502f6792273793f25f0e9d3cf15344f3f5a0d4948fd4b__to_t_string_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "7382:9:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "7396:4:105",
                "type": ""
              }
            ],
            "src": "7231:411:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "7821:238:105",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "7838:9:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "7849:2:105",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "7831:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7831:21:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "7831:21:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "7872:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "7883:2:105",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "7868:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "7868:18:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "7888:2:105",
                        "type": "",
                        "value": "48"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "7861:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7861:30:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "7861:30:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "7911:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "7922:2:105",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "7907:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "7907:18:105"
                      },
                      {
                        "hexValue": "416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "7927:34:105",
                        "type": "",
                        "value": "AccessControl: sender must be an"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "7900:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7900:62:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "7900:62:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "7982:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "7993:2:105",
                            "type": "",
                            "value": "96"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "7978:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "7978:18:105"
                      },
                      {
                        "hexValue": "2061646d696e20746f207265766f6b65",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "7998:18:105",
                        "type": "",
                        "value": " admin to revoke"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "7971:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7971:46:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "7971:46:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "8026:27:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "8038:9:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "8049:3:105",
                        "type": "",
                        "value": "128"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "8034:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "8034:19:105"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "8026:4:105"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_stringliteral_64344570eab7406ca49d34d38bf2b2496dfda914405390c5057c8b0aabf798a3__to_t_string_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "7798:9:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "7812:4:105",
                "type": ""
              }
            ],
            "src": "7647:412:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "8162:227:105",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "8208:16:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "8217:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "8220:1:105",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "8210:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "8210:12:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "8210:12:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "8183:7:105"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "8192:9:105"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "8179:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "8179:23:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "8204:2:105",
                        "type": "",
                        "value": "64"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "8175:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "8175:32:105"
                  },
                  "nodeType": "YulIf",
                  "src": "8172:52:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "8233:26:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "8249:9:105"
                      }
                    ],
                    "functionName": {
                      "name": "mload",
                      "nodeType": "YulIdentifier",
                      "src": "8243:5:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "8243:16:105"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "8233:6:105"
                    }
                  ]
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "8268:38:105",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "8291:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "8302:2:105",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "8287:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "8287:18:105"
                      }
                    ],
                    "functionName": {
                      "name": "mload",
                      "nodeType": "YulIdentifier",
                      "src": "8281:5:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "8281:25:105"
                  },
                  "variables": [
                    {
                      "name": "value",
                      "nodeType": "YulTypedName",
                      "src": "8272:5:105",
                      "type": ""
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "value",
                        "nodeType": "YulIdentifier",
                        "src": "8353:5:105"
                      }
                    ],
                    "functionName": {
                      "name": "validator_revert_contract_IFeeHandler",
                      "nodeType": "YulIdentifier",
                      "src": "8315:37:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "8315:44:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "8315:44:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "8368:15:105",
                  "value": {
                    "name": "value",
                    "nodeType": "YulIdentifier",
                    "src": "8378:5:105"
                  },
                  "variableNames": [
                    {
                      "name": "value1",
                      "nodeType": "YulIdentifier",
                      "src": "8368:6:105"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_uint256t_address_fromMemory",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "8120:9:105",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "8131:7:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "8143:6:105",
                "type": ""
              },
              {
                "name": "value1",
                "nodeType": "YulTypedName",
                "src": "8151:6:105",
                "type": ""
              }
            ],
            "src": "8064:325:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "8517:161:105",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "8527:26:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "8539:9:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "8550:2:105",
                        "type": "",
                        "value": "64"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "8535:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "8535:18:105"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "8527:4:105"
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "8569:9:105"
                      },
                      {
                        "arguments": [
                          {
                            "name": "value0",
                            "nodeType": "YulIdentifier",
                            "src": "8584:6:105"
                          },
                          {
                            "arguments": [
                              {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "8600:3:105",
                                    "type": "",
                                    "value": "160"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "8605:1:105",
                                    "type": "",
                                    "value": "1"
                                  }
                                ],
                                "functionName": {
                                  "name": "shl",
                                  "nodeType": "YulIdentifier",
                                  "src": "8596:3:105"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "8596:11:105"
                              },
                              {
                                "kind": "number",
                                "nodeType": "YulLiteral",
                                "src": "8609:1:105",
                                "type": "",
                                "value": "1"
                              }
                            ],
                            "functionName": {
                              "name": "sub",
                              "nodeType": "YulIdentifier",
                              "src": "8592:3:105"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "8592:19:105"
                          }
                        ],
                        "functionName": {
                          "name": "and",
                          "nodeType": "YulIdentifier",
                          "src": "8580:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "8580:32:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "8562:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "8562:51:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "8562:51:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "8633:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "8644:2:105",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "8629:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "8629:18:105"
                      },
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "name": "value1",
                                "nodeType": "YulIdentifier",
                                "src": "8663:6:105"
                              }
                            ],
                            "functionName": {
                              "name": "iszero",
                              "nodeType": "YulIdentifier",
                              "src": "8656:6:105"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "8656:14:105"
                          }
                        ],
                        "functionName": {
                          "name": "iszero",
                          "nodeType": "YulIdentifier",
                          "src": "8649:6:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "8649:22:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "8622:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "8622:50:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "8622:50:105"
                }
              ]
            },
            "name": "abi_encode_tuple_t_address_t_bool__to_t_address_t_bool__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "8478:9:105",
                "type": ""
              },
              {
                "name": "value1",
                "nodeType": "YulTypedName",
                "src": "8489:6:105",
                "type": ""
              },
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "8497:6:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "8508:4:105",
                "type": ""
              }
            ],
            "src": "8394:284:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "8857:180:105",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "8874:9:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "8885:2:105",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "8867:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "8867:21:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "8867:21:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "8908:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "8919:2:105",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "8904:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "8904:18:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "8924:2:105",
                        "type": "",
                        "value": "30"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "8897:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "8897:30:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "8897:30:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "8947:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "8958:2:105",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "8943:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "8943:18:105"
                      },
                      {
                        "hexValue": "73656e64657220646f65736e277420686176652061646d696e20726f6c65",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "8963:32:105",
                        "type": "",
                        "value": "sender doesn't have admin role"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "8936:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "8936:60:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "8936:60:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "9005:26:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "9017:9:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "9028:2:105",
                        "type": "",
                        "value": "96"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "9013:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "9013:18:105"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "9005:4:105"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_stringliteral_cccb3b305edc7308d7027b1001041a46b235f7d3213d690bb469676069d9b205__to_t_string_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "8834:9:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "8848:4:105",
                "type": ""
              }
            ],
            "src": "8683:354:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "9216:180:105",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "9233:9:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "9244:2:105",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "9226:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "9226:21:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "9226:21:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "9267:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "9278:2:105",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "9263:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "9263:18:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "9283:2:105",
                        "type": "",
                        "value": "30"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "9256:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "9256:30:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "9256:30:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "9306:9:105"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "9317:2:105",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "9302:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "9302:18:105"
                      },
                      {
                        "hexValue": "73656e646572206d7573742062652062726964676520636f6e7472616374",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "9322:32:105",
                        "type": "",
                        "value": "sender must be bridge contract"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "9295:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "9295:60:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "9295:60:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "9364:26:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "9376:9:105"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "9387:2:105",
                        "type": "",
                        "value": "96"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "9372:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "9372:18:105"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "9364:4:105"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_stringliteral_0febc0fc8991eb26dfaaceeb4d73d25b76da338550ed76c60410fec84388058e__to_t_string_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "9193:9:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "9207:4:105",
                "type": ""
              }
            ],
            "src": "9042:354:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "9433:95:105",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "9450:1:105",
                        "type": "",
                        "value": "0"
                      },
                      {
                        "arguments": [
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "9457:3:105",
                            "type": "",
                            "value": "224"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "9462:10:105",
                            "type": "",
                            "value": "0x4e487b71"
                          }
                        ],
                        "functionName": {
                          "name": "shl",
                          "nodeType": "YulIdentifier",
                          "src": "9453:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "9453:20:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "9443:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "9443:31:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "9443:31:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "9490:1:105",
                        "type": "",
                        "value": "4"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "9493:4:105",
                        "type": "",
                        "value": "0x32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "9483:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "9483:15:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "9483:15:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "9514:1:105",
                        "type": "",
                        "value": "0"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "9517:4:105",
                        "type": "",
                        "value": "0x24"
                      }
                    ],
                    "functionName": {
                      "name": "revert",
                      "nodeType": "YulIdentifier",
                      "src": "9507:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "9507:15:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "9507:15:105"
                }
              ]
            },
            "name": "panic_error_0x32",
            "nodeType": "YulFunctionDefinition",
            "src": "9401:127:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "9582:173:105",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "9612:111:105",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "9633:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "arguments": [
                                {
                                  "kind": "number",
                                  "nodeType": "YulLiteral",
                                  "src": "9640:3:105",
                                  "type": "",
                                  "value": "224"
                                },
                                {
                                  "kind": "number",
                                  "nodeType": "YulLiteral",
                                  "src": "9645:10:105",
                                  "type": "",
                                  "value": "0x4e487b71"
                                }
                              ],
                              "functionName": {
                                "name": "shl",
                                "nodeType": "YulIdentifier",
                                "src": "9636:3:105"
                              },
                              "nodeType": "YulFunctionCall",
                              "src": "9636:20:105"
                            }
                          ],
                          "functionName": {
                            "name": "mstore",
                            "nodeType": "YulIdentifier",
                            "src": "9626:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "9626:31:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "9626:31:105"
                      },
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "9677:1:105",
                              "type": "",
                              "value": "4"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "9680:4:105",
                              "type": "",
                              "value": "0x11"
                            }
                          ],
                          "functionName": {
                            "name": "mstore",
                            "nodeType": "YulIdentifier",
                            "src": "9670:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "9670:15:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "9670:15:105"
                      },
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "9705:1:105",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "9708:4:105",
                              "type": "",
                              "value": "0x24"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "9698:6:105"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "9698:15:105"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "9698:15:105"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "name": "x",
                        "nodeType": "YulIdentifier",
                        "src": "9598:1:105"
                      },
                      {
                        "name": "y",
                        "nodeType": "YulIdentifier",
                        "src": "9601:1:105"
                      }
                    ],
                    "functionName": {
                      "name": "lt",
                      "nodeType": "YulIdentifier",
                      "src": "9595:2:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "9595:8:105"
                  },
                  "nodeType": "YulIf",
                  "src": "9592:131:105"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "9732:17:105",
                  "value": {
                    "arguments": [
                      {
                        "name": "x",
                        "nodeType": "YulIdentifier",
                        "src": "9744:1:105"
                      },
                      {
                        "name": "y",
                        "nodeType": "YulIdentifier",
                        "src": "9747:1:105"
                      }
                    ],
                    "functionName": {
                      "name": "sub",
                      "nodeType": "YulIdentifier",
                      "src": "9740:3:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "9740:9:105"
                  },
                  "variableNames": [
                    {
                      "name": "diff",
                      "nodeType": "YulIdentifier",
                      "src": "9732:4:105"
                    }
                  ]
                }
              ]
            },
            "name": "checked_sub_t_uint256",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "x",
                "nodeType": "YulTypedName",
                "src": "9564:1:105",
                "type": ""
              },
              {
                "name": "y",
                "nodeType": "YulTypedName",
                "src": "9567:1:105",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "diff",
                "nodeType": "YulTypedName",
                "src": "9573:4:105",
                "type": ""
              }
            ],
            "src": "9533:222:105"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "9792:95:105",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "9809:1:105",
                        "type": "",
                        "value": "0"
                      },
                      {
                        "arguments": [
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "9816:3:105",
                            "type": "",
                            "value": "224"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "9821:10:105",
                            "type": "",
                            "value": "0x4e487b71"
                          }
                        ],
                        "functionName": {
                          "name": "shl",
                          "nodeType": "YulIdentifier",
                          "src": "9812:3:105"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "9812:20:105"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "9802:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "9802:31:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "9802:31:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "9849:1:105",
                        "type": "",
                        "value": "4"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "9852:4:105",
                        "type": "",
                        "value": "0x31"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "9842:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "9842:15:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "9842:15:105"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "9873:1:105",
                        "type": "",
                        "value": "0"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "9876:4:105",
                        "type": "",
                        "value": "0x24"
                      }
                    ],
                    "functionName": {
                      "name": "revert",
                      "nodeType": "YulIdentifier",
                      "src": "9866:6:105"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "9866:15:105"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "9866:15:105"
                }
              ]
            },
            "name": "panic_error_0x31",
            "nodeType": "YulFunctionDefinition",
            "src": "9760:127:105"
          }
        ]
      },
      "contents": "{\n    { }\n    function abi_decode_uint8(offset) -> value\n    {\n        value := calldataload(offset)\n        if iszero(eq(value, and(value, 0xff))) { revert(0, 0) }\n    }\n    function validator_revert_contract_IFeeHandler(value)\n    {\n        if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n    }\n    function abi_decode_tuple_t_uint8t_bytes32t_contract$_IFeeHandler_$18265(headStart, dataEnd) -> value0, value1, value2\n    {\n        if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n        value0 := abi_decode_uint8(headStart)\n        value1 := calldataload(add(headStart, 32))\n        let value := calldataload(add(headStart, 64))\n        validator_revert_contract_IFeeHandler(value)\n        value2 := value\n    }\n    function abi_decode_tuple_t_bytes32(headStart, dataEnd) -> value0\n    {\n        if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n        value0 := calldataload(headStart)\n    }\n    function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n    {\n        tail := add(headStart, 32)\n        mstore(headStart, value0)\n    }\n    function abi_decode_bytes_calldata(offset, end) -> arrayPos, length\n    {\n        if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n        length := calldataload(offset)\n        if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n        arrayPos := add(offset, 0x20)\n        if gt(add(add(offset, length), 0x20), end) { revert(0, 0) }\n    }\n    function abi_decode_tuple_t_addresst_uint8t_uint8t_bytes32t_bytes_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5, value6, value7\n    {\n        if slt(sub(dataEnd, headStart), 192) { revert(0, 0) }\n        let value := calldataload(headStart)\n        validator_revert_contract_IFeeHandler(value)\n        value0 := value\n        value1 := abi_decode_uint8(add(headStart, 32))\n        value2 := abi_decode_uint8(add(headStart, 64))\n        value3 := calldataload(add(headStart, 96))\n        let offset := calldataload(add(headStart, 128))\n        let _1 := 0xffffffffffffffff\n        if gt(offset, _1) { revert(0, 0) }\n        let value4_1, value5_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n        value4 := value4_1\n        value5 := value5_1\n        let offset_1 := calldataload(add(headStart, 160))\n        if gt(offset_1, _1) { revert(0, 0) }\n        let value6_1, value7_1 := abi_decode_bytes_calldata(add(headStart, offset_1), dataEnd)\n        value6 := value6_1\n        value7 := value7_1\n    }\n    function abi_decode_tuple_t_bytes32t_address(headStart, dataEnd) -> value0, value1\n    {\n        if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n        value0 := calldataload(headStart)\n        let value := calldataload(add(headStart, 32))\n        validator_revert_contract_IFeeHandler(value)\n        value1 := value\n    }\n    function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n    {\n        tail := add(headStart, 32)\n        mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n    }\n    function abi_decode_tuple_t_uint8t_bytes32(headStart, dataEnd) -> value0, value1\n    {\n        if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n        value0 := abi_decode_uint8(headStart)\n        value1 := calldataload(add(headStart, 32))\n    }\n    function abi_encode_tuple_t_contract$_IFeeHandler_$18265__to_t_address__fromStack_reversed(headStart, value0) -> tail\n    {\n        tail := add(headStart, 32)\n        mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n    }\n    function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n    {\n        tail := add(headStart, 32)\n        mstore(headStart, value0)\n    }\n    function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n    {\n        let _1 := 32\n        mstore(headStart, _1)\n        let length := mload(value0)\n        mstore(add(headStart, _1), length)\n        let i := 0\n        for { } lt(i, length) { i := add(i, _1) }\n        {\n            mstore(add(add(headStart, i), 64), mload(add(add(value0, i), _1)))\n        }\n        if gt(i, length)\n        {\n            mstore(add(add(headStart, length), 64), 0)\n        }\n        tail := add(add(headStart, and(add(length, 31), not(31))), 64)\n    }\n    function abi_decode_tuple_t_bytes32t_uint256(headStart, dataEnd) -> value0, value1\n    {\n        if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n        value0 := calldataload(headStart)\n        value1 := calldataload(add(headStart, 32))\n    }\n    function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n    {\n        tail := add(headStart, 32)\n        mstore(headStart, iszero(iszero(value0)))\n    }\n    function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n    {\n        if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n        let value := calldataload(headStart)\n        validator_revert_contract_IFeeHandler(value)\n        value0 := value\n    }\n    function abi_encode_tuple_t_uint256_t_address__to_t_uint256_t_address__fromStack_reversed(headStart, value1, value0) -> tail\n    {\n        tail := add(headStart, 64)\n        mstore(headStart, value0)\n        mstore(add(headStart, 32), and(value1, sub(shl(160, 1), 1)))\n    }\n    function abi_decode_tuple_t_addresst_bool(headStart, dataEnd) -> value0, value1\n    {\n        if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n        let value := calldataload(headStart)\n        validator_revert_contract_IFeeHandler(value)\n        value0 := value\n        let value_1 := calldataload(add(headStart, 32))\n        if iszero(eq(value_1, iszero(iszero(value_1)))) { revert(0, 0) }\n        value1 := value_1\n    }\n    function abi_encode_bytes_calldata(start, length, pos) -> end\n    {\n        mstore(pos, length)\n        calldatacopy(add(pos, 0x20), start, length)\n        mstore(add(add(pos, length), 0x20), 0)\n        end := add(add(pos, and(add(length, 31), not(31))), 0x20)\n    }\n    function abi_encode_tuple_t_address_t_uint8_t_uint8_t_bytes32_t_bytes_calldata_ptr_t_bytes_calldata_ptr__to_t_address_t_uint8_t_uint8_t_bytes32_t_bytes_memory_ptr_t_bytes_memory_ptr__fromStack_reversed(headStart, value7, value6, value5, value4, value3, value2, value1, value0) -> tail\n    {\n        mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n        mstore(add(headStart, 32), and(value1, 0xff))\n        mstore(add(headStart, 64), and(value2, 0xff))\n        mstore(add(headStart, 96), value3)\n        mstore(add(headStart, 128), 192)\n        let tail_1 := abi_encode_bytes_calldata(value4, value5, add(headStart, 192))\n        mstore(add(headStart, 160), sub(tail_1, headStart))\n        tail := abi_encode_bytes_calldata(value6, value7, tail_1)\n    }\n    function abi_encode_tuple_t_stringliteral_0ba7116025f1ef6b158a2bd2238e617f30e17c9e456917d901086ca4f8ad2811__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n    {\n        mstore(headStart, 32)\n        mstore(add(headStart, 32), 47)\n        mstore(add(headStart, 64), \"AccessControl: sender must be an\")\n        mstore(add(headStart, 96), \" admin to grant\")\n        tail := add(headStart, 128)\n    }\n    function abi_encode_tuple_t_stringliteral_fb06fa8ff2141e8ed74502f6792273793f25f0e9d3cf15344f3f5a0d4948fd4b__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n    {\n        mstore(headStart, 32)\n        mstore(add(headStart, 32), 47)\n        mstore(add(headStart, 64), \"AccessControl: can only renounce\")\n        mstore(add(headStart, 96), \" roles for self\")\n        tail := add(headStart, 128)\n    }\n    function abi_encode_tuple_t_stringliteral_64344570eab7406ca49d34d38bf2b2496dfda914405390c5057c8b0aabf798a3__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n    {\n        mstore(headStart, 32)\n        mstore(add(headStart, 32), 48)\n        mstore(add(headStart, 64), \"AccessControl: sender must be an\")\n        mstore(add(headStart, 96), \" admin to revoke\")\n        tail := add(headStart, 128)\n    }\n    function abi_decode_tuple_t_uint256t_address_fromMemory(headStart, dataEnd) -> value0, value1\n    {\n        if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n        value0 := mload(headStart)\n        let value := mload(add(headStart, 32))\n        validator_revert_contract_IFeeHandler(value)\n        value1 := value\n    }\n    function abi_encode_tuple_t_address_t_bool__to_t_address_t_bool__fromStack_reversed(headStart, value1, value0) -> tail\n    {\n        tail := add(headStart, 64)\n        mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n        mstore(add(headStart, 32), iszero(iszero(value1)))\n    }\n    function abi_encode_tuple_t_stringliteral_cccb3b305edc7308d7027b1001041a46b235f7d3213d690bb469676069d9b205__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n    {\n        mstore(headStart, 32)\n        mstore(add(headStart, 32), 30)\n        mstore(add(headStart, 64), \"sender doesn't have admin role\")\n        tail := add(headStart, 96)\n    }\n    function abi_encode_tuple_t_stringliteral_0febc0fc8991eb26dfaaceeb4d73d25b76da338550ed76c60410fec84388058e__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n    {\n        mstore(headStart, 32)\n        mstore(add(headStart, 32), 30)\n        mstore(add(headStart, 64), \"sender must be bridge contract\")\n        tail := add(headStart, 96)\n    }\n    function panic_error_0x32()\n    {\n        mstore(0, shl(224, 0x4e487b71))\n        mstore(4, 0x32)\n        revert(0, 0x24)\n    }\n    function checked_sub_t_uint256(x, y) -> diff\n    {\n        if lt(x, y)\n        {\n            mstore(0, shl(224, 0x4e487b71))\n            mstore(4, 0x11)\n            revert(0, 0x24)\n        }\n        diff := sub(x, y)\n    }\n    function panic_error_0x31()\n    {\n        mstore(0, shl(224, 0x4e487b71))\n        mstore(4, 0x31)\n        revert(0, 0x24)\n    }\n}",
      "id": 105,
      "language": "Yul",
      "name": "#utility.yul"
    }
  ],
  "sourceMap": "351:4681:77:-:0;;;1534:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1579:30:77;;;;1619:42;2054:4:96;1650:10:77;1619;:42::i;:::-;1534:134;351:4681;;6727:110:96;6805:25;6816:4;6822:7;6805:10;:25::i;:::-;6727:110;;:::o;7044:184::-;7117:6;:12;;;;;;;;;;;:33;;7142:7;;7117:24;;;;;:33;;:::i;:::-;7113:109;;;7171:40;;719:10:33;;-1:-1:-1;;;;;7171:40:96;;;7183:4;;7171:40;;;;;7044:184;;:::o;7612:150:42:-;7682:4;7705:50;7710:3;-1:-1:-1;;;;;7730:23:42;;7705:4;:50::i;:::-;7698:57;;7612:150;;;;;:::o;1697:404::-;1760:4;3834:19;;;:12;;;:19;;;;;;1776:319;;-1:-1:-1;1818:23:42;;;;;;;;:11;:23;;;;;;;;;;;;;1998:18;;1976:19;;;:12;;;:19;;;;;;:40;;;;2030:11;;1776:319;-1:-1:-1;2079:5:42;2072:12;;14:290:105;84:6;137:2;125:9;116:7;112:23;108:32;105:52;;;153:1;150;143:12;105:52;179:16;;-1:-1:-1;;;;;224:31:105;;214:42;;204:70;;270:1;267;260:12;204:70;293:5;14:290;-1:-1:-1;;;14:290:105:o;:::-;351:4681:77;;;;;;;;;;;;;;;;;",
  "deployedSourceMap": "351:4681:77:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2102:230;;;;;;;;;;-1:-1:-1;2102:230:77;;;;;:::i;:::-;;:::i;:::-;;4421:112:96;;;;;;;;;;-1:-1:-1;4421:112:96;;;;;:::i;:::-;4478:7;4504:12;;;;;;;;;;:22;;;;4421:112;;;;1079:25:105;;;1067:2;1052:18;4421:112:96;;;;;;;;3299:557:77;;;;;;:::i;:::-;;:::i;4783:223:96:-;;;;;;;;;;-1:-1:-1;4783:223:96;;;;;:::i;:::-;;:::i;413:39:77:-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3045:32:105;;;3027:51;;3015:2;3000:18;413:39:77;2881:203:105;5957:205:96;;;;;;;;;;-1:-1:-1;5957:205:96;;;;;:::i;:::-;;:::i;522:94:77:-;;;;;;;;;;-1:-1:-1;522:94:77;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;522:94:77;;;4055:185:96;;;;;;;;;;-1:-1:-1;4055:185:96;;;;;:::i;:::-;;:::i;1332:103:77:-;;;;;;;;;;-1:-1:-1;1413:15:77;;;;;;;;;;;-1:-1:-1;;;1413:15:77;;;;1332:103;;;;1413:15;1332:103;:::i;3834:136:96:-;;;;;;;;;;-1:-1:-1;3834:136:96;;;;;:::i;:::-;;:::i;2819:137::-;;;;;;;;;;-1:-1:-1;2819:137:96;;;;;:::i;:::-;;:::i;:::-;;;4775:14:105;;4768:22;4750:41;;4738:2;4723:18;2819:137:96;4610:187:105;2009:49:96;;;;;;;;;;-1:-1:-1;2009:49:96;2054:4;2009:49;;3124:125;;;;;;;;;;-1:-1:-1;3124:125:96;;;;;:::i;:::-;;:::i;667:42:77:-;;;;;;;;;;-1:-1:-1;667:42:77;;;;;:::i;:::-;;;;;;;;;;;;;;;;5240:226:96;;;;;;;;;;-1:-1:-1;5240:226:96;;;;;:::i;:::-;;:::i;4507:523:77:-;;;;;;;;;;-1:-1:-1;4507:523:77;;;;;:::i;:::-;;:::i;:::-;;;;5241:25:105;;;-1:-1:-1;;;;;5302:32:105;;;5297:2;5282:18;;5275:60;5214:18;4507:523:77;5067:274:105;2556:218:77;;;;;;;;;;-1:-1:-1;2556:218:77;;;;;:::i;:::-;;:::i;2102:230::-;1085:12;:10;:12::i;:::-;2239:57:::1;::::0;;;::::1;;::::0;;;:36:::1;:57;::::0;;;;;;;:69;;;;;;;:86;;-1:-1:-1;;;;;;2239:86:77::1;-1:-1:-1::0;;;;;2239:86:77;;::::1;::::0;;;::::1;::::0;;2102:230::o;3299:557::-;887:13;:11;:13::i;:::-;-1:-1:-1;;;;;3496:18:77;::::1;;::::0;;;:10:::1;:18;::::0;;;;;::::1;;3492:127;;;3534:9;:14:::0;3530:58:::1;;3557:31;::::0;-1:-1:-1;;;3557:31:77;;3578:9:::1;3557:31;::::0;::::1;1079:25:105::0;1052:18;;3557:31:77::1;;;;;;;;3530:58;3602:7;;3492:127;3654:57;::::0;::::1;3629:22;3654:57:::0;;;:36:::1;:57;::::0;;;;;;;:69;;;;;;;;;;;3733:116;;-1:-1:-1;;;3733:116:77;;-1:-1:-1;;;;;3654:69:77;;::::1;::::0;;;3733:21:::1;::::0;3762:9:::1;::::0;3733:116:::1;::::0;3773:6;;3781:12;;3691:19;;3712:10;;3828:11;;;;3841:7;;;;3733:116:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3482:374;910:1;3299:557:::0;;;;;;;;:::o;4783:223:96:-;4874:6;:12;;;;;;;;;;:22;;;4866:45;;719:10:33;2819:137:96;:::i;4866:45::-;4858:105;;;;-1:-1:-1;;;4858:105:96;;7017:2:105;4858:105:96;;;6999:21:105;7056:2;7036:18;;;7029:30;7095:34;7075:18;;;7068:62;-1:-1:-1;;;7146:18:105;;;7139:45;7201:19;;4858:105:96;6815:411:105;4858:105:96;4974:25;4985:4;4991:7;4974:10;:25::i;:::-;4783:223;;:::o;5957:205::-;-1:-1:-1;;;;;6043:23:96;;719:10:33;6043:23:96;6035:83;;;;-1:-1:-1;;;6035:83:96;;7433:2:105;6035:83:96;;;7415:21:105;7472:2;7452:18;;;7445:30;7511:34;7491:18;;;7484:62;-1:-1:-1;;;7562:18:105;;;7555:45;7617:19;;6035:83:96;7231:411:105;6035:83:96;6129:26;6141:4;6147:7;6129:11;:26::i;4055:185::-;4135:7;4161:12;;;;;;;;;;;-1:-1:-1;;;;;4206:25:96;;4161:72;;:36;;:72;;;;;;4055:185;;;;;:::o;3834:136::-;3907:7;3933:12;;;;;;;;;;:30;;3957:5;3933:23;:30::i;:::-;3926:37;3834:136;-1:-1:-1;;;3834:136:96:o;2819:137::-;2888:4;2911:12;;;;;;;;;;:38;;2941:7;2911:29;:38::i;3124:125::-;3187:7;3213:12;;;;;;;;;;:29;;:27;:29::i;5240:226::-;5332:6;:12;;;;;;;;;;:22;;;5324:45;;719:10:33;2819:137:96;:::i;5324:45::-;5316:106;;;;-1:-1:-1;;;5316:106:96;;7849:2:105;5316:106:96;;;7831:21:105;7888:2;7868:18;;;7861:30;7927:34;7907:18;;;7900:62;-1:-1:-1;;;7978:18:105;;;7971:46;8034:19;;5316:106:96;7647:412:105;4507:523:77;-1:-1:-1;;;;;4735:18:77;;4686:11;4735:18;;;:10;:18;;;;;;4686:11;;4735:18;;4731:71;;;-1:-1:-1;4777:1:77;;-1:-1:-1;4777:1:77;4769:22;;4731:71;4837:57;;;4812:22;4837:57;;;:36;:57;;;;;;;;:69;;;;;;;;;;;4923:100;;-1:-1:-1;;;4923:100:77;;-1:-1:-1;;;;;4837:69:77;;;;;;4923:23;;:100;;4947:6;;4955:12;;4874:19;;4895:10;;5002:11;;;;5015:7;;;;4923:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4916:107;;;;;4507:523;;;;;;;;;;;;:::o;2556:218::-;1085:12;:10;:12::i;:::-;-1:-1:-1;;;;;2658:28:77;::::1;;::::0;;;:10:::1;:28;::::0;;;;;;;;:44;;-1:-1:-1;;2658:44:77::1;::::0;::::1;;::::0;;::::1;::::0;;;2718:49;;8562:51:105;;;8629:18;;;8622:50;2718:49:77::1;::::0;8535:18:105;2718:49:77::1;;;;;;;2556:218:::0;;:::o;7612:150:42:-;7682:4;7705:50;7710:3;-1:-1:-1;;;;;7730:23:42;;7705:4;:50::i;1121:136:77:-;1174:41;2054:4:96;719:10:33;2819:137:96;:::i;1174:41:77:-;1166:84;;;;-1:-1:-1;;;1166:84:77;;8885:2:105;1166:84:77;;;8867:21:105;8924:2;8904:18;;;8897:30;8963:32;8943:18;;;8936:60;9013:18;;1166:84:77;8683:354:105;1166:84:77;1121:136::o;924:124::-;978:10;-1:-1:-1;;;;;992:14:77;978:28;;970:71;;;;-1:-1:-1;;;970:71:77;;9244:2:105;970:71:77;;;9226:21:105;9283:2;9263:18;;;9256:30;9322:32;9302:18;;;9295:60;9372:18;;970:71:77;9042:354:105;7044:184:96;7117:6;:12;;;;;;;;;;:33;;7142:7;7117:24;:33::i;:::-;7113:109;;;7171:40;;719:10:33;;-1:-1:-1;;;;;7171:40:96;;;7183:4;;7171:40;;;;;7044:184;;:::o;7234:188::-;7308:6;:12;;;;;;;;;;:36;;7336:7;7308:27;:36::i;:::-;7304:112;;;7365:40;;719:10:33;;-1:-1:-1;;;;;7365:40:96;;;7377:4;;7365:40;;;;;7234:188;;:::o;8870:156:42:-;8944:7;8994:22;8998:3;9010:5;8994:3;:22::i;8167:165::-;-1:-1:-1;;;;;8300:23:42;;8247:4;3834:19;;;:12;;;:19;;;;;;:24;;8270:55;3738:127;8413:115;8476:7;8502:19;8510:3;4028:18;;3946:107;1697:404;1760:4;3834:19;;;:12;;;:19;;;;;;1776:319;;-1:-1:-1;1818:23:42;;;;;;;;:11;:23;;;;;;;;;;;;;1998:18;;1976:19;;;:12;;;:19;;;;;;:40;;;;2030:11;;1776:319;-1:-1:-1;2079:5:42;2072:12;;7930:156;8003:4;8026:53;8034:3;-1:-1:-1;;;;;8054:23:42;;8026:7;:53::i;4395:118::-;4462:7;4488:3;:11;;4500:5;4488:18;;;;;;;;:::i;:::-;;;;;;;;;4481:25;;4395:118;;;;:::o;2269:1388::-;2335:4;2472:19;;;:12;;;:19;;;;;;2506:15;;2502:1149;;2875:21;2899:14;2912:1;2899:10;:14;:::i;:::-;2947:18;;2875:38;;-1:-1:-1;2927:17:42;;2947:22;;2968:1;;2947:22;:::i;:::-;2927:42;;3001:13;2988:9;:26;2984:398;;3034:17;3054:3;:11;;3066:9;3054:22;;;;;;;;:::i;:::-;;;;;;;;;3034:42;;3205:9;3176:3;:11;;3188:13;3176:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;3288:23;;;:12;;;:23;;;;;:36;;;2984:398;3460:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3552:3;:12;;:19;3565:5;3552:19;;;;;;;;;;;3545:26;;;3593:4;3586:11;;;;;;;2502:1149;3635:5;3628:12;;;;;14:156:105;80:20;;140:4;129:16;;119:27;;109:55;;160:1;157;150:12;109:55;14:156;;;:::o;175:144::-;-1:-1:-1;;;;;263:31:105;;253:42;;243:70;;309:1;306;299:12;243:70;175:144;:::o;324:419::-;420:6;428;436;489:2;477:9;468:7;464:23;460:32;457:52;;;505:1;502;495:12;457:52;528:27;545:9;528:27;:::i;:::-;518:37;;602:2;591:9;587:18;574:32;564:42;;656:2;645:9;641:18;628:32;669:44;707:5;669:44;:::i;:::-;732:5;722:15;;;324:419;;;;;:::o;748:180::-;807:6;860:2;848:9;839:7;835:23;831:32;828:52;;;876:1;873;866:12;828:52;-1:-1:-1;899:23:105;;748:180;-1:-1:-1;748:180:105:o;1115:347::-;1166:8;1176:6;1230:3;1223:4;1215:6;1211:17;1207:27;1197:55;;1248:1;1245;1238:12;1197:55;-1:-1:-1;1271:20:105;;1314:18;1303:30;;1300:50;;;1346:1;1343;1336:12;1300:50;1383:4;1375:6;1371:17;1359:29;;1435:3;1428:4;1419:6;1411;1407:19;1403:30;1400:39;1397:59;;;1452:1;1449;1442:12;1397:59;1115:347;;;;;:::o;1467:1076::-;1589:6;1597;1605;1613;1621;1629;1637;1645;1698:3;1686:9;1677:7;1673:23;1669:33;1666:53;;;1715:1;1712;1705:12;1666:53;1754:9;1741:23;1773:44;1811:5;1773:44;:::i;:::-;1836:5;-1:-1:-1;1860:36:105;1892:2;1877:18;;1860:36;:::i;:::-;1850:46;;1915:36;1947:2;1936:9;1932:18;1915:36;:::i;:::-;1905:46;;1998:2;1987:9;1983:18;1970:32;1960:42;;2053:3;2042:9;2038:19;2025:33;2077:18;2118:2;2110:6;2107:14;2104:34;;;2134:1;2131;2124:12;2104:34;2173:58;2223:7;2214:6;2203:9;2199:22;2173:58;:::i;:::-;2250:8;;-1:-1:-1;2147:84:105;-1:-1:-1;2338:3:105;2323:19;;2310:33;;-1:-1:-1;2355:16:105;;;2352:36;;;2384:1;2381;2374:12;2352:36;;2423:60;2475:7;2464:8;2453:9;2449:24;2423:60;:::i;:::-;1467:1076;;;;-1:-1:-1;1467:1076:105;;-1:-1:-1;1467:1076:105;;;;;;2502:8;-1:-1:-1;;;1467:1076:105:o;2548:328::-;2616:6;2624;2677:2;2665:9;2656:7;2652:23;2648:32;2645:52;;;2693:1;2690;2683:12;2645:52;2729:9;2716:23;2706:33;;2789:2;2778:9;2774:18;2761:32;2802:44;2840:5;2802:44;:::i;:::-;2865:5;2855:15;;;2548:328;;;;;:::o;3089:250::-;3155:6;3163;3216:2;3204:9;3195:7;3191:23;3187:32;3184:52;;;3232:1;3229;3222:12;3184:52;3255:27;3272:9;3255:27;:::i;:::-;3245:37;3329:2;3314:18;;;;3301:32;;-1:-1:-1;;;3089:250:105:o;3755:597::-;3867:4;3896:2;3925;3914:9;3907:21;3957:6;3951:13;4000:6;3995:2;3984:9;3980:18;3973:34;4025:1;4035:140;4049:6;4046:1;4043:13;4035:140;;;4144:14;;;4140:23;;4134:30;4110:17;;;4129:2;4106:26;4099:66;4064:10;;4035:140;;;4193:6;4190:1;4187:13;4184:91;;;4263:1;4258:2;4249:6;4238:9;4234:22;4230:31;4223:42;4184:91;-1:-1:-1;4336:2:105;4315:15;-1:-1:-1;;4311:29:105;4296:45;;;;4343:2;4292:54;;3755:597;-1:-1:-1;;;3755:597:105:o;4357:248::-;4425:6;4433;4486:2;4474:9;4465:7;4461:23;4457:32;4454:52;;;4502:1;4499;4492:12;4454:52;-1:-1:-1;;4525:23:105;;;4595:2;4580:18;;;4567:32;;-1:-1:-1;4357:248:105:o;4802:260::-;4861:6;4914:2;4902:9;4893:7;4889:23;4885:32;4882:52;;;4930:1;4927;4920:12;4882:52;4969:9;4956:23;4988:44;5026:5;4988:44;:::i;5346:429::-;5411:6;5419;5472:2;5460:9;5451:7;5447:23;5443:32;5440:52;;;5488:1;5485;5478:12;5440:52;5527:9;5514:23;5546:44;5584:5;5546:44;:::i;:::-;5609:5;-1:-1:-1;5666:2:105;5651:18;;5638:32;5708:15;;5701:23;5689:36;;5679:64;;5739:1;5736;5729:12;5780:266;5868:6;5863:3;5856:19;5920:6;5913:5;5906:4;5901:3;5897:14;5884:43;-1:-1:-1;5972:1:105;5947:16;;;5965:4;5943:27;;;5936:38;;;;6028:2;6007:15;;;-1:-1:-1;;6003:29:105;5994:39;;;5990:50;;5780:266::o;6051:759::-;6397:1;6393;6388:3;6384:11;6380:19;6372:6;6368:32;6357:9;6350:51;6449:4;6441:6;6437:17;6432:2;6421:9;6417:18;6410:45;6503:4;6495:6;6491:17;6486:2;6475:9;6471:18;6464:45;6545:6;6540:2;6529:9;6525:18;6518:34;6589:3;6583;6572:9;6568:19;6561:32;6331:4;6616:62;6673:3;6662:9;6658:19;6650:6;6642;6616:62;:::i;:::-;6727:9;6719:6;6715:22;6709:3;6698:9;6694:19;6687:51;6755:49;6797:6;6789;6781;6755:49;:::i;:::-;6747:57;6051:759;-1:-1:-1;;;;;;;;;;;6051:759:105:o;8064:325::-;8143:6;8151;8204:2;8192:9;8183:7;8179:23;8175:32;8172:52;;;8220:1;8217;8210:12;8172:52;8249:9;8243:16;8233:26;;8302:2;8291:9;8287:18;8281:25;8315:44;8353:5;8315:44;:::i;9401:127::-;9462:10;9457:3;9453:20;9450:1;9443:31;9493:4;9490:1;9483:15;9517:4;9514:1;9507:15;9533:222;9573:4;9601:1;9598;9595:8;9592:131;;;9645:10;9640:3;9636:20;9633:1;9626:31;9680:4;9677:1;9670:15;9708:4;9705:1;9698:15;9592:131;-1:-1:-1;9740:9:105;;9533:222::o;9760:127::-;9821:10;9816:3;9812:20;9809:1;9802:31;9852:4;9849:1;9842:15;9876:4;9873:1;9866:15",
  "source": "// The Licensed Work is (c) 2022 Sygma\n// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity 0.8.11;\n\nimport \"../interfaces/IFeeHandler.sol\";\nimport \"../utils/AccessControl.sol\";\n\n/**\n    @title Handles FeeHandler routing for resources.\n    @author ChainSafe Systems.\n    @notice This contract is intended to be used with the Bridge contract.\n */\ncontract FeeHandlerRouter is IFeeHandler, AccessControl {\n    address public immutable _bridgeAddress;\n\n    // destination domainID => resourceID => feeHandlerAddress\n    mapping (uint8 => mapping(bytes32 => IFeeHandler)) public _domainResourceIDToFeeHandlerAddress;\n    // whitelisted address => is whitelisted\n    mapping(address => bool) public _whitelist;\n\n    event WhitelistChanged(\n        address whitelistAddress,\n        bool isWhitelisted\n    );\n\n    error IncorrectFeeSupplied(uint256);\n\n    modifier onlyBridge() {\n        _onlyBridge();\n        _;\n    }\n\n    function _onlyBridge() private view {\n        require(msg.sender == _bridgeAddress, \"sender must be bridge contract\");\n    }\n\n    modifier onlyAdmin() {\n        _onlyAdmin();\n        _;\n    }\n\n    function _onlyAdmin() private view {\n        require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), \"sender doesn't have admin role\");\n    }\n\n    /**\n        @notice Getter function for fee handler type\n     */\n    function feeHandlerType() public override pure returns (string memory) {\n        return \"router\";\n    }\n\n    /**\n        @param bridgeAddress Contract address of previously deployed Bridge.\n     */\n    constructor(address bridgeAddress) {\n        _bridgeAddress = bridgeAddress;\n        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);\n    }\n    /**\n        @notice Maps the {handlerAddress} to {resourceID} to {destinationDomainID} in {_domainResourceIDToFeeHandlerAddress}.\n        @param destinationDomainID ID of chain FeeHandler contracts will be called.\n        @param resourceID ResourceID for which the corresponding FeeHandler will collect/calcualte fee.\n        @param handlerAddress Address of FeeHandler which will be called for specified resourceID.\n     */\n    function adminSetResourceHandler(uint8 destinationDomainID, bytes32 resourceID, IFeeHandler handlerAddress) external onlyAdmin {\n        _domainResourceIDToFeeHandlerAddress[destinationDomainID][resourceID] = handlerAddress;\n    }\n\n    /**\n        @notice Sets or revokes fee whitelist from an address.\n        @param whitelistAddress Address to be whitelisted.\n        @param isWhitelisted Set to true to exempt an address from paying fees.\n     */\n    function adminSetWhitelist(address whitelistAddress, bool isWhitelisted) external onlyAdmin {\n        _whitelist[whitelistAddress] = isWhitelisted;\n\n        emit WhitelistChanged(whitelistAddress, isWhitelisted);\n    }\n\n\n    /**\n        @notice Initiates collecting fee with corresponding fee handler contract using IFeeHandler interface.\n        @param sender Sender of the deposit.\n        @param fromDomainID ID of the source chain.\n        @param destinationDomainID ID of chain deposit will be bridged to.\n        @param resourceID ResourceID to be used when making deposits.\n        @param depositData Additional data to be passed to specified handler.\n        @param feeData Additional data to be passed to the fee handler.\n     */\n    function collectFee(address sender, uint8 fromDomainID, uint8 destinationDomainID, bytes32 resourceID, bytes calldata depositData, bytes calldata feeData) payable external onlyBridge {\n        if (_whitelist[sender]) {\n            if (msg.value != 0) revert IncorrectFeeSupplied(msg.value);\n            return;\n        }\n\n        IFeeHandler feeHandler = _domainResourceIDToFeeHandlerAddress[destinationDomainID][resourceID];\n        feeHandler.collectFee{value: msg.value}(sender, fromDomainID, destinationDomainID, resourceID, depositData, feeData);\n    }\n\n    /**\n        @notice Initiates calculating fee with corresponding fee handler contract using IFeeHandler interface.\n        @param sender Sender of the deposit.\n        @param fromDomainID ID of the source chain.\n        @param destinationDomainID ID of chain deposit will be bridged to.\n        @param resourceID ResourceID to be used when making deposits.\n        @param depositData Additional data to be passed to specified handler.\n        @param feeData Additional data to be passed to the fee handler.\n        @return fee Returns the fee amount.\n        @return tokenAddress Returns the address of the token to be used for fee.\n     */\n    function calculateFee(address sender, uint8 fromDomainID, uint8 destinationDomainID, bytes32 resourceID, bytes calldata depositData, bytes calldata feeData) external view returns(uint256 fee, address tokenAddress) {\n        if (_whitelist[sender]) {\n            return (0, address(0));\n        }\n\n        IFeeHandler feeHandler = _domainResourceIDToFeeHandlerAddress[destinationDomainID][resourceID];\n        return feeHandler.calculateFee(sender, fromDomainID, destinationDomainID, resourceID, depositData, feeData);\n    }\n}\n",
  "sourcePath": "/home/runner/work/sygma-solidity/sygma-solidity/contracts/handlers/FeeHandlerRouter.sol",
  "ast": {
    "absolutePath": "project:/contracts/handlers/FeeHandlerRouter.sol",
    "exportedSymbols": {
      "AccessControl": [
        18612
      ],
      "Address": [
        5283
      ],
      "Context": [
        5305
      ],
      "EnumerableSet": [
        7373
      ],
      "FeeHandlerRouter": [
        15170
      ],
      "IFeeHandler": [
        18265
      ]
    },
    "id": 15171,
    "license": "LGPL-3.0-only",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 14919,
        "literals": [
          "solidity",
          "0.8",
          ".11"
        ],
        "nodeType": "PragmaDirective",
        "src": "81:23:77"
      },
      {
        "absolutePath": "project:/contracts/interfaces/IFeeHandler.sol",
        "file": "../interfaces/IFeeHandler.sol",
        "id": 14920,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 15171,
        "sourceUnit": 18266,
        "src": "106:39:77",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "project:/contracts/utils/AccessControl.sol",
        "file": "../utils/AccessControl.sol",
        "id": 14921,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 15171,
        "sourceUnit": 18613,
        "src": "146:36:77",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "baseName": {
              "id": 14923,
              "name": "IFeeHandler",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 18265,
              "src": "380:11:77"
            },
            "id": 14924,
            "nodeType": "InheritanceSpecifier",
            "src": "380:11:77"
          },
          {
            "baseName": {
              "id": 14925,
              "name": "AccessControl",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 18612,
              "src": "393:13:77"
            },
            "id": 14926,
            "nodeType": "InheritanceSpecifier",
            "src": "393:13:77"
          }
        ],
        "canonicalName": "FeeHandlerRouter",
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 14922,
          "nodeType": "StructuredDocumentation",
          "src": "184:166:77",
          "text": "@title Handles FeeHandler routing for resources.\n@author ChainSafe Systems.\n@notice This contract is intended to be used with the Bridge contract."
        },
        "fullyImplemented": true,
        "id": 15170,
        "linearizedBaseContracts": [
          15170,
          18612,
          5305,
          18265
        ],
        "name": "FeeHandlerRouter",
        "nameLocation": "360:16:77",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "functionSelector": "318c136e",
            "id": 14928,
            "mutability": "immutable",
            "name": "_bridgeAddress",
            "nameLocation": "438:14:77",
            "nodeType": "VariableDeclaration",
            "scope": 15170,
            "src": "413:39:77",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 14927,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "413:7:77",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "3d94ebc6",
            "id": 14935,
            "mutability": "mutable",
            "name": "_domainResourceIDToFeeHandlerAddress",
            "nameLocation": "580:36:77",
            "nodeType": "VariableDeclaration",
            "scope": 15170,
            "src": "522:94:77",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_bytes32_$_t_contract$_IFeeHandler_$18265_$_$",
              "typeString": "mapping(uint8 => mapping(bytes32 => contract IFeeHandler))"
            },
            "typeName": {
              "id": 14934,
              "keyType": {
                "id": 14929,
                "name": "uint8",
                "nodeType": "ElementaryTypeName",
                "src": "531:5:77",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint8",
                  "typeString": "uint8"
                }
              },
              "nodeType": "Mapping",
              "src": "522:50:77",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_bytes32_$_t_contract$_IFeeHandler_$18265_$_$",
                "typeString": "mapping(uint8 => mapping(bytes32 => contract IFeeHandler))"
              },
              "valueType": {
                "id": 14933,
                "keyType": {
                  "id": 14930,
                  "name": "bytes32",
                  "nodeType": "ElementaryTypeName",
                  "src": "548:7:77",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  }
                },
                "nodeType": "Mapping",
                "src": "540:31:77",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_bytes32_$_t_contract$_IFeeHandler_$18265_$",
                  "typeString": "mapping(bytes32 => contract IFeeHandler)"
                },
                "valueType": {
                  "id": 14932,
                  "nodeType": "UserDefinedTypeName",
                  "pathNode": {
                    "id": 14931,
                    "name": "IFeeHandler",
                    "nodeType": "IdentifierPath",
                    "referencedDeclaration": 18265,
                    "src": "559:11:77"
                  },
                  "referencedDeclaration": 18265,
                  "src": "559:11:77",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                    "typeString": "contract IFeeHandler"
                  }
                }
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "cfdb63ac",
            "id": 14939,
            "mutability": "mutable",
            "name": "_whitelist",
            "nameLocation": "699:10:77",
            "nodeType": "VariableDeclaration",
            "scope": 15170,
            "src": "667:42:77",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
              "typeString": "mapping(address => bool)"
            },
            "typeName": {
              "id": 14938,
              "keyType": {
                "id": 14936,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "675:7:77",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "667:24:77",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                "typeString": "mapping(address => bool)"
              },
              "valueType": {
                "id": 14937,
                "name": "bool",
                "nodeType": "ElementaryTypeName",
                "src": "686:4:77",
                "typeDescriptions": {
                  "typeIdentifier": "t_bool",
                  "typeString": "bool"
                }
              }
            },
            "visibility": "public"
          },
          {
            "anonymous": false,
            "id": 14945,
            "name": "WhitelistChanged",
            "nameLocation": "722:16:77",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 14944,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 14941,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "whitelistAddress",
                  "nameLocation": "756:16:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 14945,
                  "src": "748:24:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 14940,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "748:7:77",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 14943,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "isWhitelisted",
                  "nameLocation": "787:13:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 14945,
                  "src": "782:18:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 14942,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "782:4:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "738:68:77"
            },
            "src": "716:91:77"
          },
          {
            "id": 14949,
            "name": "IncorrectFeeSupplied",
            "nameLocation": "819:20:77",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 14948,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 14947,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 14949,
                  "src": "840:7:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 14946,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "840:7:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "839:9:77"
            },
            "src": "813:36:77"
          },
          {
            "body": {
              "id": 14955,
              "nodeType": "Block",
              "src": "877:41:77",
              "statements": [
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 14951,
                      "name": "_onlyBridge",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 14968,
                      "src": "887:11:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$__$returns$__$",
                        "typeString": "function () view"
                      }
                    },
                    "id": 14952,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "887:13:77",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 14953,
                  "nodeType": "ExpressionStatement",
                  "src": "887:13:77"
                },
                {
                  "id": 14954,
                  "nodeType": "PlaceholderStatement",
                  "src": "910:1:77"
                }
              ]
            },
            "id": 14956,
            "name": "onlyBridge",
            "nameLocation": "864:10:77",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 14950,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "874:2:77"
            },
            "src": "855:63:77",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 14967,
              "nodeType": "Block",
              "src": "960:88:77",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 14963,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "expression": {
                            "id": 14960,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4294967281,
                            "src": "978:3:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 14961,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "src": "978:10:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "id": 14962,
                          "name": "_bridgeAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 14928,
                          "src": "992:14:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "978:28:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "73656e646572206d7573742062652062726964676520636f6e7472616374",
                        "id": 14964,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1008:32:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_0febc0fc8991eb26dfaaceeb4d73d25b76da338550ed76c60410fec84388058e",
                          "typeString": "literal_string \"sender must be bridge contract\""
                        },
                        "value": "sender must be bridge contract"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_0febc0fc8991eb26dfaaceeb4d73d25b76da338550ed76c60410fec84388058e",
                          "typeString": "literal_string \"sender must be bridge contract\""
                        }
                      ],
                      "id": 14959,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "970:7:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 14965,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "970:71:77",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 14966,
                  "nodeType": "ExpressionStatement",
                  "src": "970:71:77"
                }
              ]
            },
            "id": 14968,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_onlyBridge",
            "nameLocation": "933:11:77",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 14957,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "944:2:77"
            },
            "returnParameters": {
              "id": 14958,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "960:0:77"
            },
            "scope": 15170,
            "src": "924:124:77",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          },
          {
            "body": {
              "id": 14974,
              "nodeType": "Block",
              "src": "1075:40:77",
              "statements": [
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 14970,
                      "name": "_onlyAdmin",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 14988,
                      "src": "1085:10:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$__$returns$__$",
                        "typeString": "function () view"
                      }
                    },
                    "id": 14971,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1085:12:77",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 14972,
                  "nodeType": "ExpressionStatement",
                  "src": "1085:12:77"
                },
                {
                  "id": 14973,
                  "nodeType": "PlaceholderStatement",
                  "src": "1107:1:77"
                }
              ]
            },
            "id": 14975,
            "name": "onlyAdmin",
            "nameLocation": "1063:9:77",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 14969,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1072:2:77"
            },
            "src": "1054:61:77",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 14987,
              "nodeType": "Block",
              "src": "1156:101:77",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 14980,
                            "name": "DEFAULT_ADMIN_ROLE",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18344,
                            "src": "1182:18:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          {
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 14981,
                              "name": "_msgSender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5295,
                              "src": "1202:10:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                                "typeString": "function () view returns (address)"
                              }
                            },
                            "id": 14982,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1202:12:77",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 14979,
                          "name": "hasRole",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18381,
                          "src": "1174:7:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_address_$returns$_t_bool_$",
                            "typeString": "function (bytes32,address) view returns (bool)"
                          }
                        },
                        "id": 14983,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1174:41:77",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "73656e64657220646f65736e277420686176652061646d696e20726f6c65",
                        "id": 14984,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1217:32:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_cccb3b305edc7308d7027b1001041a46b235f7d3213d690bb469676069d9b205",
                          "typeString": "literal_string \"sender doesn't have admin role\""
                        },
                        "value": "sender doesn't have admin role"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_cccb3b305edc7308d7027b1001041a46b235f7d3213d690bb469676069d9b205",
                          "typeString": "literal_string \"sender doesn't have admin role\""
                        }
                      ],
                      "id": 14978,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "1166:7:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 14985,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1166:84:77",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 14986,
                  "nodeType": "ExpressionStatement",
                  "src": "1166:84:77"
                }
              ]
            },
            "id": 14988,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_onlyAdmin",
            "nameLocation": "1130:10:77",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 14976,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1140:2:77"
            },
            "returnParameters": {
              "id": 14977,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1156:0:77"
            },
            "scope": 15170,
            "src": "1121:136:77",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          },
          {
            "baseFunctions": [
              18264
            ],
            "body": {
              "id": 14997,
              "nodeType": "Block",
              "src": "1403:32:77",
              "statements": [
                {
                  "expression": {
                    "hexValue": "726f75746572",
                    "id": 14995,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "1420:8:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_5f6d4e9bb70c9d2aa50e18560b4cdd1b23b30d62b60873d5f23b103e5d7d0185",
                      "typeString": "literal_string \"router\""
                    },
                    "value": "router"
                  },
                  "functionReturnParameters": 14994,
                  "id": 14996,
                  "nodeType": "Return",
                  "src": "1413:15:77"
                }
              ]
            },
            "documentation": {
              "id": 14989,
              "nodeType": "StructuredDocumentation",
              "src": "1263:64:77",
              "text": "@notice Getter function for fee handler type"
            },
            "functionSelector": "542774b5",
            "id": 14998,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "feeHandlerType",
            "nameLocation": "1341:14:77",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 14991,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "1365:8:77"
            },
            "parameters": {
              "id": 14990,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1355:2:77"
            },
            "returnParameters": {
              "id": 14994,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 14993,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 14998,
                  "src": "1388:13:77",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 14992,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1388:6:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1387:15:77"
            },
            "scope": 15170,
            "src": "1332:103:77",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 15014,
              "nodeType": "Block",
              "src": "1569:99:77",
              "statements": [
                {
                  "expression": {
                    "id": 15006,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 15004,
                      "name": "_bridgeAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 14928,
                      "src": "1579:14:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 15005,
                      "name": "bridgeAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 15001,
                      "src": "1596:13:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1579:30:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 15007,
                  "nodeType": "ExpressionStatement",
                  "src": "1579:30:77"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 15009,
                        "name": "DEFAULT_ADMIN_ROLE",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18344,
                        "src": "1630:18:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "expression": {
                          "id": 15010,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4294967281,
                          "src": "1650:3:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 15011,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "1650:10:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 15008,
                      "name": "_setupRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18547,
                      "src": "1619:10:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 15012,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1619:42:77",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 15013,
                  "nodeType": "ExpressionStatement",
                  "src": "1619:42:77"
                }
              ]
            },
            "documentation": {
              "id": 14999,
              "nodeType": "StructuredDocumentation",
              "src": "1441:88:77",
              "text": "@param bridgeAddress Contract address of previously deployed Bridge."
            },
            "id": 15015,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 15002,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15001,
                  "mutability": "mutable",
                  "name": "bridgeAddress",
                  "nameLocation": "1554:13:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15015,
                  "src": "1546:21:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 15000,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1546:7:77",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1545:23:77"
            },
            "returnParameters": {
              "id": 15003,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1569:0:77"
            },
            "scope": 15170,
            "src": "1534:134:77",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 15036,
              "nodeType": "Block",
              "src": "2229:103:77",
              "statements": [
                {
                  "expression": {
                    "id": 15034,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "baseExpression": {
                          "id": 15028,
                          "name": "_domainResourceIDToFeeHandlerAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 14935,
                          "src": "2239:36:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_bytes32_$_t_contract$_IFeeHandler_$18265_$_$",
                            "typeString": "mapping(uint8 => mapping(bytes32 => contract IFeeHandler))"
                          }
                        },
                        "id": 15031,
                        "indexExpression": {
                          "id": 15029,
                          "name": "destinationDomainID",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 15018,
                          "src": "2276:19:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "2239:57:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_bytes32_$_t_contract$_IFeeHandler_$18265_$",
                          "typeString": "mapping(bytes32 => contract IFeeHandler)"
                        }
                      },
                      "id": 15032,
                      "indexExpression": {
                        "id": 15030,
                        "name": "resourceID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15020,
                        "src": "2297:10:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "2239:69:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                        "typeString": "contract IFeeHandler"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 15033,
                      "name": "handlerAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 15023,
                      "src": "2311:14:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                        "typeString": "contract IFeeHandler"
                      }
                    },
                    "src": "2239:86:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                      "typeString": "contract IFeeHandler"
                    }
                  },
                  "id": 15035,
                  "nodeType": "ExpressionStatement",
                  "src": "2239:86:77"
                }
              ]
            },
            "documentation": {
              "id": 15016,
              "nodeType": "StructuredDocumentation",
              "src": "1673:424:77",
              "text": "@notice Maps the {handlerAddress} to {resourceID} to {destinationDomainID} in {_domainResourceIDToFeeHandlerAddress}.\n@param destinationDomainID ID of chain FeeHandler contracts will be called.\n@param resourceID ResourceID for which the corresponding FeeHandler will collect/calcualte fee.\n@param handlerAddress Address of FeeHandler which will be called for specified resourceID."
            },
            "functionSelector": "1af5fe38",
            "id": 15037,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 15026,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 15025,
                  "name": "onlyAdmin",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 14975,
                  "src": "2219:9:77"
                },
                "nodeType": "ModifierInvocation",
                "src": "2219:9:77"
              }
            ],
            "name": "adminSetResourceHandler",
            "nameLocation": "2111:23:77",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 15024,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15018,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "2141:19:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15037,
                  "src": "2135:25:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 15017,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "2135:5:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15020,
                  "mutability": "mutable",
                  "name": "resourceID",
                  "nameLocation": "2170:10:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15037,
                  "src": "2162:18:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 15019,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2162:7:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15023,
                  "mutability": "mutable",
                  "name": "handlerAddress",
                  "nameLocation": "2194:14:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15037,
                  "src": "2182:26:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                    "typeString": "contract IFeeHandler"
                  },
                  "typeName": {
                    "id": 15022,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 15021,
                      "name": "IFeeHandler",
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 18265,
                      "src": "2182:11:77"
                    },
                    "referencedDeclaration": 18265,
                    "src": "2182:11:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                      "typeString": "contract IFeeHandler"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2134:75:77"
            },
            "returnParameters": {
              "id": 15027,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2229:0:77"
            },
            "scope": 15170,
            "src": "2102:230:77",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 15058,
              "nodeType": "Block",
              "src": "2648:126:77",
              "statements": [
                {
                  "expression": {
                    "id": 15051,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 15047,
                        "name": "_whitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 14939,
                        "src": "2658:10:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 15049,
                      "indexExpression": {
                        "id": 15048,
                        "name": "whitelistAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15040,
                        "src": "2669:16:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "2658:28:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 15050,
                      "name": "isWhitelisted",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 15042,
                      "src": "2689:13:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "2658:44:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 15052,
                  "nodeType": "ExpressionStatement",
                  "src": "2658:44:77"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 15054,
                        "name": "whitelistAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15040,
                        "src": "2735:16:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 15055,
                        "name": "isWhitelisted",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15042,
                        "src": "2753:13:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 15053,
                      "name": "WhitelistChanged",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 14945,
                      "src": "2718:16:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_bool_$returns$__$",
                        "typeString": "function (address,bool)"
                      }
                    },
                    "id": 15056,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2718:49:77",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 15057,
                  "nodeType": "EmitStatement",
                  "src": "2713:54:77"
                }
              ]
            },
            "documentation": {
              "id": 15038,
              "nodeType": "StructuredDocumentation",
              "src": "2338:213:77",
              "text": "@notice Sets or revokes fee whitelist from an address.\n@param whitelistAddress Address to be whitelisted.\n@param isWhitelisted Set to true to exempt an address from paying fees."
            },
            "functionSelector": "f1382b26",
            "id": 15059,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 15045,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 15044,
                  "name": "onlyAdmin",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 14975,
                  "src": "2638:9:77"
                },
                "nodeType": "ModifierInvocation",
                "src": "2638:9:77"
              }
            ],
            "name": "adminSetWhitelist",
            "nameLocation": "2565:17:77",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 15043,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15040,
                  "mutability": "mutable",
                  "name": "whitelistAddress",
                  "nameLocation": "2591:16:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15059,
                  "src": "2583:24:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 15039,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2583:7:77",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15042,
                  "mutability": "mutable",
                  "name": "isWhitelisted",
                  "nameLocation": "2614:13:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15059,
                  "src": "2609:18:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 15041,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2609:4:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2582:46:77"
            },
            "returnParameters": {
              "id": 15046,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2648:0:77"
            },
            "scope": 15170,
            "src": "2556:218:77",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              18238
            ],
            "body": {
              "id": 15116,
              "nodeType": "Block",
              "src": "3482:374:77",
              "statements": [
                {
                  "condition": {
                    "baseExpression": {
                      "id": 15077,
                      "name": "_whitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 14939,
                      "src": "3496:10:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                        "typeString": "mapping(address => bool)"
                      }
                    },
                    "id": 15079,
                    "indexExpression": {
                      "id": 15078,
                      "name": "sender",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 15062,
                      "src": "3507:6:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "3496:18:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 15092,
                  "nodeType": "IfStatement",
                  "src": "3492:127:77",
                  "trueBody": {
                    "id": 15091,
                    "nodeType": "Block",
                    "src": "3516:103:77",
                    "statements": [
                      {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 15083,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 15080,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4294967281,
                              "src": "3534:3:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 15081,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "value",
                            "nodeType": "MemberAccess",
                            "src": "3534:9:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "hexValue": "30",
                            "id": 15082,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "3547:1:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "3534:14:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 15089,
                        "nodeType": "IfStatement",
                        "src": "3530:58:77",
                        "trueBody": {
                          "errorCall": {
                            "arguments": [
                              {
                                "expression": {
                                  "id": 15085,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4294967281,
                                  "src": "3578:3:77",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 15086,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "value",
                                "nodeType": "MemberAccess",
                                "src": "3578:9:77",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 15084,
                              "name": "IncorrectFeeSupplied",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14949,
                              "src": "3557:20:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_error_pure$_t_uint256_$returns$__$",
                                "typeString": "function (uint256) pure"
                              }
                            },
                            "id": 15087,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3557:31:77",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$__$",
                              "typeString": "tuple()"
                            }
                          },
                          "id": 15088,
                          "nodeType": "RevertStatement",
                          "src": "3550:38:77"
                        }
                      },
                      {
                        "functionReturnParameters": 15076,
                        "id": 15090,
                        "nodeType": "Return",
                        "src": "3602:7:77"
                      }
                    ]
                  }
                },
                {
                  "assignments": [
                    15095
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 15095,
                      "mutability": "mutable",
                      "name": "feeHandler",
                      "nameLocation": "3641:10:77",
                      "nodeType": "VariableDeclaration",
                      "scope": 15116,
                      "src": "3629:22:77",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                        "typeString": "contract IFeeHandler"
                      },
                      "typeName": {
                        "id": 15094,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 15093,
                          "name": "IFeeHandler",
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 18265,
                          "src": "3629:11:77"
                        },
                        "referencedDeclaration": 18265,
                        "src": "3629:11:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                          "typeString": "contract IFeeHandler"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 15101,
                  "initialValue": {
                    "baseExpression": {
                      "baseExpression": {
                        "id": 15096,
                        "name": "_domainResourceIDToFeeHandlerAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 14935,
                        "src": "3654:36:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_bytes32_$_t_contract$_IFeeHandler_$18265_$_$",
                          "typeString": "mapping(uint8 => mapping(bytes32 => contract IFeeHandler))"
                        }
                      },
                      "id": 15098,
                      "indexExpression": {
                        "id": 15097,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15066,
                        "src": "3691:19:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "3654:57:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_bytes32_$_t_contract$_IFeeHandler_$18265_$",
                        "typeString": "mapping(bytes32 => contract IFeeHandler)"
                      }
                    },
                    "id": 15100,
                    "indexExpression": {
                      "id": 15099,
                      "name": "resourceID",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 15068,
                      "src": "3712:10:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "3654:69:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                      "typeString": "contract IFeeHandler"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3629:94:77"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 15108,
                        "name": "sender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15062,
                        "src": "3773:6:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 15109,
                        "name": "fromDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15064,
                        "src": "3781:12:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 15110,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15066,
                        "src": "3795:19:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 15111,
                        "name": "resourceID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15068,
                        "src": "3816:10:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 15112,
                        "name": "depositData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15070,
                        "src": "3828:11:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      },
                      {
                        "id": 15113,
                        "name": "feeData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15072,
                        "src": "3841:7:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        },
                        {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          },
                          {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          },
                          {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          },
                          {
                            "typeIdentifier": "t_bytes_calldata_ptr",
                            "typeString": "bytes calldata"
                          },
                          {
                            "typeIdentifier": "t_bytes_calldata_ptr",
                            "typeString": "bytes calldata"
                          }
                        ],
                        "expression": {
                          "id": 15102,
                          "name": "feeHandler",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 15095,
                          "src": "3733:10:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                            "typeString": "contract IFeeHandler"
                          }
                        },
                        "id": 15104,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "collectFee",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 18238,
                        "src": "3733:21:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_payable$_t_address_$_t_uint8_$_t_uint8_$_t_bytes32_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$returns$__$",
                          "typeString": "function (address,uint8,uint8,bytes32,bytes memory,bytes memory) payable external"
                        }
                      },
                      "id": 15107,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "names": [
                        "value"
                      ],
                      "nodeType": "FunctionCallOptions",
                      "options": [
                        {
                          "expression": {
                            "id": 15105,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4294967281,
                            "src": "3762:3:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 15106,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "value",
                          "nodeType": "MemberAccess",
                          "src": "3762:9:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "src": "3733:39:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_payable$_t_address_$_t_uint8_$_t_uint8_$_t_bytes32_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$returns$__$value",
                        "typeString": "function (address,uint8,uint8,bytes32,bytes memory,bytes memory) payable external"
                      }
                    },
                    "id": 15114,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3733:116:77",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 15115,
                  "nodeType": "ExpressionStatement",
                  "src": "3733:116:77"
                }
              ]
            },
            "documentation": {
              "id": 15060,
              "nodeType": "StructuredDocumentation",
              "src": "2781:513:77",
              "text": "@notice Initiates collecting fee with corresponding fee handler contract using IFeeHandler interface.\n@param sender Sender of the deposit.\n@param fromDomainID ID of the source chain.\n@param destinationDomainID ID of chain deposit will be bridged to.\n@param resourceID ResourceID to be used when making deposits.\n@param depositData Additional data to be passed to specified handler.\n@param feeData Additional data to be passed to the fee handler."
            },
            "functionSelector": "25307065",
            "id": 15117,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 15075,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 15074,
                  "name": "onlyBridge",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 14956,
                  "src": "3471:10:77"
                },
                "nodeType": "ModifierInvocation",
                "src": "3471:10:77"
              }
            ],
            "name": "collectFee",
            "nameLocation": "3308:10:77",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 15073,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15062,
                  "mutability": "mutable",
                  "name": "sender",
                  "nameLocation": "3327:6:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15117,
                  "src": "3319:14:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 15061,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3319:7:77",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15064,
                  "mutability": "mutable",
                  "name": "fromDomainID",
                  "nameLocation": "3341:12:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15117,
                  "src": "3335:18:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 15063,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "3335:5:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15066,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "3361:19:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15117,
                  "src": "3355:25:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 15065,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "3355:5:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15068,
                  "mutability": "mutable",
                  "name": "resourceID",
                  "nameLocation": "3390:10:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15117,
                  "src": "3382:18:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 15067,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3382:7:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15070,
                  "mutability": "mutable",
                  "name": "depositData",
                  "nameLocation": "3417:11:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15117,
                  "src": "3402:26:77",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 15069,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "3402:5:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15072,
                  "mutability": "mutable",
                  "name": "feeData",
                  "nameLocation": "3445:7:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15117,
                  "src": "3430:22:77",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 15071,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "3430:5:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3318:135:77"
            },
            "returnParameters": {
              "id": 15076,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3482:0:77"
            },
            "scope": 15170,
            "src": "3299:557:77",
            "stateMutability": "payable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              18258
            ],
            "body": {
              "id": 15168,
              "nodeType": "Block",
              "src": "4721:309:77",
              "statements": [
                {
                  "condition": {
                    "baseExpression": {
                      "id": 15137,
                      "name": "_whitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 14939,
                      "src": "4735:10:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                        "typeString": "mapping(address => bool)"
                      }
                    },
                    "id": 15139,
                    "indexExpression": {
                      "id": 15138,
                      "name": "sender",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 15120,
                      "src": "4746:6:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "4735:18:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 15148,
                  "nodeType": "IfStatement",
                  "src": "4731:71:77",
                  "trueBody": {
                    "id": 15147,
                    "nodeType": "Block",
                    "src": "4755:47:77",
                    "statements": [
                      {
                        "expression": {
                          "components": [
                            {
                              "hexValue": "30",
                              "id": 15140,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4777:1:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            {
                              "arguments": [
                                {
                                  "hexValue": "30",
                                  "id": 15143,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "4788:1:77",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 15142,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "4780:7:77",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 15141,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "4780:7:77",
                                  "typeDescriptions": {}
                                }
                              },
                              "id": 15144,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4780:10:77",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "id": 15145,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "4776:15:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_rational_0_by_1_$_t_address_$",
                            "typeString": "tuple(int_const 0,address)"
                          }
                        },
                        "functionReturnParameters": 15136,
                        "id": 15146,
                        "nodeType": "Return",
                        "src": "4769:22:77"
                      }
                    ]
                  }
                },
                {
                  "assignments": [
                    15151
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 15151,
                      "mutability": "mutable",
                      "name": "feeHandler",
                      "nameLocation": "4824:10:77",
                      "nodeType": "VariableDeclaration",
                      "scope": 15168,
                      "src": "4812:22:77",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                        "typeString": "contract IFeeHandler"
                      },
                      "typeName": {
                        "id": 15150,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 15149,
                          "name": "IFeeHandler",
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 18265,
                          "src": "4812:11:77"
                        },
                        "referencedDeclaration": 18265,
                        "src": "4812:11:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                          "typeString": "contract IFeeHandler"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 15157,
                  "initialValue": {
                    "baseExpression": {
                      "baseExpression": {
                        "id": 15152,
                        "name": "_domainResourceIDToFeeHandlerAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 14935,
                        "src": "4837:36:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_bytes32_$_t_contract$_IFeeHandler_$18265_$_$",
                          "typeString": "mapping(uint8 => mapping(bytes32 => contract IFeeHandler))"
                        }
                      },
                      "id": 15154,
                      "indexExpression": {
                        "id": 15153,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15124,
                        "src": "4874:19:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "4837:57:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_bytes32_$_t_contract$_IFeeHandler_$18265_$",
                        "typeString": "mapping(bytes32 => contract IFeeHandler)"
                      }
                    },
                    "id": 15156,
                    "indexExpression": {
                      "id": 15155,
                      "name": "resourceID",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 15126,
                      "src": "4895:10:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "4837:69:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                      "typeString": "contract IFeeHandler"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4812:94:77"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 15160,
                        "name": "sender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15120,
                        "src": "4947:6:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 15161,
                        "name": "fromDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15122,
                        "src": "4955:12:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 15162,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15124,
                        "src": "4969:19:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 15163,
                        "name": "resourceID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15126,
                        "src": "4990:10:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 15164,
                        "name": "depositData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15128,
                        "src": "5002:11:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      },
                      {
                        "id": 15165,
                        "name": "feeData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15130,
                        "src": "5015:7:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        },
                        {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      ],
                      "expression": {
                        "id": 15158,
                        "name": "feeHandler",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15151,
                        "src": "4923:10:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                          "typeString": "contract IFeeHandler"
                        }
                      },
                      "id": 15159,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "calculateFee",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 18258,
                      "src": "4923:23:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_address_$_t_uint8_$_t_uint8_$_t_bytes32_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$returns$_t_uint256_$_t_address_$",
                        "typeString": "function (address,uint8,uint8,bytes32,bytes memory,bytes memory) view external returns (uint256,address)"
                      }
                    },
                    "id": 15166,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4923:100:77",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_uint256_$_t_address_$",
                      "typeString": "tuple(uint256,address)"
                    }
                  },
                  "functionReturnParameters": 15136,
                  "id": 15167,
                  "nodeType": "Return",
                  "src": "4916:107:77"
                }
              ]
            },
            "documentation": {
              "id": 15118,
              "nodeType": "StructuredDocumentation",
              "src": "3862:640:77",
              "text": "@notice Initiates calculating fee with corresponding fee handler contract using IFeeHandler interface.\n@param sender Sender of the deposit.\n@param fromDomainID ID of the source chain.\n@param destinationDomainID ID of chain deposit will be bridged to.\n@param resourceID ResourceID to be used when making deposits.\n@param depositData Additional data to be passed to specified handler.\n@param feeData Additional data to be passed to the fee handler.\n@return fee Returns the fee amount.\n@return tokenAddress Returns the address of the token to be used for fee."
            },
            "functionSelector": "ef4f081f",
            "id": 15169,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "calculateFee",
            "nameLocation": "4516:12:77",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 15131,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15120,
                  "mutability": "mutable",
                  "name": "sender",
                  "nameLocation": "4537:6:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15169,
                  "src": "4529:14:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 15119,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4529:7:77",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15122,
                  "mutability": "mutable",
                  "name": "fromDomainID",
                  "nameLocation": "4551:12:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15169,
                  "src": "4545:18:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 15121,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "4545:5:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15124,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "4571:19:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15169,
                  "src": "4565:25:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 15123,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "4565:5:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15126,
                  "mutability": "mutable",
                  "name": "resourceID",
                  "nameLocation": "4600:10:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15169,
                  "src": "4592:18:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 15125,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4592:7:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15128,
                  "mutability": "mutable",
                  "name": "depositData",
                  "nameLocation": "4627:11:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15169,
                  "src": "4612:26:77",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 15127,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "4612:5:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15130,
                  "mutability": "mutable",
                  "name": "feeData",
                  "nameLocation": "4655:7:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15169,
                  "src": "4640:22:77",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 15129,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "4640:5:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4528:135:77"
            },
            "returnParameters": {
              "id": 15136,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15133,
                  "mutability": "mutable",
                  "name": "fee",
                  "nameLocation": "4694:3:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15169,
                  "src": "4686:11:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 15132,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4686:7:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15135,
                  "mutability": "mutable",
                  "name": "tokenAddress",
                  "nameLocation": "4707:12:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15169,
                  "src": "4699:20:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 15134,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4699:7:77",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4685:35:77"
            },
            "scope": 15170,
            "src": "4507:523:77",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 15171,
        "src": "351:4681:77",
        "usedErrors": [
          14949
        ]
      }
    ],
    "src": "81:4952:77"
  },
  "legacyAST": {
    "absolutePath": "project:/contracts/handlers/FeeHandlerRouter.sol",
    "exportedSymbols": {
      "AccessControl": [
        18612
      ],
      "Address": [
        5283
      ],
      "Context": [
        5305
      ],
      "EnumerableSet": [
        7373
      ],
      "FeeHandlerRouter": [
        15170
      ],
      "IFeeHandler": [
        18265
      ]
    },
    "id": 15171,
    "license": "LGPL-3.0-only",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 14919,
        "literals": [
          "solidity",
          "0.8",
          ".11"
        ],
        "nodeType": "PragmaDirective",
        "src": "81:23:77"
      },
      {
        "absolutePath": "project:/contracts/interfaces/IFeeHandler.sol",
        "file": "../interfaces/IFeeHandler.sol",
        "id": 14920,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 15171,
        "sourceUnit": 18266,
        "src": "106:39:77",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "project:/contracts/utils/AccessControl.sol",
        "file": "../utils/AccessControl.sol",
        "id": 14921,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 15171,
        "sourceUnit": 18613,
        "src": "146:36:77",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "baseName": {
              "id": 14923,
              "name": "IFeeHandler",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 18265,
              "src": "380:11:77"
            },
            "id": 14924,
            "nodeType": "InheritanceSpecifier",
            "src": "380:11:77"
          },
          {
            "baseName": {
              "id": 14925,
              "name": "AccessControl",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 18612,
              "src": "393:13:77"
            },
            "id": 14926,
            "nodeType": "InheritanceSpecifier",
            "src": "393:13:77"
          }
        ],
        "canonicalName": "FeeHandlerRouter",
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 14922,
          "nodeType": "StructuredDocumentation",
          "src": "184:166:77",
          "text": "@title Handles FeeHandler routing for resources.\n@author ChainSafe Systems.\n@notice This contract is intended to be used with the Bridge contract."
        },
        "fullyImplemented": true,
        "id": 15170,
        "linearizedBaseContracts": [
          15170,
          18612,
          5305,
          18265
        ],
        "name": "FeeHandlerRouter",
        "nameLocation": "360:16:77",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "functionSelector": "318c136e",
            "id": 14928,
            "mutability": "immutable",
            "name": "_bridgeAddress",
            "nameLocation": "438:14:77",
            "nodeType": "VariableDeclaration",
            "scope": 15170,
            "src": "413:39:77",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 14927,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "413:7:77",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "3d94ebc6",
            "id": 14935,
            "mutability": "mutable",
            "name": "_domainResourceIDToFeeHandlerAddress",
            "nameLocation": "580:36:77",
            "nodeType": "VariableDeclaration",
            "scope": 15170,
            "src": "522:94:77",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_bytes32_$_t_contract$_IFeeHandler_$18265_$_$",
              "typeString": "mapping(uint8 => mapping(bytes32 => contract IFeeHandler))"
            },
            "typeName": {
              "id": 14934,
              "keyType": {
                "id": 14929,
                "name": "uint8",
                "nodeType": "ElementaryTypeName",
                "src": "531:5:77",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint8",
                  "typeString": "uint8"
                }
              },
              "nodeType": "Mapping",
              "src": "522:50:77",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_bytes32_$_t_contract$_IFeeHandler_$18265_$_$",
                "typeString": "mapping(uint8 => mapping(bytes32 => contract IFeeHandler))"
              },
              "valueType": {
                "id": 14933,
                "keyType": {
                  "id": 14930,
                  "name": "bytes32",
                  "nodeType": "ElementaryTypeName",
                  "src": "548:7:77",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  }
                },
                "nodeType": "Mapping",
                "src": "540:31:77",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_bytes32_$_t_contract$_IFeeHandler_$18265_$",
                  "typeString": "mapping(bytes32 => contract IFeeHandler)"
                },
                "valueType": {
                  "id": 14932,
                  "nodeType": "UserDefinedTypeName",
                  "pathNode": {
                    "id": 14931,
                    "name": "IFeeHandler",
                    "nodeType": "IdentifierPath",
                    "referencedDeclaration": 18265,
                    "src": "559:11:77"
                  },
                  "referencedDeclaration": 18265,
                  "src": "559:11:77",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                    "typeString": "contract IFeeHandler"
                  }
                }
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "cfdb63ac",
            "id": 14939,
            "mutability": "mutable",
            "name": "_whitelist",
            "nameLocation": "699:10:77",
            "nodeType": "VariableDeclaration",
            "scope": 15170,
            "src": "667:42:77",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
              "typeString": "mapping(address => bool)"
            },
            "typeName": {
              "id": 14938,
              "keyType": {
                "id": 14936,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "675:7:77",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "667:24:77",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                "typeString": "mapping(address => bool)"
              },
              "valueType": {
                "id": 14937,
                "name": "bool",
                "nodeType": "ElementaryTypeName",
                "src": "686:4:77",
                "typeDescriptions": {
                  "typeIdentifier": "t_bool",
                  "typeString": "bool"
                }
              }
            },
            "visibility": "public"
          },
          {
            "anonymous": false,
            "id": 14945,
            "name": "WhitelistChanged",
            "nameLocation": "722:16:77",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 14944,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 14941,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "whitelistAddress",
                  "nameLocation": "756:16:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 14945,
                  "src": "748:24:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 14940,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "748:7:77",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 14943,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "isWhitelisted",
                  "nameLocation": "787:13:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 14945,
                  "src": "782:18:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 14942,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "782:4:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "738:68:77"
            },
            "src": "716:91:77"
          },
          {
            "id": 14949,
            "name": "IncorrectFeeSupplied",
            "nameLocation": "819:20:77",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 14948,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 14947,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 14949,
                  "src": "840:7:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 14946,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "840:7:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "839:9:77"
            },
            "src": "813:36:77"
          },
          {
            "body": {
              "id": 14955,
              "nodeType": "Block",
              "src": "877:41:77",
              "statements": [
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 14951,
                      "name": "_onlyBridge",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 14968,
                      "src": "887:11:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$__$returns$__$",
                        "typeString": "function () view"
                      }
                    },
                    "id": 14952,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "887:13:77",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 14953,
                  "nodeType": "ExpressionStatement",
                  "src": "887:13:77"
                },
                {
                  "id": 14954,
                  "nodeType": "PlaceholderStatement",
                  "src": "910:1:77"
                }
              ]
            },
            "id": 14956,
            "name": "onlyBridge",
            "nameLocation": "864:10:77",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 14950,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "874:2:77"
            },
            "src": "855:63:77",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 14967,
              "nodeType": "Block",
              "src": "960:88:77",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 14963,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "expression": {
                            "id": 14960,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4294967281,
                            "src": "978:3:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 14961,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "src": "978:10:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "id": 14962,
                          "name": "_bridgeAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 14928,
                          "src": "992:14:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "978:28:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "73656e646572206d7573742062652062726964676520636f6e7472616374",
                        "id": 14964,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1008:32:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_0febc0fc8991eb26dfaaceeb4d73d25b76da338550ed76c60410fec84388058e",
                          "typeString": "literal_string \"sender must be bridge contract\""
                        },
                        "value": "sender must be bridge contract"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_0febc0fc8991eb26dfaaceeb4d73d25b76da338550ed76c60410fec84388058e",
                          "typeString": "literal_string \"sender must be bridge contract\""
                        }
                      ],
                      "id": 14959,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "970:7:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 14965,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "970:71:77",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 14966,
                  "nodeType": "ExpressionStatement",
                  "src": "970:71:77"
                }
              ]
            },
            "id": 14968,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_onlyBridge",
            "nameLocation": "933:11:77",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 14957,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "944:2:77"
            },
            "returnParameters": {
              "id": 14958,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "960:0:77"
            },
            "scope": 15170,
            "src": "924:124:77",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          },
          {
            "body": {
              "id": 14974,
              "nodeType": "Block",
              "src": "1075:40:77",
              "statements": [
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 14970,
                      "name": "_onlyAdmin",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 14988,
                      "src": "1085:10:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$__$returns$__$",
                        "typeString": "function () view"
                      }
                    },
                    "id": 14971,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1085:12:77",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 14972,
                  "nodeType": "ExpressionStatement",
                  "src": "1085:12:77"
                },
                {
                  "id": 14973,
                  "nodeType": "PlaceholderStatement",
                  "src": "1107:1:77"
                }
              ]
            },
            "id": 14975,
            "name": "onlyAdmin",
            "nameLocation": "1063:9:77",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 14969,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1072:2:77"
            },
            "src": "1054:61:77",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 14987,
              "nodeType": "Block",
              "src": "1156:101:77",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 14980,
                            "name": "DEFAULT_ADMIN_ROLE",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18344,
                            "src": "1182:18:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          {
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 14981,
                              "name": "_msgSender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5295,
                              "src": "1202:10:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                                "typeString": "function () view returns (address)"
                              }
                            },
                            "id": 14982,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1202:12:77",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 14979,
                          "name": "hasRole",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18381,
                          "src": "1174:7:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_address_$returns$_t_bool_$",
                            "typeString": "function (bytes32,address) view returns (bool)"
                          }
                        },
                        "id": 14983,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1174:41:77",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "73656e64657220646f65736e277420686176652061646d696e20726f6c65",
                        "id": 14984,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1217:32:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_cccb3b305edc7308d7027b1001041a46b235f7d3213d690bb469676069d9b205",
                          "typeString": "literal_string \"sender doesn't have admin role\""
                        },
                        "value": "sender doesn't have admin role"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_cccb3b305edc7308d7027b1001041a46b235f7d3213d690bb469676069d9b205",
                          "typeString": "literal_string \"sender doesn't have admin role\""
                        }
                      ],
                      "id": 14978,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "1166:7:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 14985,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1166:84:77",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 14986,
                  "nodeType": "ExpressionStatement",
                  "src": "1166:84:77"
                }
              ]
            },
            "id": 14988,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_onlyAdmin",
            "nameLocation": "1130:10:77",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 14976,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1140:2:77"
            },
            "returnParameters": {
              "id": 14977,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1156:0:77"
            },
            "scope": 15170,
            "src": "1121:136:77",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          },
          {
            "baseFunctions": [
              18264
            ],
            "body": {
              "id": 14997,
              "nodeType": "Block",
              "src": "1403:32:77",
              "statements": [
                {
                  "expression": {
                    "hexValue": "726f75746572",
                    "id": 14995,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "1420:8:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_5f6d4e9bb70c9d2aa50e18560b4cdd1b23b30d62b60873d5f23b103e5d7d0185",
                      "typeString": "literal_string \"router\""
                    },
                    "value": "router"
                  },
                  "functionReturnParameters": 14994,
                  "id": 14996,
                  "nodeType": "Return",
                  "src": "1413:15:77"
                }
              ]
            },
            "documentation": {
              "id": 14989,
              "nodeType": "StructuredDocumentation",
              "src": "1263:64:77",
              "text": "@notice Getter function for fee handler type"
            },
            "functionSelector": "542774b5",
            "id": 14998,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "feeHandlerType",
            "nameLocation": "1341:14:77",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 14991,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "1365:8:77"
            },
            "parameters": {
              "id": 14990,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1355:2:77"
            },
            "returnParameters": {
              "id": 14994,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 14993,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 14998,
                  "src": "1388:13:77",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 14992,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1388:6:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1387:15:77"
            },
            "scope": 15170,
            "src": "1332:103:77",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 15014,
              "nodeType": "Block",
              "src": "1569:99:77",
              "statements": [
                {
                  "expression": {
                    "id": 15006,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 15004,
                      "name": "_bridgeAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 14928,
                      "src": "1579:14:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 15005,
                      "name": "bridgeAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 15001,
                      "src": "1596:13:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1579:30:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 15007,
                  "nodeType": "ExpressionStatement",
                  "src": "1579:30:77"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 15009,
                        "name": "DEFAULT_ADMIN_ROLE",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18344,
                        "src": "1630:18:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "expression": {
                          "id": 15010,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4294967281,
                          "src": "1650:3:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 15011,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "1650:10:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 15008,
                      "name": "_setupRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18547,
                      "src": "1619:10:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 15012,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1619:42:77",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 15013,
                  "nodeType": "ExpressionStatement",
                  "src": "1619:42:77"
                }
              ]
            },
            "documentation": {
              "id": 14999,
              "nodeType": "StructuredDocumentation",
              "src": "1441:88:77",
              "text": "@param bridgeAddress Contract address of previously deployed Bridge."
            },
            "id": 15015,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 15002,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15001,
                  "mutability": "mutable",
                  "name": "bridgeAddress",
                  "nameLocation": "1554:13:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15015,
                  "src": "1546:21:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 15000,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1546:7:77",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1545:23:77"
            },
            "returnParameters": {
              "id": 15003,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1569:0:77"
            },
            "scope": 15170,
            "src": "1534:134:77",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 15036,
              "nodeType": "Block",
              "src": "2229:103:77",
              "statements": [
                {
                  "expression": {
                    "id": 15034,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "baseExpression": {
                          "id": 15028,
                          "name": "_domainResourceIDToFeeHandlerAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 14935,
                          "src": "2239:36:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_bytes32_$_t_contract$_IFeeHandler_$18265_$_$",
                            "typeString": "mapping(uint8 => mapping(bytes32 => contract IFeeHandler))"
                          }
                        },
                        "id": 15031,
                        "indexExpression": {
                          "id": 15029,
                          "name": "destinationDomainID",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 15018,
                          "src": "2276:19:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "2239:57:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_bytes32_$_t_contract$_IFeeHandler_$18265_$",
                          "typeString": "mapping(bytes32 => contract IFeeHandler)"
                        }
                      },
                      "id": 15032,
                      "indexExpression": {
                        "id": 15030,
                        "name": "resourceID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15020,
                        "src": "2297:10:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "2239:69:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                        "typeString": "contract IFeeHandler"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 15033,
                      "name": "handlerAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 15023,
                      "src": "2311:14:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                        "typeString": "contract IFeeHandler"
                      }
                    },
                    "src": "2239:86:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                      "typeString": "contract IFeeHandler"
                    }
                  },
                  "id": 15035,
                  "nodeType": "ExpressionStatement",
                  "src": "2239:86:77"
                }
              ]
            },
            "documentation": {
              "id": 15016,
              "nodeType": "StructuredDocumentation",
              "src": "1673:424:77",
              "text": "@notice Maps the {handlerAddress} to {resourceID} to {destinationDomainID} in {_domainResourceIDToFeeHandlerAddress}.\n@param destinationDomainID ID of chain FeeHandler contracts will be called.\n@param resourceID ResourceID for which the corresponding FeeHandler will collect/calcualte fee.\n@param handlerAddress Address of FeeHandler which will be called for specified resourceID."
            },
            "functionSelector": "1af5fe38",
            "id": 15037,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 15026,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 15025,
                  "name": "onlyAdmin",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 14975,
                  "src": "2219:9:77"
                },
                "nodeType": "ModifierInvocation",
                "src": "2219:9:77"
              }
            ],
            "name": "adminSetResourceHandler",
            "nameLocation": "2111:23:77",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 15024,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15018,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "2141:19:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15037,
                  "src": "2135:25:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 15017,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "2135:5:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15020,
                  "mutability": "mutable",
                  "name": "resourceID",
                  "nameLocation": "2170:10:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15037,
                  "src": "2162:18:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 15019,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2162:7:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15023,
                  "mutability": "mutable",
                  "name": "handlerAddress",
                  "nameLocation": "2194:14:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15037,
                  "src": "2182:26:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                    "typeString": "contract IFeeHandler"
                  },
                  "typeName": {
                    "id": 15022,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 15021,
                      "name": "IFeeHandler",
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 18265,
                      "src": "2182:11:77"
                    },
                    "referencedDeclaration": 18265,
                    "src": "2182:11:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                      "typeString": "contract IFeeHandler"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2134:75:77"
            },
            "returnParameters": {
              "id": 15027,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2229:0:77"
            },
            "scope": 15170,
            "src": "2102:230:77",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 15058,
              "nodeType": "Block",
              "src": "2648:126:77",
              "statements": [
                {
                  "expression": {
                    "id": 15051,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 15047,
                        "name": "_whitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 14939,
                        "src": "2658:10:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 15049,
                      "indexExpression": {
                        "id": 15048,
                        "name": "whitelistAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15040,
                        "src": "2669:16:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "2658:28:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 15050,
                      "name": "isWhitelisted",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 15042,
                      "src": "2689:13:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "2658:44:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 15052,
                  "nodeType": "ExpressionStatement",
                  "src": "2658:44:77"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 15054,
                        "name": "whitelistAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15040,
                        "src": "2735:16:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 15055,
                        "name": "isWhitelisted",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15042,
                        "src": "2753:13:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 15053,
                      "name": "WhitelistChanged",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 14945,
                      "src": "2718:16:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_bool_$returns$__$",
                        "typeString": "function (address,bool)"
                      }
                    },
                    "id": 15056,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2718:49:77",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 15057,
                  "nodeType": "EmitStatement",
                  "src": "2713:54:77"
                }
              ]
            },
            "documentation": {
              "id": 15038,
              "nodeType": "StructuredDocumentation",
              "src": "2338:213:77",
              "text": "@notice Sets or revokes fee whitelist from an address.\n@param whitelistAddress Address to be whitelisted.\n@param isWhitelisted Set to true to exempt an address from paying fees."
            },
            "functionSelector": "f1382b26",
            "id": 15059,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 15045,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 15044,
                  "name": "onlyAdmin",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 14975,
                  "src": "2638:9:77"
                },
                "nodeType": "ModifierInvocation",
                "src": "2638:9:77"
              }
            ],
            "name": "adminSetWhitelist",
            "nameLocation": "2565:17:77",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 15043,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15040,
                  "mutability": "mutable",
                  "name": "whitelistAddress",
                  "nameLocation": "2591:16:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15059,
                  "src": "2583:24:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 15039,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2583:7:77",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15042,
                  "mutability": "mutable",
                  "name": "isWhitelisted",
                  "nameLocation": "2614:13:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15059,
                  "src": "2609:18:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 15041,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2609:4:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2582:46:77"
            },
            "returnParameters": {
              "id": 15046,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2648:0:77"
            },
            "scope": 15170,
            "src": "2556:218:77",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              18238
            ],
            "body": {
              "id": 15116,
              "nodeType": "Block",
              "src": "3482:374:77",
              "statements": [
                {
                  "condition": {
                    "baseExpression": {
                      "id": 15077,
                      "name": "_whitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 14939,
                      "src": "3496:10:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                        "typeString": "mapping(address => bool)"
                      }
                    },
                    "id": 15079,
                    "indexExpression": {
                      "id": 15078,
                      "name": "sender",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 15062,
                      "src": "3507:6:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "3496:18:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 15092,
                  "nodeType": "IfStatement",
                  "src": "3492:127:77",
                  "trueBody": {
                    "id": 15091,
                    "nodeType": "Block",
                    "src": "3516:103:77",
                    "statements": [
                      {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 15083,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 15080,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4294967281,
                              "src": "3534:3:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 15081,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "value",
                            "nodeType": "MemberAccess",
                            "src": "3534:9:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "hexValue": "30",
                            "id": 15082,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "3547:1:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "3534:14:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 15089,
                        "nodeType": "IfStatement",
                        "src": "3530:58:77",
                        "trueBody": {
                          "errorCall": {
                            "arguments": [
                              {
                                "expression": {
                                  "id": 15085,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4294967281,
                                  "src": "3578:3:77",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 15086,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "value",
                                "nodeType": "MemberAccess",
                                "src": "3578:9:77",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 15084,
                              "name": "IncorrectFeeSupplied",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14949,
                              "src": "3557:20:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_error_pure$_t_uint256_$returns$__$",
                                "typeString": "function (uint256) pure"
                              }
                            },
                            "id": 15087,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3557:31:77",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$__$",
                              "typeString": "tuple()"
                            }
                          },
                          "id": 15088,
                          "nodeType": "RevertStatement",
                          "src": "3550:38:77"
                        }
                      },
                      {
                        "functionReturnParameters": 15076,
                        "id": 15090,
                        "nodeType": "Return",
                        "src": "3602:7:77"
                      }
                    ]
                  }
                },
                {
                  "assignments": [
                    15095
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 15095,
                      "mutability": "mutable",
                      "name": "feeHandler",
                      "nameLocation": "3641:10:77",
                      "nodeType": "VariableDeclaration",
                      "scope": 15116,
                      "src": "3629:22:77",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                        "typeString": "contract IFeeHandler"
                      },
                      "typeName": {
                        "id": 15094,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 15093,
                          "name": "IFeeHandler",
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 18265,
                          "src": "3629:11:77"
                        },
                        "referencedDeclaration": 18265,
                        "src": "3629:11:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                          "typeString": "contract IFeeHandler"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 15101,
                  "initialValue": {
                    "baseExpression": {
                      "baseExpression": {
                        "id": 15096,
                        "name": "_domainResourceIDToFeeHandlerAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 14935,
                        "src": "3654:36:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_bytes32_$_t_contract$_IFeeHandler_$18265_$_$",
                          "typeString": "mapping(uint8 => mapping(bytes32 => contract IFeeHandler))"
                        }
                      },
                      "id": 15098,
                      "indexExpression": {
                        "id": 15097,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15066,
                        "src": "3691:19:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "3654:57:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_bytes32_$_t_contract$_IFeeHandler_$18265_$",
                        "typeString": "mapping(bytes32 => contract IFeeHandler)"
                      }
                    },
                    "id": 15100,
                    "indexExpression": {
                      "id": 15099,
                      "name": "resourceID",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 15068,
                      "src": "3712:10:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "3654:69:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                      "typeString": "contract IFeeHandler"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3629:94:77"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 15108,
                        "name": "sender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15062,
                        "src": "3773:6:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 15109,
                        "name": "fromDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15064,
                        "src": "3781:12:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 15110,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15066,
                        "src": "3795:19:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 15111,
                        "name": "resourceID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15068,
                        "src": "3816:10:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 15112,
                        "name": "depositData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15070,
                        "src": "3828:11:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      },
                      {
                        "id": 15113,
                        "name": "feeData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15072,
                        "src": "3841:7:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        },
                        {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          },
                          {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          },
                          {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          },
                          {
                            "typeIdentifier": "t_bytes_calldata_ptr",
                            "typeString": "bytes calldata"
                          },
                          {
                            "typeIdentifier": "t_bytes_calldata_ptr",
                            "typeString": "bytes calldata"
                          }
                        ],
                        "expression": {
                          "id": 15102,
                          "name": "feeHandler",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 15095,
                          "src": "3733:10:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                            "typeString": "contract IFeeHandler"
                          }
                        },
                        "id": 15104,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "collectFee",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 18238,
                        "src": "3733:21:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_payable$_t_address_$_t_uint8_$_t_uint8_$_t_bytes32_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$returns$__$",
                          "typeString": "function (address,uint8,uint8,bytes32,bytes memory,bytes memory) payable external"
                        }
                      },
                      "id": 15107,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "names": [
                        "value"
                      ],
                      "nodeType": "FunctionCallOptions",
                      "options": [
                        {
                          "expression": {
                            "id": 15105,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4294967281,
                            "src": "3762:3:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 15106,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "value",
                          "nodeType": "MemberAccess",
                          "src": "3762:9:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "src": "3733:39:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_payable$_t_address_$_t_uint8_$_t_uint8_$_t_bytes32_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$returns$__$value",
                        "typeString": "function (address,uint8,uint8,bytes32,bytes memory,bytes memory) payable external"
                      }
                    },
                    "id": 15114,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3733:116:77",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 15115,
                  "nodeType": "ExpressionStatement",
                  "src": "3733:116:77"
                }
              ]
            },
            "documentation": {
              "id": 15060,
              "nodeType": "StructuredDocumentation",
              "src": "2781:513:77",
              "text": "@notice Initiates collecting fee with corresponding fee handler contract using IFeeHandler interface.\n@param sender Sender of the deposit.\n@param fromDomainID ID of the source chain.\n@param destinationDomainID ID of chain deposit will be bridged to.\n@param resourceID ResourceID to be used when making deposits.\n@param depositData Additional data to be passed to specified handler.\n@param feeData Additional data to be passed to the fee handler."
            },
            "functionSelector": "25307065",
            "id": 15117,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 15075,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 15074,
                  "name": "onlyBridge",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 14956,
                  "src": "3471:10:77"
                },
                "nodeType": "ModifierInvocation",
                "src": "3471:10:77"
              }
            ],
            "name": "collectFee",
            "nameLocation": "3308:10:77",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 15073,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15062,
                  "mutability": "mutable",
                  "name": "sender",
                  "nameLocation": "3327:6:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15117,
                  "src": "3319:14:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 15061,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3319:7:77",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15064,
                  "mutability": "mutable",
                  "name": "fromDomainID",
                  "nameLocation": "3341:12:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15117,
                  "src": "3335:18:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 15063,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "3335:5:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15066,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "3361:19:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15117,
                  "src": "3355:25:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 15065,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "3355:5:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15068,
                  "mutability": "mutable",
                  "name": "resourceID",
                  "nameLocation": "3390:10:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15117,
                  "src": "3382:18:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 15067,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3382:7:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15070,
                  "mutability": "mutable",
                  "name": "depositData",
                  "nameLocation": "3417:11:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15117,
                  "src": "3402:26:77",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 15069,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "3402:5:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15072,
                  "mutability": "mutable",
                  "name": "feeData",
                  "nameLocation": "3445:7:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15117,
                  "src": "3430:22:77",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 15071,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "3430:5:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3318:135:77"
            },
            "returnParameters": {
              "id": 15076,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3482:0:77"
            },
            "scope": 15170,
            "src": "3299:557:77",
            "stateMutability": "payable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              18258
            ],
            "body": {
              "id": 15168,
              "nodeType": "Block",
              "src": "4721:309:77",
              "statements": [
                {
                  "condition": {
                    "baseExpression": {
                      "id": 15137,
                      "name": "_whitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 14939,
                      "src": "4735:10:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                        "typeString": "mapping(address => bool)"
                      }
                    },
                    "id": 15139,
                    "indexExpression": {
                      "id": 15138,
                      "name": "sender",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 15120,
                      "src": "4746:6:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "4735:18:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 15148,
                  "nodeType": "IfStatement",
                  "src": "4731:71:77",
                  "trueBody": {
                    "id": 15147,
                    "nodeType": "Block",
                    "src": "4755:47:77",
                    "statements": [
                      {
                        "expression": {
                          "components": [
                            {
                              "hexValue": "30",
                              "id": 15140,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4777:1:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            {
                              "arguments": [
                                {
                                  "hexValue": "30",
                                  "id": 15143,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "4788:1:77",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 15142,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "4780:7:77",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 15141,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "4780:7:77",
                                  "typeDescriptions": {}
                                }
                              },
                              "id": 15144,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4780:10:77",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "id": 15145,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "4776:15:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_rational_0_by_1_$_t_address_$",
                            "typeString": "tuple(int_const 0,address)"
                          }
                        },
                        "functionReturnParameters": 15136,
                        "id": 15146,
                        "nodeType": "Return",
                        "src": "4769:22:77"
                      }
                    ]
                  }
                },
                {
                  "assignments": [
                    15151
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 15151,
                      "mutability": "mutable",
                      "name": "feeHandler",
                      "nameLocation": "4824:10:77",
                      "nodeType": "VariableDeclaration",
                      "scope": 15168,
                      "src": "4812:22:77",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                        "typeString": "contract IFeeHandler"
                      },
                      "typeName": {
                        "id": 15150,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 15149,
                          "name": "IFeeHandler",
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 18265,
                          "src": "4812:11:77"
                        },
                        "referencedDeclaration": 18265,
                        "src": "4812:11:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                          "typeString": "contract IFeeHandler"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 15157,
                  "initialValue": {
                    "baseExpression": {
                      "baseExpression": {
                        "id": 15152,
                        "name": "_domainResourceIDToFeeHandlerAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 14935,
                        "src": "4837:36:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_bytes32_$_t_contract$_IFeeHandler_$18265_$_$",
                          "typeString": "mapping(uint8 => mapping(bytes32 => contract IFeeHandler))"
                        }
                      },
                      "id": 15154,
                      "indexExpression": {
                        "id": 15153,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15124,
                        "src": "4874:19:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "4837:57:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_bytes32_$_t_contract$_IFeeHandler_$18265_$",
                        "typeString": "mapping(bytes32 => contract IFeeHandler)"
                      }
                    },
                    "id": 15156,
                    "indexExpression": {
                      "id": 15155,
                      "name": "resourceID",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 15126,
                      "src": "4895:10:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "4837:69:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                      "typeString": "contract IFeeHandler"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4812:94:77"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 15160,
                        "name": "sender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15120,
                        "src": "4947:6:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 15161,
                        "name": "fromDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15122,
                        "src": "4955:12:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 15162,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15124,
                        "src": "4969:19:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 15163,
                        "name": "resourceID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15126,
                        "src": "4990:10:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 15164,
                        "name": "depositData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15128,
                        "src": "5002:11:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      },
                      {
                        "id": 15165,
                        "name": "feeData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15130,
                        "src": "5015:7:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        },
                        {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      ],
                      "expression": {
                        "id": 15158,
                        "name": "feeHandler",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15151,
                        "src": "4923:10:77",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IFeeHandler_$18265",
                          "typeString": "contract IFeeHandler"
                        }
                      },
                      "id": 15159,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "calculateFee",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 18258,
                      "src": "4923:23:77",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_address_$_t_uint8_$_t_uint8_$_t_bytes32_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$returns$_t_uint256_$_t_address_$",
                        "typeString": "function (address,uint8,uint8,bytes32,bytes memory,bytes memory) view external returns (uint256,address)"
                      }
                    },
                    "id": 15166,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4923:100:77",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_uint256_$_t_address_$",
                      "typeString": "tuple(uint256,address)"
                    }
                  },
                  "functionReturnParameters": 15136,
                  "id": 15167,
                  "nodeType": "Return",
                  "src": "4916:107:77"
                }
              ]
            },
            "documentation": {
              "id": 15118,
              "nodeType": "StructuredDocumentation",
              "src": "3862:640:77",
              "text": "@notice Initiates calculating fee with corresponding fee handler contract using IFeeHandler interface.\n@param sender Sender of the deposit.\n@param fromDomainID ID of the source chain.\n@param destinationDomainID ID of chain deposit will be bridged to.\n@param resourceID ResourceID to be used when making deposits.\n@param depositData Additional data to be passed to specified handler.\n@param feeData Additional data to be passed to the fee handler.\n@return fee Returns the fee amount.\n@return tokenAddress Returns the address of the token to be used for fee."
            },
            "functionSelector": "ef4f081f",
            "id": 15169,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "calculateFee",
            "nameLocation": "4516:12:77",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 15131,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15120,
                  "mutability": "mutable",
                  "name": "sender",
                  "nameLocation": "4537:6:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15169,
                  "src": "4529:14:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 15119,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4529:7:77",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15122,
                  "mutability": "mutable",
                  "name": "fromDomainID",
                  "nameLocation": "4551:12:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15169,
                  "src": "4545:18:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 15121,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "4545:5:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15124,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "4571:19:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15169,
                  "src": "4565:25:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 15123,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "4565:5:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15126,
                  "mutability": "mutable",
                  "name": "resourceID",
                  "nameLocation": "4600:10:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15169,
                  "src": "4592:18:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 15125,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4592:7:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15128,
                  "mutability": "mutable",
                  "name": "depositData",
                  "nameLocation": "4627:11:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15169,
                  "src": "4612:26:77",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 15127,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "4612:5:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15130,
                  "mutability": "mutable",
                  "name": "feeData",
                  "nameLocation": "4655:7:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15169,
                  "src": "4640:22:77",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 15129,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "4640:5:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4528:135:77"
            },
            "returnParameters": {
              "id": 15136,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 15133,
                  "mutability": "mutable",
                  "name": "fee",
                  "nameLocation": "4694:3:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15169,
                  "src": "4686:11:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 15132,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4686:7:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15135,
                  "mutability": "mutable",
                  "name": "tokenAddress",
                  "nameLocation": "4707:12:77",
                  "nodeType": "VariableDeclaration",
                  "scope": 15169,
                  "src": "4699:20:77",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 15134,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4699:7:77",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4685:35:77"
            },
            "scope": 15170,
            "src": "4507:523:77",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 15171,
        "src": "351:4681:77",
        "usedErrors": [
          14949
        ]
      }
    ],
    "src": "81:4952:77"
  },
  "compiler": {
    "name": "solc",
    "version": "0.8.11+commit.d7f03943.Emscripten.clang"
  },
  "networks": {
    "1727170272871": {
      "events": {},
      "links": {},
      "address": "0x1CcB4231f2ff299E1E049De76F0a1D2B415C563A",
      "transactionHash": "0x118755b4a468a9d766c5c3b8c18e11472bd4d03fe182ce2c5d84344a088abd09"
    },
    "1727170313921": {
      "events": {},
      "links": {},
      "address": "0x1CcB4231f2ff299E1E049De76F0a1D2B415C563A",
      "transactionHash": "0x47f81771599c887358c8ed6f6100f8108923ec82036742845f8fb4cfef35be75"
    }
  },
  "schemaVersion": "3.4.6",
  "updatedAt": "2024-09-24T09:32:14.798Z",
  "networkType": "ethereum",
  "devdoc": {
    "author": "ChainSafe Systems.",
    "kind": "dev",
    "methods": {
      "adminSetResourceHandler(uint8,bytes32,address)": {
        "params": {
          "destinationDomainID": "ID of chain FeeHandler contracts will be called.",
          "handlerAddress": "Address of FeeHandler which will be called for specified resourceID.",
          "resourceID": "ResourceID for which the corresponding FeeHandler will collect/calcualte fee."
        }
      },
      "adminSetWhitelist(address,bool)": {
        "params": {
          "isWhitelisted": "Set to true to exempt an address from paying fees.",
          "whitelistAddress": "Address to be whitelisted."
        }
      },
      "calculateFee(address,uint8,uint8,bytes32,bytes,bytes)": {
        "params": {
          "depositData": "Additional data to be passed to specified handler.",
          "destinationDomainID": "ID of chain deposit will be bridged to.",
          "feeData": "Additional data to be passed to the fee handler.",
          "fromDomainID": "ID of the source chain.",
          "resourceID": "ResourceID to be used when making deposits.",
          "sender": "Sender of the deposit."
        },
        "returns": {
          "fee": "Returns the fee amount.",
          "tokenAddress": "Returns the address of the token to be used for fee."
        }
      },
      "collectFee(address,uint8,uint8,bytes32,bytes,bytes)": {
        "params": {
          "depositData": "Additional data to be passed to specified handler.",
          "destinationDomainID": "ID of chain deposit will be bridged to.",
          "feeData": "Additional data to be passed to the fee handler.",
          "fromDomainID": "ID of the source chain.",
          "resourceID": "ResourceID to be used when making deposits.",
          "sender": "Sender of the deposit."
        }
      },
      "constructor": {
        "params": {
          "bridgeAddress": "Contract address of previously deployed Bridge."
        }
      },
      "getRoleAdmin(bytes32)": {
        "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."
      },
      "getRoleMember(bytes32,uint256)": {
        "details": "Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information."
      },
      "getRoleMemberCount(bytes32)": {
        "details": "Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role."
      },
      "getRoleMemberIndex(bytes32,address)": {
        "details": "Returns the index of the account that have `role`."
      },
      "grantRole(bytes32,address)": {
        "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role."
      },
      "hasRole(bytes32,address)": {
        "details": "Returns `true` if `account` has been granted `role`."
      },
      "renounceRole(bytes32,address)": {
        "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`."
      },
      "revokeRole(bytes32,address)": {
        "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role."
      }
    },
    "title": "Handles FeeHandler routing for resources.",
    "version": 1
  },
  "userdoc": {
    "events": {
      "FeeCollected(address,uint8,uint8,bytes32,uint256,address)": {
        "notice": "This event is emitted when the fee is collected."
      },
      "FeeDistributed(address,address,uint256)": {
        "notice": "This event is emitted when the fee is distributed to an address."
      }
    },
    "kind": "user",
    "methods": {
      "adminSetResourceHandler(uint8,bytes32,address)": {
        "notice": "Maps the {handlerAddress} to {resourceID} to {destinationDomainID} in {_domainResourceIDToFeeHandlerAddress}."
      },
      "adminSetWhitelist(address,bool)": {
        "notice": "Sets or revokes fee whitelist from an address."
      },
      "calculateFee(address,uint8,uint8,bytes32,bytes,bytes)": {
        "notice": "Initiates calculating fee with corresponding fee handler contract using IFeeHandler interface."
      },
      "collectFee(address,uint8,uint8,bytes32,bytes,bytes)": {
        "notice": "Initiates collecting fee with corresponding fee handler contract using IFeeHandler interface."
      },
      "feeHandlerType()": {
        "notice": "Getter function for fee handler type"
      }
    },
    "notice": "This contract is intended to be used with the Bridge contract.",
    "version": 1
  }
}