{
  "contractName": "TwapFeeHandler",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "IncorrectFeeSupplied",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "IncorrectPrice",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ZeroAddress",
      "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": false,
          "internalType": "contract TwapOracle",
          "name": "feeOracleAddress",
          "type": "address"
        }
      ],
      "name": "FeeOracleAddressSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "gasUsed",
          "type": "uint32"
        }
      ],
      "name": "FeePropertySet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "destinationDomainID",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "gasPrice",
          "type": "uint256"
        }
      ],
      "name": "GasPriceSet",
      "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": "uint8",
          "name": "destinationDomainID",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "wrapTokenAddress",
          "type": "address"
        }
      ],
      "name": "WrapTokenAddressSet",
      "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": [],
      "name": "_feeHandlerRouterAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "_gasUsed",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "name": "destinationFee",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "gasPrice",
          "type": "uint256"
        },
        {
          "internalType": "enum TwapFeeHandler.ProtocolFeeType",
          "name": "feeType",
          "type": "uint8"
        },
        {
          "internalType": "uint248",
          "name": "amount",
          "type": "uint248"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "name": "destinationNativeCoinWrap",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "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": [],
      "name": "protocolFeeType",
      "outputs": [
        {
          "internalType": "enum TwapFeeHandler.ProtocolFeeType",
          "name": "",
          "type": "uint8"
        }
      ],
      "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"
    },
    {
      "inputs": [],
      "name": "twapOracle",
      "outputs": [
        {
          "internalType": "contract TwapOracle",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "feeHandlerType",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newAdmin",
          "type": "address"
        }
      ],
      "name": "renounceAdmin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract TwapOracle",
          "name": "oracleAddress",
          "type": "address"
        }
      ],
      "name": "setFeeOracle",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "destinationDomainID",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "gasPrice",
          "type": "uint256"
        },
        {
          "internalType": "enum TwapFeeHandler.ProtocolFeeType",
          "name": "feeType",
          "type": "uint8"
        },
        {
          "internalType": "uint248",
          "name": "amount",
          "type": "uint248"
        }
      ],
      "name": "setGasPrice",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "destinationDomainID",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "wrapToken",
          "type": "address"
        }
      ],
      "name": "setWrapTokenAddress",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "gasUsed",
          "type": "uint32"
        }
      ],
      "name": "setFeeProperties",
      "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"
    },
    {
      "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 payable[]",
          "name": "addrs",
          "type": "address[]"
        },
        {
          "internalType": "uint256[]",
          "name": "amounts",
          "type": "uint256[]"
        }
      ],
      "name": "transferFee",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.8.11+commit.d7f03943\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"IncorrectFeeSupplied\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectPrice\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"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\":false,\"internalType\":\"contract TwapOracle\",\"name\":\"feeOracleAddress\",\"type\":\"address\"}],\"name\":\"FeeOracleAddressSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"gasUsed\",\"type\":\"uint32\"}],\"name\":\"FeePropertySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"destinationDomainID\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"}],\"name\":\"GasPriceSet\",\"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\":\"uint8\",\"name\":\"destinationDomainID\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"wrapTokenAddress\",\"type\":\"address\"}],\"name\":\"WrapTokenAddressSet\",\"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\":[],\"name\":\"_feeHandlerRouterAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"_gasUsed\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"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\":\"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\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"name\":\"destinationFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"enum TwapFeeHandler.ProtocolFeeType\",\"name\":\"feeType\",\"type\":\"uint8\"},{\"internalType\":\"uint248\",\"name\":\"amount\",\"type\":\"uint248\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"name\":\"destinationNativeCoinWrap\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"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\":[],\"name\":\"protocolFeeType\",\"outputs\":[{\"internalType\":\"enum TwapFeeHandler.ProtocolFeeType\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"renounceAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\"},{\"inputs\":[{\"internalType\":\"contract TwapOracle\",\"name\":\"oracleAddress\",\"type\":\"address\"}],\"name\":\"setFeeOracle\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"gasUsed\",\"type\":\"uint32\"}],\"name\":\"setFeeProperties\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"destinationDomainID\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"enum TwapFeeHandler.ProtocolFeeType\",\"name\":\"feeType\",\"type\":\"uint8\"},{\"internalType\":\"uint248\",\"name\":\"amount\",\"type\":\"uint248\"}],\"name\":\"setGasPrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"destinationDomainID\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"wrapToken\",\"type\":\"address\"}],\"name\":\"setWrapTokenAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"addrs\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"transferFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"twapOracle\",\"outputs\":[{\"internalType\":\"contract TwapOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"ChainSafe Systems.\",\"kind\":\"dev\",\"methods\":{\"calculateFee(address,uint8,uint8,bytes32,bytes,bytes)\":{\"params\":{\"depositData\":\"Additional data about the deposit.\",\"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 about the deposit.\",\"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.\",\"feeHandlerRouterAddress\":\"Contract address of previously deployed FeeHandlerRouter.\"}},\"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`.\"},\"renounceAdmin(address)\":{\"params\":{\"newAdmin\":\"Address that admin role will be granted to.\"}},\"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.\"},\"setFeeOracle(address)\":{\"params\":{\"oracleAddress\":\"Fee oracle address.\"}},\"setFeeProperties(uint32)\":{\"params\":{\"gasUsed\":\"Default gas used for proposal execution in the destination.\"}},\"setGasPrice(uint8,uint256,uint8,uint248)\":{\"params\":{\"amount\":\"Fee amount that should be additional charged on top of execution cost (fixed native token amount/percentage of execution cost).\",\"destinationDomainID\":\"ID of destination chain.\",\"feeType\":\"Type of fee that can be set (fixed/percentage). \\\"0\\\" => execution cost \\\"1\\\" => execution cost + protocol fee (fixed fee) \\\"2\\\" => execution cost + protocol fee (percentage fee)\",\"gasPrice\":\"Gas price of destination chain.\"}},\"setWrapTokenAddress(uint8,address)\":{\"params\":{\"destinationDomainID\":\"ID of destination chain.\",\"wrapToken\":\"Wrap token address of destination chain.\"}},\"transferFee(address[],uint256[])\":{\"params\":{\"addrs\":\"Array of addresses to transfer {amounts} to.\",\"amounts\":\"Array of amounts to transfer to {addrs}.\"}}},\"title\":\"Handles deposit fees based on Effective rates provided by Fee oracle.\",\"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\":{\"calculateFee(address,uint8,uint8,bytes32,bytes,bytes)\":{\"notice\":\"Calculates fee for deposit.\"},\"collectFee(address,uint8,uint8,bytes32,bytes,bytes)\":{\"notice\":\"Collects fee for deposit.\"},\"feeHandlerType()\":{\"notice\":\"Getter function for fee handler type\"},\"renounceAdmin(address)\":{\"notice\":\"Removes admin role from {_msgSender()} and grants it to {newAdmin}.Only callable by an address that currently has the admin role.\"},\"setFeeOracle(address)\":{\"notice\":\"Sets the fee oracle address for signature verification.\"},\"setFeeProperties(uint32)\":{\"notice\":\"Sets the fee properties.\"},\"setGasPrice(uint8,uint256,uint8,uint248)\":{\"notice\":\"Sets the gas price for destination chain.\"},\"setWrapTokenAddress(uint8,address)\":{\"notice\":\"Sets the wrap token address for destination chain.\"},\"transferFee(address[],uint256[])\":{\"notice\":\"Transfers eth in the contract to the specified addresses. The parameters addrs and amounts are mapped 1-1. This means that the address at index 0 for addrs will receive the amount (in WEI) from amounts at index 0.\"}},\"notice\":\"This contract is intended to be used with the Bridge contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"project:/contracts/handlers/fee/dynamic/TwapFeeHandler.sol\":\"TwapFeeHandler\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xbbc8ac883ac3c0078ce5ad3e288fbb3ffcc8a30c3a98c0fda0114d64fc44fca2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://87a7a5d2f6f63f84598af02b8c50ca2df2631cb8ba2453e8d95fcb17e4be9824\",\"dweb:/ipfs/QmR76hqtAcRqoFj33tmNjcWTLrgNsAaakYwnKZ8zoJtKei\"]},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"@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/Strings.sol\":{\"keccak256\":\"0x32c202bd28995dd20c4347b7c6467a6d3241c74c8ad3edcbb610cd9205916c45\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8179c356adb19e70d6b31a1eedc8c5c7f0c00e669e2540f4099e3844c6074d30\",\"dweb:/ipfs/QmWFbivarEobbqhS1go64ootVuHfVohBseerYy9FTEd1W2\"]},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x3c07f43e60e099b3b157243b3152722e73b80eeb7985c2cd73712828d7f7da29\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://466ffb5a6e3bd65fffd996f9287ffd240ea21588a338c6efe143d94eaed014a7\",\"dweb:/ipfs/Qmans3vvPJZcvxe9KLAPc9Xwe4TFVTJdzaQGpi62Vrhoe2\"]},\"@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"keccak256\":\"0x9772845c886f87a3aab315f8d6b68aa599027c20f441b131cd4afaf65b588900\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad2f29a9c17a4f746416c9e254e17671f43c409dbfa6e4d7d76c3e4a83212d31\",\"dweb:/ipfs/QmTqU65L6iu6yqmXKzcNLPioR8etzKPWycpDJCm17ifVdS\"]},\"@uniswap/v3-core/contracts/interfaces/IUniswapV3Factory.sol\":{\"keccak256\":\"0xcc3d0c93fc9ac0febbe09f941b465b57f750bcf3b48432da0b97dc289cfdc489\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b9379ad954680c44a0bc523b314ae4c4da735f9fe1d02aa56ea5bdba6f1136f2\",\"dweb:/ipfs/QmZXdgQNXKAckrXWz9R3mc47F1fvDvr28a2ewJrwNAw71B\"]},\"@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol\":{\"keccak256\":\"0xfe6113d518466cd6652c85b111e01f33eb62157f49ae5ed7d5a3947a2044adb1\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://1c42b9e6f5902ac38dd43e25750939baa7e0c1425dc75afd717c4412731065d5\",\"dweb:/ipfs/QmWaoacnzsucTvBME2o7YgZBZMhaHv7fkj83htHMVWJKWh\"]},\"@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions.sol\":{\"keccak256\":\"0x9453dd0e7442188667d01d9b65de3f1e14e9511ff3e303179a15f6fc267f7634\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://982f4328f956c3e60e67501e759eb292ac487f76460c774c50e9ae4fcc92aae5\",\"dweb:/ipfs/QmRnzEDsaqtd9PJEVcgQi7p5aV5pMSvRUoGZJAdwFUJxgZ\"]},\"@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState.sol\":{\"keccak256\":\"0xe603ac5b17ecdee73ba2b27efdf386c257a19c14206e87eee77e2017b742d9e5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8febc9bdb399a4d94bb89f5377732652e2400e4a8dee808201ade6848f9004e7\",\"dweb:/ipfs/QmaKDqYYFU4d2W2iN77aDHptfbFmYZRrMYXHeGpJmM8C1c\"]},\"@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents.sol\":{\"keccak256\":\"0x8071514d0fe5d17d6fbd31c191cdfb703031c24e0ece3621d88ab10e871375cd\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://d0b571930cc7488b1d546a7e9cea7c52d8b3c4e207da657ed0e0db7343b8cd03\",\"dweb:/ipfs/QmaGK6vVwB95QSTR1XMYvrh7ivYAYZxi3fD7v6VMA4jZ39\"]},\"@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables.sol\":{\"keccak256\":\"0xf6e5d2cd1139c4c276bdbc8e1d2b256e456c866a91f1b868da265c6d2685c3f7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b99c8c9ae8e27ee6559e5866bea82cbc9ffc8247f8d15b7422a4deb287d4d047\",\"dweb:/ipfs/QmfL8gaqt3ffAnm6nVj5ksuNpLygXuL3xq5VBqrkwC2JJ3\"]},\"@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions.sol\":{\"keccak256\":\"0x759b78a2918af9e99e246dc3af084f654e48ef32bb4e4cb8a966aa3dcaece235\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://64144fb96e1c7fdba87305acadb98a198d26a3d46c097cb3a666e567f6f29735\",\"dweb:/ipfs/QmUnWVwN9FKB9uV5Pr8YfLpWZnYM2DENnRMaadZ492JS9u\"]},\"@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol\":{\"keccak256\":\"0x852dc1f5df7dcf7f11e7bb3eed79f0cea72ad4b25f6a9d2c35aafb48925fd49f\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://ed63907c38ff36b0e22bc9ffc53e791ea74f0d4f0e7c257fdfb5aaf8825b1f0f\",\"dweb:/ipfs/QmSQrckghEjs6HVsA5GVgpNpZWvTXMY5eQLF7cN6deFeEg\"]},\"project:/contracts/handlers/fee/dynamic/TwapFeeHandler.sol\":{\"keccak256\":\"0xcd2a96b72c8956138dfd250da60b46de1bf3c9e359e0bd3a3572281665b70d3f\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://1a9fb852f3d2fd10b7570de927e986cdb860da11cbb1cf401c2ddec8434aa265\",\"dweb:/ipfs/QmWvFpY3D31NvNDSyP6TWgTcGSkNmr1VVbw6xVxiPJEiMS\"]},\"project:/contracts/handlers/fee/dynamic/TwapOracle.sol\":{\"keccak256\":\"0xe16de3bdbdc119b418a45ce607fc5cd8c586243adca59f83920f2b5218c5db3e\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://480664d5c3f8c1f8fc0d5c169269474e3c6fa339cd441c0c1c172e06560f65b4\",\"dweb:/ipfs/QmUeekvVXLcyZcpXwQQA5C7en7Nz5qLY2eF7Vq4avW5Vdd\"]},\"project:/contracts/interfaces/IBridge.sol\":{\"keccak256\":\"0x613f3a2a8156e8de182812fba42380ec873af6b5716405b1d4a9d9b39e31133a\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://b254a578f4524a5a04dee112456286ef86a4b77219a034123ae1d6833c3c0926\",\"dweb:/ipfs/QmPGtxJSXzVNc39qpzzn69Ks9QpaM48sscWbRS6ntZE7S1\"]},\"project:/contracts/interfaces/IERCHandler.sol\":{\"keccak256\":\"0xf360099ea5a64a9ba351b0807e0bf376c432239af1cc314ef2e44b157afe56fd\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://3b05bd76975b1d128c7b1c8ed93cf35c532737b84807605320a41f193c0e00ef\",\"dweb:/ipfs/QmNQLZWyPb2Nd3JmPaDN5rPyvFzcMtuW9xgp8a7hmgPsUo\"]},\"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\"]},\"project:/contracts/utils/FullMath.sol\":{\"keccak256\":\"0x7825565a4bb2a34a1dc96bbfead755785dfb0df8ef81bd934c43023689685645\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8f44f4614d31e3d4864c7eb13620555253b84f6a69180f8745b7c6e246a9d125\",\"dweb:/ipfs/QmfNQUcXj3KL8h9u5PqbtEC6yRtwDbKNb48uMPjdwxsKnd\"]},\"project:/contracts/utils/SanityChecks.sol\":{\"keccak256\":\"0xe0a497950a5f1f9e127a5684c6c562e6fb0fa72dcde056b8c6da933e6bf8afc2\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://47e5918856c922f1408cd15660d451062820121bd1ef3057d1dccad9f9785241\",\"dweb:/ipfs/QmZUEfFPEtiRKnfAUGhN6HoWCyLLUs9XgJbmqEq7pbABHq\"]},\"project:/contracts/utils/TickMath.sol\":{\"keccak256\":\"0x5c57de03a91cc2ec8939865dbbcb0197bb6c353b711075eefd8e0fca5e102129\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://1e994c24fd891ef8a3f5dbf5eba42b34feaf05e0376a29f91322faa18054449c\",\"dweb:/ipfs/QmNdUJGUQxd1dPkMbnA5f5UNqakxRkQE5r7bTZJAuHeapS\"]}},\"version\":1}",
  "bytecode": "0x",
  "deployedBytecode": "0x",
  "immutableReferences": {},
  "generatedSources": [],
  "deployedGeneratedSources": [],
  "sourceMap": "",
  "deployedSourceMap": "",
  "source": "// The Licensed Work is (c) 2022 Sygma\n// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity 0.8.11;\n\nimport \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\n\nimport \"../../../interfaces/IFeeHandler.sol\";\nimport \"../../../interfaces/IERCHandler.sol\";\nimport \"../../../interfaces/IBridge.sol\";\nimport \"../../../utils/SanityChecks.sol\";\nimport \"./TwapOracle.sol\";\n\n/**\n    @title Handles deposit fees based on Effective rates provided by Fee oracle.\n    @author ChainSafe Systems.\n    @notice This contract is intended to be used with the Bridge contract.\n */\nabstract contract TwapFeeHandler is IFeeHandler, AccessControl {\n    using SanityChecks for *;\n\n    address public immutable _bridgeAddress;\n    address public immutable _feeHandlerRouterAddress;\n\n    TwapOracle public twapOracle;\n    ProtocolFeeType public protocolFeeType;\n\n    uint32 public _gasUsed;\n\n    mapping(uint8 => address) public destinationNativeCoinWrap;\n    mapping(uint8 => Fee) public destinationFee;\n\n    enum ProtocolFeeType {\n        None,\n        Fixed,\n        Percentage\n    }\n\n    struct Fee {\n        uint256 gasPrice;\n        ProtocolFeeType feeType;\n        uint248 amount;\n    }\n\n    event FeeOracleAddressSet(TwapOracle feeOracleAddress);\n    event FeePropertySet(uint32 gasUsed);\n    event GasPriceSet(uint8 destinationDomainID, uint256 gasPrice);\n    event WrapTokenAddressSet(uint8 destinationDomainID, address wrapTokenAddress);\n\n    error IncorrectFeeSupplied(uint256);\n    error IncorrectPrice();\n\n    modifier onlyAdmin() {\n        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), \"sender doesn't have admin role\");\n        _;\n    }\n\n    modifier onlyBridgeOrRouter() {\n        _onlyBridgeOrRouter();\n        _;\n    }\n\n    function _onlyBridgeOrRouter() private view {\n        require(\n            msg.sender == _bridgeAddress || msg.sender == _feeHandlerRouterAddress,\n            \"sender must be bridge or fee router contract\"\n        );\n    }\n\n    /**\n        @param bridgeAddress Contract address of previously deployed Bridge.\n        @param feeHandlerRouterAddress Contract address of previously deployed FeeHandlerRouter.\n     */\n    constructor(address bridgeAddress, address feeHandlerRouterAddress) {\n        _bridgeAddress = bridgeAddress;\n        _feeHandlerRouterAddress = feeHandlerRouterAddress;\n        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);\n    }\n\n    /**\n        @notice Getter function for fee handler type\n     */\n    function feeHandlerType() public override pure returns (string memory) {\n        return \"twap\";\n    }\n\n    // Admin functions\n\n    /**\n        @notice Removes admin role from {_msgSender()} and grants it to {newAdmin}.\n        @notice Only callable by an address that currently has the admin role.\n        @param newAdmin Address that admin role will be granted to.\n     */\n    function renounceAdmin(address newAdmin) external {\n        address sender = _msgSender();\n        require(sender != newAdmin, 'Cannot renounce oneself');\n        grantRole(DEFAULT_ADMIN_ROLE, newAdmin);\n        renounceRole(DEFAULT_ADMIN_ROLE, sender);\n    }\n\n    /**\n        @notice Sets the fee oracle address for signature verification.\n        @param oracleAddress Fee oracle address.\n     */\n    function setFeeOracle(TwapOracle oracleAddress) external onlyAdmin {\n        twapOracle = oracleAddress;\n        emit FeeOracleAddressSet(oracleAddress);\n    }\n\n    /**\n        @notice Sets the gas price for destination chain.\n        @param destinationDomainID ID of destination chain.\n        @param gasPrice Gas price of destination chain.\n        @param feeType Type of fee that can be set (fixed/percentage).\n                \"0\" => execution cost\n                \"1\" => execution cost + protocol fee (fixed fee)\n                \"2\" => execution cost + protocol fee (percentage fee)\n        @param amount Fee amount that should be additional charged on top of\n        execution cost (fixed native token amount/percentage of execution cost).\n     */\n    function setGasPrice(uint8 destinationDomainID, uint256 gasPrice, ProtocolFeeType feeType, uint248 amount) external onlyAdmin {\n        destinationFee[destinationDomainID].gasPrice = gasPrice;\n        destinationFee[destinationDomainID].feeType = feeType;\n        destinationFee[destinationDomainID].amount = amount;\n        emit GasPriceSet(destinationDomainID, gasPrice);\n    }\n\n    /**\n        @notice Sets the wrap token address for destination chain.\n        @param destinationDomainID ID of destination chain.\n        @param wrapToken Wrap token address of destination chain.\n     */\n    function setWrapTokenAddress(uint8 destinationDomainID, address wrapToken) external onlyAdmin {\n        destinationNativeCoinWrap[destinationDomainID] = wrapToken;\n        emit WrapTokenAddressSet(destinationDomainID, wrapToken);\n    }\n\n    /**\n        @notice Sets the fee properties.\n        @param gasUsed Default gas used for proposal execution in the destination.\n     */\n    function setFeeProperties(uint32 gasUsed) external onlyAdmin {\n        _setFeeProperties(gasUsed);\n    }\n\n    function _setFeeProperties(uint32 gasUsed) internal {\n        _gasUsed = gasUsed;\n        emit FeePropertySet(gasUsed);\n    }\n\n    /**\n        @notice Collects fee for deposit.\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 about the deposit.\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 onlyBridgeOrRouter {\n        (uint256 fee, ) = _calculateFee(sender, fromDomainID, destinationDomainID, resourceID, depositData, feeData);\n        if (msg.value < fee) revert IncorrectFeeSupplied(msg.value);\n        uint256 remaining = msg.value - fee;\n        if (remaining != 0) {\n            (bool sent, ) = sender.call{value: remaining}(\"\");\n            require(sent, \"Failed to send remaining Ether\");\n        }\n        emit FeeCollected(sender, fromDomainID, destinationDomainID, resourceID, fee, address(0));\n    }\n\n    /**\n        @notice Calculates fee for deposit.\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 about the deposit.\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        return _calculateFee(sender, fromDomainID, destinationDomainID, resourceID, depositData, feeData);\n    }\n\n    function _calculateFee(address sender, uint8 fromDomainID, uint8 destinationDomainID, bytes32 resourceID, bytes calldata depositData, bytes calldata feeData) internal view virtual returns(uint256 fee, address tokenAddress);\n\n    /**\n        @notice Transfers eth in the contract to the specified addresses. The parameters addrs and amounts are mapped 1-1.\n        This means that the address at index 0 for addrs will receive the amount (in WEI) from amounts at index 0.\n        @param addrs Array of addresses to transfer {amounts} to.\n        @param amounts Array of amounts to transfer to {addrs}.\n     */\n    function transferFee(address payable[] calldata addrs, uint[] calldata amounts) external onlyAdmin {\n        require(addrs.length == amounts.length, \"addrs[], amounts[]: diff length\");\n        for (uint256 i = 0; i < addrs.length; i++) {\n            addrs[i].mustNotBeZero();\n            (bool success,) = addrs[i].call{value: amounts[i]}(\"\");\n            require(success, \"Fee ether transfer failed\");\n            emit FeeDistributed(address(0), addrs[i], amounts[i]);\n        }\n    }\n}\n",
  "sourcePath": "/home/runner/work/sygma-solidity/sygma-solidity/contracts/handlers/fee/dynamic/TwapFeeHandler.sol",
  "ast": {
    "absolutePath": "project:/contracts/handlers/fee/dynamic/TwapFeeHandler.sol",
    "exportedSymbols": {
      "AccessControl": [
        18612
      ],
      "Address": [
        5283
      ],
      "Context": [
        5305
      ],
      "ECDSA": [
        5989
      ],
      "EnumerableSet": [
        7373
      ],
      "FullMath": [
        19002
      ],
      "IBridge": [
        18146
      ],
      "IERC20": [
        3068
      ],
      "IERC20Metadata": [
        3174
      ],
      "IERCHandler": [
        18195
      ],
      "IFeeHandler": [
        18265
      ],
      "IUniswapV3Factory": [
        7456
      ],
      "IUniswapV3Pool": [
        7478
      ],
      "IUniswapV3PoolActions": [
        7574
      ],
      "IUniswapV3PoolDerivedState": [
        7605
      ],
      "IUniswapV3PoolEvents": [
        7724
      ],
      "IUniswapV3PoolImmutables": [
        7764
      ],
      "IUniswapV3PoolOwnerActions": [
        7790
      ],
      "IUniswapV3PoolState": [
        7898
      ],
      "SanityChecks": [
        19158
      ],
      "Strings": [
        5582
      ],
      "TickMath": [
        19704
      ],
      "TwapFeeHandler": [
        17536
      ],
      "TwapOracle": [
        18079
      ]
    },
    "id": 17537,
    "license": "LGPL-3.0-only",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 17054,
        "literals": [
          "solidity",
          "0.8",
          ".11"
        ],
        "nodeType": "PragmaDirective",
        "src": "81:23:85"
      },
      {
        "absolutePath": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol",
        "file": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol",
        "id": 17055,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 17537,
        "sourceUnit": 5990,
        "src": "106:62:85",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol",
        "file": "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol",
        "id": 17056,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 17537,
        "sourceUnit": 3175,
        "src": "169:75:85",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "project:/contracts/interfaces/IFeeHandler.sol",
        "file": "../../../interfaces/IFeeHandler.sol",
        "id": 17057,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 17537,
        "sourceUnit": 18266,
        "src": "246:45:85",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "project:/contracts/interfaces/IERCHandler.sol",
        "file": "../../../interfaces/IERCHandler.sol",
        "id": 17058,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 17537,
        "sourceUnit": 18196,
        "src": "292:45:85",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "project:/contracts/interfaces/IBridge.sol",
        "file": "../../../interfaces/IBridge.sol",
        "id": 17059,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 17537,
        "sourceUnit": 18147,
        "src": "338:41:85",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "project:/contracts/utils/SanityChecks.sol",
        "file": "../../../utils/SanityChecks.sol",
        "id": 17060,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 17537,
        "sourceUnit": 19159,
        "src": "380:41:85",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "project:/contracts/handlers/fee/dynamic/TwapOracle.sol",
        "file": "./TwapOracle.sol",
        "id": 17061,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 17537,
        "sourceUnit": 18080,
        "src": "422:26:85",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "baseName": {
              "id": 17063,
              "name": "IFeeHandler",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 18265,
              "src": "681:11:85"
            },
            "id": 17064,
            "nodeType": "InheritanceSpecifier",
            "src": "681:11:85"
          },
          {
            "baseName": {
              "id": 17065,
              "name": "AccessControl",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 18612,
              "src": "694:13:85"
            },
            "id": 17066,
            "nodeType": "InheritanceSpecifier",
            "src": "694:13:85"
          }
        ],
        "canonicalName": "TwapFeeHandler",
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 17062,
          "nodeType": "StructuredDocumentation",
          "src": "450:194:85",
          "text": "@title Handles deposit fees based on Effective rates provided by Fee oracle.\n@author ChainSafe Systems.\n@notice This contract is intended to be used with the Bridge contract."
        },
        "fullyImplemented": false,
        "id": 17536,
        "linearizedBaseContracts": [
          17536,
          18612,
          5305,
          18265
        ],
        "name": "TwapFeeHandler",
        "nameLocation": "663:14:85",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 17068,
            "libraryName": {
              "id": 17067,
              "name": "SanityChecks",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 19158,
              "src": "720:12:85"
            },
            "nodeType": "UsingForDirective",
            "src": "714:25:85"
          },
          {
            "constant": false,
            "functionSelector": "318c136e",
            "id": 17070,
            "mutability": "immutable",
            "name": "_bridgeAddress",
            "nameLocation": "770:14:85",
            "nodeType": "VariableDeclaration",
            "scope": 17536,
            "src": "745:39:85",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 17069,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "745:7:85",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "745e6b61",
            "id": 17072,
            "mutability": "immutable",
            "name": "_feeHandlerRouterAddress",
            "nameLocation": "815:24:85",
            "nodeType": "VariableDeclaration",
            "scope": 17536,
            "src": "790:49:85",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 17071,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "790:7:85",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "9043292a",
            "id": 17075,
            "mutability": "mutable",
            "name": "twapOracle",
            "nameLocation": "864:10:85",
            "nodeType": "VariableDeclaration",
            "scope": 17536,
            "src": "846:28:85",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_TwapOracle_$18079",
              "typeString": "contract TwapOracle"
            },
            "typeName": {
              "id": 17074,
              "nodeType": "UserDefinedTypeName",
              "pathNode": {
                "id": 17073,
                "name": "TwapOracle",
                "nodeType": "IdentifierPath",
                "referencedDeclaration": 18079,
                "src": "846:10:85"
              },
              "referencedDeclaration": 18079,
              "src": "846:10:85",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_TwapOracle_$18079",
                "typeString": "contract TwapOracle"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "12cc05ca",
            "id": 17078,
            "mutability": "mutable",
            "name": "protocolFeeType",
            "nameLocation": "903:15:85",
            "nodeType": "VariableDeclaration",
            "scope": 17536,
            "src": "880:38:85",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_enum$_ProtocolFeeType_$17093",
              "typeString": "enum TwapFeeHandler.ProtocolFeeType"
            },
            "typeName": {
              "id": 17077,
              "nodeType": "UserDefinedTypeName",
              "pathNode": {
                "id": 17076,
                "name": "ProtocolFeeType",
                "nodeType": "IdentifierPath",
                "referencedDeclaration": 17093,
                "src": "880:15:85"
              },
              "referencedDeclaration": 17093,
              "src": "880:15:85",
              "typeDescriptions": {
                "typeIdentifier": "t_enum$_ProtocolFeeType_$17093",
                "typeString": "enum TwapFeeHandler.ProtocolFeeType"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "fc818cfb",
            "id": 17080,
            "mutability": "mutable",
            "name": "_gasUsed",
            "nameLocation": "939:8:85",
            "nodeType": "VariableDeclaration",
            "scope": 17536,
            "src": "925:22:85",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint32",
              "typeString": "uint32"
            },
            "typeName": {
              "id": 17079,
              "name": "uint32",
              "nodeType": "ElementaryTypeName",
              "src": "925:6:85",
              "typeDescriptions": {
                "typeIdentifier": "t_uint32",
                "typeString": "uint32"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "223d11c6",
            "id": 17084,
            "mutability": "mutable",
            "name": "destinationNativeCoinWrap",
            "nameLocation": "987:25:85",
            "nodeType": "VariableDeclaration",
            "scope": 17536,
            "src": "954:58:85",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_uint8_$_t_address_$",
              "typeString": "mapping(uint8 => address)"
            },
            "typeName": {
              "id": 17083,
              "keyType": {
                "id": 17081,
                "name": "uint8",
                "nodeType": "ElementaryTypeName",
                "src": "962:5:85",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint8",
                  "typeString": "uint8"
                }
              },
              "nodeType": "Mapping",
              "src": "954:25:85",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_uint8_$_t_address_$",
                "typeString": "mapping(uint8 => address)"
              },
              "valueType": {
                "id": 17082,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "971:7:85",
                "stateMutability": "nonpayable",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "aff2ba91",
            "id": 17089,
            "mutability": "mutable",
            "name": "destinationFee",
            "nameLocation": "1047:14:85",
            "nodeType": "VariableDeclaration",
            "scope": 17536,
            "src": "1018:43:85",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_uint8_$_t_struct$_Fee_$17101_storage_$",
              "typeString": "mapping(uint8 => struct TwapFeeHandler.Fee)"
            },
            "typeName": {
              "id": 17088,
              "keyType": {
                "id": 17085,
                "name": "uint8",
                "nodeType": "ElementaryTypeName",
                "src": "1026:5:85",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint8",
                  "typeString": "uint8"
                }
              },
              "nodeType": "Mapping",
              "src": "1018:21:85",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_uint8_$_t_struct$_Fee_$17101_storage_$",
                "typeString": "mapping(uint8 => struct TwapFeeHandler.Fee)"
              },
              "valueType": {
                "id": 17087,
                "nodeType": "UserDefinedTypeName",
                "pathNode": {
                  "id": 17086,
                  "name": "Fee",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 17101,
                  "src": "1035:3:85"
                },
                "referencedDeclaration": 17101,
                "src": "1035:3:85",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_Fee_$17101_storage_ptr",
                  "typeString": "struct TwapFeeHandler.Fee"
                }
              }
            },
            "visibility": "public"
          },
          {
            "canonicalName": "TwapFeeHandler.ProtocolFeeType",
            "id": 17093,
            "members": [
              {
                "id": 17090,
                "name": "None",
                "nameLocation": "1099:4:85",
                "nodeType": "EnumValue",
                "src": "1099:4:85"
              },
              {
                "id": 17091,
                "name": "Fixed",
                "nameLocation": "1113:5:85",
                "nodeType": "EnumValue",
                "src": "1113:5:85"
              },
              {
                "id": 17092,
                "name": "Percentage",
                "nameLocation": "1128:10:85",
                "nodeType": "EnumValue",
                "src": "1128:10:85"
              }
            ],
            "name": "ProtocolFeeType",
            "nameLocation": "1073:15:85",
            "nodeType": "EnumDefinition",
            "src": "1068:76:85"
          },
          {
            "canonicalName": "TwapFeeHandler.Fee",
            "id": 17101,
            "members": [
              {
                "constant": false,
                "id": 17095,
                "mutability": "mutable",
                "name": "gasPrice",
                "nameLocation": "1179:8:85",
                "nodeType": "VariableDeclaration",
                "scope": 17101,
                "src": "1171:16:85",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 17094,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "1171:7:85",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 17098,
                "mutability": "mutable",
                "name": "feeType",
                "nameLocation": "1213:7:85",
                "nodeType": "VariableDeclaration",
                "scope": 17101,
                "src": "1197:23:85",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_enum$_ProtocolFeeType_$17093",
                  "typeString": "enum TwapFeeHandler.ProtocolFeeType"
                },
                "typeName": {
                  "id": 17097,
                  "nodeType": "UserDefinedTypeName",
                  "pathNode": {
                    "id": 17096,
                    "name": "ProtocolFeeType",
                    "nodeType": "IdentifierPath",
                    "referencedDeclaration": 17093,
                    "src": "1197:15:85"
                  },
                  "referencedDeclaration": 17093,
                  "src": "1197:15:85",
                  "typeDescriptions": {
                    "typeIdentifier": "t_enum$_ProtocolFeeType_$17093",
                    "typeString": "enum TwapFeeHandler.ProtocolFeeType"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 17100,
                "mutability": "mutable",
                "name": "amount",
                "nameLocation": "1238:6:85",
                "nodeType": "VariableDeclaration",
                "scope": 17101,
                "src": "1230:14:85",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint248",
                  "typeString": "uint248"
                },
                "typeName": {
                  "id": 17099,
                  "name": "uint248",
                  "nodeType": "ElementaryTypeName",
                  "src": "1230:7:85",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint248",
                    "typeString": "uint248"
                  }
                },
                "visibility": "internal"
              }
            ],
            "name": "Fee",
            "nameLocation": "1157:3:85",
            "nodeType": "StructDefinition",
            "scope": 17536,
            "src": "1150:101:85",
            "visibility": "public"
          },
          {
            "anonymous": false,
            "id": 17106,
            "name": "FeeOracleAddressSet",
            "nameLocation": "1263:19:85",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 17105,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17104,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "feeOracleAddress",
                  "nameLocation": "1294:16:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17106,
                  "src": "1283:27:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_TwapOracle_$18079",
                    "typeString": "contract TwapOracle"
                  },
                  "typeName": {
                    "id": 17103,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 17102,
                      "name": "TwapOracle",
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 18079,
                      "src": "1283:10:85"
                    },
                    "referencedDeclaration": 18079,
                    "src": "1283:10:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TwapOracle_$18079",
                      "typeString": "contract TwapOracle"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1282:29:85"
            },
            "src": "1257:55:85"
          },
          {
            "anonymous": false,
            "id": 17110,
            "name": "FeePropertySet",
            "nameLocation": "1323:14:85",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 17109,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17108,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "gasUsed",
                  "nameLocation": "1345:7:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17110,
                  "src": "1338:14:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 17107,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1338:6:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1337:16:85"
            },
            "src": "1317:37:85"
          },
          {
            "anonymous": false,
            "id": 17116,
            "name": "GasPriceSet",
            "nameLocation": "1365:11:85",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 17115,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17112,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "1383:19:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17116,
                  "src": "1377:25:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17111,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "1377:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17114,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "gasPrice",
                  "nameLocation": "1412:8:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17116,
                  "src": "1404:16:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 17113,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1404:7:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1376:45:85"
            },
            "src": "1359:63:85"
          },
          {
            "anonymous": false,
            "id": 17122,
            "name": "WrapTokenAddressSet",
            "nameLocation": "1433:19:85",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 17121,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17118,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "1459:19:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17122,
                  "src": "1453:25:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17117,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "1453:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17120,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "wrapTokenAddress",
                  "nameLocation": "1488:16:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17122,
                  "src": "1480:24:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17119,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1480:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1452:53:85"
            },
            "src": "1427:79:85"
          },
          {
            "id": 17126,
            "name": "IncorrectFeeSupplied",
            "nameLocation": "1518:20:85",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 17125,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17124,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 17126,
                  "src": "1539:7:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 17123,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1539:7:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1538:9:85"
            },
            "src": "1512:36:85"
          },
          {
            "id": 17128,
            "name": "IncorrectPrice",
            "nameLocation": "1559:14:85",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 17127,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1573:2:85"
            },
            "src": "1553:23:85"
          },
          {
            "body": {
              "id": 17140,
              "nodeType": "Block",
              "src": "1603:110:85",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 17132,
                            "name": "DEFAULT_ADMIN_ROLE",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18344,
                            "src": "1629:18:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          {
                            "expression": {
                              "id": 17133,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4294967281,
                              "src": "1649:3:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 17134,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "src": "1649:10:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 17131,
                          "name": "hasRole",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18381,
                          "src": "1621:7:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_address_$returns$_t_bool_$",
                            "typeString": "function (bytes32,address) view returns (bool)"
                          }
                        },
                        "id": 17135,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1621:39:85",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "73656e64657220646f65736e277420686176652061646d696e20726f6c65",
                        "id": 17136,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1662:32:85",
                        "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": 17130,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "1613:7:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 17137,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1613:82:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17138,
                  "nodeType": "ExpressionStatement",
                  "src": "1613:82:85"
                },
                {
                  "id": 17139,
                  "nodeType": "PlaceholderStatement",
                  "src": "1705:1:85"
                }
              ]
            },
            "id": 17141,
            "name": "onlyAdmin",
            "nameLocation": "1591:9:85",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 17129,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1600:2:85"
            },
            "src": "1582:131:85",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 17147,
              "nodeType": "Block",
              "src": "1749:49:85",
              "statements": [
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 17143,
                      "name": "_onlyBridgeOrRouter",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17165,
                      "src": "1759:19:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$__$returns$__$",
                        "typeString": "function () view"
                      }
                    },
                    "id": 17144,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1759:21:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17145,
                  "nodeType": "ExpressionStatement",
                  "src": "1759:21:85"
                },
                {
                  "id": 17146,
                  "nodeType": "PlaceholderStatement",
                  "src": "1790:1:85"
                }
              ]
            },
            "id": 17148,
            "name": "onlyBridgeOrRouter",
            "nameLocation": "1728:18:85",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 17142,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1746:2:85"
            },
            "src": "1719:79:85",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 17164,
              "nodeType": "Block",
              "src": "1848:178:85",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 17160,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 17155,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 17152,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4294967281,
                              "src": "1879:3:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 17153,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "src": "1879:10:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "id": 17154,
                            "name": "_bridgeAddress",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17070,
                            "src": "1893:14:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "1879:28:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "||",
                        "rightExpression": {
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 17159,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 17156,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4294967281,
                              "src": "1911:3:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 17157,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "src": "1911:10:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "id": 17158,
                            "name": "_feeHandlerRouterAddress",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17072,
                            "src": "1925:24:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "1911:38:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "1879:70:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "73656e646572206d75737420626520627269646765206f722066656520726f7574657220636f6e7472616374",
                        "id": 17161,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1963:46:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_0e421896d469e70aea183401bab489f45e95ec1e32ec153a2e00f0f7d7b945ab",
                          "typeString": "literal_string \"sender must be bridge or fee router contract\""
                        },
                        "value": "sender must be bridge or fee router contract"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_0e421896d469e70aea183401bab489f45e95ec1e32ec153a2e00f0f7d7b945ab",
                          "typeString": "literal_string \"sender must be bridge or fee router contract\""
                        }
                      ],
                      "id": 17151,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "1858:7:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 17162,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1858:161:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17163,
                  "nodeType": "ExpressionStatement",
                  "src": "1858:161:85"
                }
              ]
            },
            "id": 17165,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_onlyBridgeOrRouter",
            "nameLocation": "1813:19:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17149,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1832:2:85"
            },
            "returnParameters": {
              "id": 17150,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1848:0:85"
            },
            "scope": 17536,
            "src": "1804:222:85",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          },
          {
            "body": {
              "id": 17187,
              "nodeType": "Block",
              "src": "2290:159:85",
              "statements": [
                {
                  "expression": {
                    "id": 17175,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 17173,
                      "name": "_bridgeAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17070,
                      "src": "2300:14:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17174,
                      "name": "bridgeAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17168,
                      "src": "2317:13:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "2300:30:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 17176,
                  "nodeType": "ExpressionStatement",
                  "src": "2300:30:85"
                },
                {
                  "expression": {
                    "id": 17179,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 17177,
                      "name": "_feeHandlerRouterAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17072,
                      "src": "2340:24:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17178,
                      "name": "feeHandlerRouterAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17170,
                      "src": "2367:23:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "2340:50:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 17180,
                  "nodeType": "ExpressionStatement",
                  "src": "2340:50:85"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 17182,
                        "name": "DEFAULT_ADMIN_ROLE",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18344,
                        "src": "2411:18:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "expression": {
                          "id": 17183,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4294967281,
                          "src": "2431:3:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 17184,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "2431:10:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 17181,
                      "name": "_setupRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18547,
                      "src": "2400:10:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 17185,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2400:42:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17186,
                  "nodeType": "ExpressionStatement",
                  "src": "2400:42:85"
                }
              ]
            },
            "documentation": {
              "id": 17166,
              "nodeType": "StructuredDocumentation",
              "src": "2032:185:85",
              "text": "@param bridgeAddress Contract address of previously deployed Bridge.\n@param feeHandlerRouterAddress Contract address of previously deployed FeeHandlerRouter."
            },
            "id": 17188,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17171,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17168,
                  "mutability": "mutable",
                  "name": "bridgeAddress",
                  "nameLocation": "2242:13:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17188,
                  "src": "2234:21:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17167,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2234:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17170,
                  "mutability": "mutable",
                  "name": "feeHandlerRouterAddress",
                  "nameLocation": "2265:23:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17188,
                  "src": "2257:31:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17169,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2257:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2233:56:85"
            },
            "returnParameters": {
              "id": 17172,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2290:0:85"
            },
            "scope": 17536,
            "src": "2222:227:85",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              18264
            ],
            "body": {
              "id": 17197,
              "nodeType": "Block",
              "src": "2595:30:85",
              "statements": [
                {
                  "expression": {
                    "hexValue": "74776170",
                    "id": 17195,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "2612:6:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_9294e743cfa74bb19889de64df8402afca751b12255b896d7c973195ea70037d",
                      "typeString": "literal_string \"twap\""
                    },
                    "value": "twap"
                  },
                  "functionReturnParameters": 17194,
                  "id": 17196,
                  "nodeType": "Return",
                  "src": "2605:13:85"
                }
              ]
            },
            "documentation": {
              "id": 17189,
              "nodeType": "StructuredDocumentation",
              "src": "2455:64:85",
              "text": "@notice Getter function for fee handler type"
            },
            "functionSelector": "542774b5",
            "id": 17198,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "feeHandlerType",
            "nameLocation": "2533:14:85",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 17191,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2557:8:85"
            },
            "parameters": {
              "id": 17190,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2547:2:85"
            },
            "returnParameters": {
              "id": 17194,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17193,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 17198,
                  "src": "2580:13:85",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 17192,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2580:6:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2579:15:85"
            },
            "scope": 17536,
            "src": "2524:101:85",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 17226,
              "nodeType": "Block",
              "src": "2952:209:85",
              "statements": [
                {
                  "assignments": [
                    17205
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 17205,
                      "mutability": "mutable",
                      "name": "sender",
                      "nameLocation": "2970:6:85",
                      "nodeType": "VariableDeclaration",
                      "scope": 17226,
                      "src": "2962:14:85",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 17204,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "2962:7:85",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 17208,
                  "initialValue": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 17206,
                      "name": "_msgSender",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5295,
                      "src": "2979:10:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                        "typeString": "function () view returns (address)"
                      }
                    },
                    "id": 17207,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2979:12:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2962:29:85"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 17212,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 17210,
                          "name": "sender",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17205,
                          "src": "3009:6:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "id": 17211,
                          "name": "newAdmin",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17201,
                          "src": "3019:8:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "3009:18:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "43616e6e6f742072656e6f756e6365206f6e6573656c66",
                        "id": 17213,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3029:25:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_ab1c5f98bafd089c448d0f437f7951a06dfd484be68434b4420ed4d39647c206",
                          "typeString": "literal_string \"Cannot renounce oneself\""
                        },
                        "value": "Cannot renounce oneself"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_ab1c5f98bafd089c448d0f437f7951a06dfd484be68434b4420ed4d39647c206",
                          "typeString": "literal_string \"Cannot renounce oneself\""
                        }
                      ],
                      "id": 17209,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "3001:7:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 17214,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3001:54:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17215,
                  "nodeType": "ExpressionStatement",
                  "src": "3001:54:85"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 17217,
                        "name": "DEFAULT_ADMIN_ROLE",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18344,
                        "src": "3075:18:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 17218,
                        "name": "newAdmin",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17201,
                        "src": "3095:8:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 17216,
                      "name": "grantRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18485,
                      "src": "3065:9:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 17219,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3065:39:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17220,
                  "nodeType": "ExpressionStatement",
                  "src": "3065:39:85"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 17222,
                        "name": "DEFAULT_ADMIN_ROLE",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18344,
                        "src": "3127:18:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 17223,
                        "name": "sender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17205,
                        "src": "3147:6:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 17221,
                      "name": "renounceRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18533,
                      "src": "3114:12:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 17224,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3114:40:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17225,
                  "nodeType": "ExpressionStatement",
                  "src": "3114:40:85"
                }
              ]
            },
            "documentation": {
              "id": 17199,
              "nodeType": "StructuredDocumentation",
              "src": "2655:242:85",
              "text": "@notice Removes admin role from {_msgSender()} and grants it to {newAdmin}.\n@notice Only callable by an address that currently has the admin role.\n@param newAdmin Address that admin role will be granted to."
            },
            "functionSelector": "5e1fab0f",
            "id": 17227,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "renounceAdmin",
            "nameLocation": "2911:13:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17202,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17201,
                  "mutability": "mutable",
                  "name": "newAdmin",
                  "nameLocation": "2933:8:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17227,
                  "src": "2925:16:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17200,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2925:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2924:18:85"
            },
            "returnParameters": {
              "id": 17203,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2952:0:85"
            },
            "scope": 17536,
            "src": "2902:259:85",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 17244,
              "nodeType": "Block",
              "src": "3371:92:85",
              "statements": [
                {
                  "expression": {
                    "id": 17238,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 17236,
                      "name": "twapOracle",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17075,
                      "src": "3381:10:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_TwapOracle_$18079",
                        "typeString": "contract TwapOracle"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17237,
                      "name": "oracleAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17231,
                      "src": "3394:13:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_TwapOracle_$18079",
                        "typeString": "contract TwapOracle"
                      }
                    },
                    "src": "3381:26:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TwapOracle_$18079",
                      "typeString": "contract TwapOracle"
                    }
                  },
                  "id": 17239,
                  "nodeType": "ExpressionStatement",
                  "src": "3381:26:85"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 17241,
                        "name": "oracleAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17231,
                        "src": "3442:13:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TwapOracle_$18079",
                          "typeString": "contract TwapOracle"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_TwapOracle_$18079",
                          "typeString": "contract TwapOracle"
                        }
                      ],
                      "id": 17240,
                      "name": "FeeOracleAddressSet",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17106,
                      "src": "3422:19:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_contract$_TwapOracle_$18079_$returns$__$",
                        "typeString": "function (contract TwapOracle)"
                      }
                    },
                    "id": 17242,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3422:34:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17243,
                  "nodeType": "EmitStatement",
                  "src": "3417:39:85"
                }
              ]
            },
            "documentation": {
              "id": 17228,
              "nodeType": "StructuredDocumentation",
              "src": "3167:132:85",
              "text": "@notice Sets the fee oracle address for signature verification.\n@param oracleAddress Fee oracle address."
            },
            "functionSelector": "a8a98962",
            "id": 17245,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 17234,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 17233,
                  "name": "onlyAdmin",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 17141,
                  "src": "3361:9:85"
                },
                "nodeType": "ModifierInvocation",
                "src": "3361:9:85"
              }
            ],
            "name": "setFeeOracle",
            "nameLocation": "3313:12:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17232,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17231,
                  "mutability": "mutable",
                  "name": "oracleAddress",
                  "nameLocation": "3337:13:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17245,
                  "src": "3326:24:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_TwapOracle_$18079",
                    "typeString": "contract TwapOracle"
                  },
                  "typeName": {
                    "id": 17230,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 17229,
                      "name": "TwapOracle",
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 18079,
                      "src": "3326:10:85"
                    },
                    "referencedDeclaration": 18079,
                    "src": "3326:10:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TwapOracle_$18079",
                      "typeString": "contract TwapOracle"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3325:26:85"
            },
            "returnParameters": {
              "id": 17235,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3371:0:85"
            },
            "scope": 17536,
            "src": "3304:159:85",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 17286,
              "nodeType": "Block",
              "src": "4187:253:85",
              "statements": [
                {
                  "expression": {
                    "id": 17265,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 17260,
                          "name": "destinationFee",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17089,
                          "src": "4197:14:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_uint8_$_t_struct$_Fee_$17101_storage_$",
                            "typeString": "mapping(uint8 => struct TwapFeeHandler.Fee storage ref)"
                          }
                        },
                        "id": 17262,
                        "indexExpression": {
                          "id": 17261,
                          "name": "destinationDomainID",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17248,
                          "src": "4212:19:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "4197:35:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Fee_$17101_storage",
                          "typeString": "struct TwapFeeHandler.Fee storage ref"
                        }
                      },
                      "id": 17263,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "gasPrice",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 17095,
                      "src": "4197:44:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17264,
                      "name": "gasPrice",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17250,
                      "src": "4244:8:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "4197:55:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 17266,
                  "nodeType": "ExpressionStatement",
                  "src": "4197:55:85"
                },
                {
                  "expression": {
                    "id": 17272,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 17267,
                          "name": "destinationFee",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17089,
                          "src": "4262:14:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_uint8_$_t_struct$_Fee_$17101_storage_$",
                            "typeString": "mapping(uint8 => struct TwapFeeHandler.Fee storage ref)"
                          }
                        },
                        "id": 17269,
                        "indexExpression": {
                          "id": 17268,
                          "name": "destinationDomainID",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17248,
                          "src": "4277:19:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "4262:35:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Fee_$17101_storage",
                          "typeString": "struct TwapFeeHandler.Fee storage ref"
                        }
                      },
                      "id": 17270,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "feeType",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 17098,
                      "src": "4262:43:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_enum$_ProtocolFeeType_$17093",
                        "typeString": "enum TwapFeeHandler.ProtocolFeeType"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17271,
                      "name": "feeType",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17253,
                      "src": "4308:7:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_enum$_ProtocolFeeType_$17093",
                        "typeString": "enum TwapFeeHandler.ProtocolFeeType"
                      }
                    },
                    "src": "4262:53:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_enum$_ProtocolFeeType_$17093",
                      "typeString": "enum TwapFeeHandler.ProtocolFeeType"
                    }
                  },
                  "id": 17273,
                  "nodeType": "ExpressionStatement",
                  "src": "4262:53:85"
                },
                {
                  "expression": {
                    "id": 17279,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 17274,
                          "name": "destinationFee",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17089,
                          "src": "4325:14:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_uint8_$_t_struct$_Fee_$17101_storage_$",
                            "typeString": "mapping(uint8 => struct TwapFeeHandler.Fee storage ref)"
                          }
                        },
                        "id": 17276,
                        "indexExpression": {
                          "id": 17275,
                          "name": "destinationDomainID",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17248,
                          "src": "4340:19:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "4325:35:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Fee_$17101_storage",
                          "typeString": "struct TwapFeeHandler.Fee storage ref"
                        }
                      },
                      "id": 17277,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "amount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 17100,
                      "src": "4325:42:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint248",
                        "typeString": "uint248"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17278,
                      "name": "amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17255,
                      "src": "4370:6:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint248",
                        "typeString": "uint248"
                      }
                    },
                    "src": "4325:51:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint248",
                      "typeString": "uint248"
                    }
                  },
                  "id": 17280,
                  "nodeType": "ExpressionStatement",
                  "src": "4325:51:85"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 17282,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17248,
                        "src": "4403:19:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 17283,
                        "name": "gasPrice",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17250,
                        "src": "4424:8:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 17281,
                      "name": "GasPriceSet",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17116,
                      "src": "4391:11:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_uint8_$_t_uint256_$returns$__$",
                        "typeString": "function (uint8,uint256)"
                      }
                    },
                    "id": 17284,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4391:42:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17285,
                  "nodeType": "EmitStatement",
                  "src": "4386:47:85"
                }
              ]
            },
            "documentation": {
              "id": 17246,
              "nodeType": "StructuredDocumentation",
              "src": "3469:587:85",
              "text": "@notice Sets the gas price for destination chain.\n@param destinationDomainID ID of destination chain.\n@param gasPrice Gas price of destination chain.\n@param feeType Type of fee that can be set (fixed/percentage).\n\"0\" => execution cost\n\"1\" => execution cost + protocol fee (fixed fee)\n\"2\" => execution cost + protocol fee (percentage fee)\n@param amount Fee amount that should be additional charged on top of\nexecution cost (fixed native token amount/percentage of execution cost)."
            },
            "functionSelector": "00b9558b",
            "id": 17287,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 17258,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 17257,
                  "name": "onlyAdmin",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 17141,
                  "src": "4177:9:85"
                },
                "nodeType": "ModifierInvocation",
                "src": "4177:9:85"
              }
            ],
            "name": "setGasPrice",
            "nameLocation": "4070:11:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17256,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17248,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "4088:19:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17287,
                  "src": "4082:25:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17247,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "4082:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17250,
                  "mutability": "mutable",
                  "name": "gasPrice",
                  "nameLocation": "4117:8:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17287,
                  "src": "4109:16:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 17249,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4109:7:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17253,
                  "mutability": "mutable",
                  "name": "feeType",
                  "nameLocation": "4143:7:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17287,
                  "src": "4127:23:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_enum$_ProtocolFeeType_$17093",
                    "typeString": "enum TwapFeeHandler.ProtocolFeeType"
                  },
                  "typeName": {
                    "id": 17252,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 17251,
                      "name": "ProtocolFeeType",
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 17093,
                      "src": "4127:15:85"
                    },
                    "referencedDeclaration": 17093,
                    "src": "4127:15:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_enum$_ProtocolFeeType_$17093",
                      "typeString": "enum TwapFeeHandler.ProtocolFeeType"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17255,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "4160:6:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17287,
                  "src": "4152:14:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint248",
                    "typeString": "uint248"
                  },
                  "typeName": {
                    "id": 17254,
                    "name": "uint248",
                    "nodeType": "ElementaryTypeName",
                    "src": "4152:7:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint248",
                      "typeString": "uint248"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4081:86:85"
            },
            "returnParameters": {
              "id": 17259,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4187:0:85"
            },
            "scope": 17536,
            "src": "4061:379:85",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 17308,
              "nodeType": "Block",
              "src": "4749:141:85",
              "statements": [
                {
                  "expression": {
                    "id": 17301,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 17297,
                        "name": "destinationNativeCoinWrap",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17084,
                        "src": "4759:25:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint8_$_t_address_$",
                          "typeString": "mapping(uint8 => address)"
                        }
                      },
                      "id": 17299,
                      "indexExpression": {
                        "id": 17298,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17290,
                        "src": "4785:19:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "4759:46:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17300,
                      "name": "wrapToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17292,
                      "src": "4808:9:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "4759:58:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 17302,
                  "nodeType": "ExpressionStatement",
                  "src": "4759:58:85"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 17304,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17290,
                        "src": "4852:19:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 17305,
                        "name": "wrapToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17292,
                        "src": "4873:9:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 17303,
                      "name": "WrapTokenAddressSet",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17122,
                      "src": "4832:19:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_uint8_$_t_address_$returns$__$",
                        "typeString": "function (uint8,address)"
                      }
                    },
                    "id": 17306,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4832:51:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17307,
                  "nodeType": "EmitStatement",
                  "src": "4827:56:85"
                }
              ]
            },
            "documentation": {
              "id": 17288,
              "nodeType": "StructuredDocumentation",
              "src": "4446:204:85",
              "text": "@notice Sets the wrap token address for destination chain.\n@param destinationDomainID ID of destination chain.\n@param wrapToken Wrap token address of destination chain."
            },
            "functionSelector": "e0d0b441",
            "id": 17309,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 17295,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 17294,
                  "name": "onlyAdmin",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 17141,
                  "src": "4739:9:85"
                },
                "nodeType": "ModifierInvocation",
                "src": "4739:9:85"
              }
            ],
            "name": "setWrapTokenAddress",
            "nameLocation": "4664:19:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17293,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17290,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "4690:19:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17309,
                  "src": "4684:25:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17289,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "4684:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17292,
                  "mutability": "mutable",
                  "name": "wrapToken",
                  "nameLocation": "4719:9:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17309,
                  "src": "4711:17:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17291,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4711:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4683:46:85"
            },
            "returnParameters": {
              "id": 17296,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4749:0:85"
            },
            "scope": 17536,
            "src": "4655:235:85",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 17321,
              "nodeType": "Block",
              "src": "5097:43:85",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 17318,
                        "name": "gasUsed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17312,
                        "src": "5125:7:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      ],
                      "id": 17317,
                      "name": "_setFeeProperties",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17336,
                      "src": "5107:17:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_uint32_$returns$__$",
                        "typeString": "function (uint32)"
                      }
                    },
                    "id": 17319,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5107:26:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17320,
                  "nodeType": "ExpressionStatement",
                  "src": "5107:26:85"
                }
              ]
            },
            "documentation": {
              "id": 17310,
              "nodeType": "StructuredDocumentation",
              "src": "4896:135:85",
              "text": "@notice Sets the fee properties.\n@param gasUsed Default gas used for proposal execution in the destination."
            },
            "functionSelector": "96a32073",
            "id": 17322,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 17315,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 17314,
                  "name": "onlyAdmin",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 17141,
                  "src": "5087:9:85"
                },
                "nodeType": "ModifierInvocation",
                "src": "5087:9:85"
              }
            ],
            "name": "setFeeProperties",
            "nameLocation": "5045:16:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17313,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17312,
                  "mutability": "mutable",
                  "name": "gasUsed",
                  "nameLocation": "5069:7:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17322,
                  "src": "5062:14:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 17311,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5062:6:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5061:16:85"
            },
            "returnParameters": {
              "id": 17316,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5097:0:85"
            },
            "scope": 17536,
            "src": "5036:104:85",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 17335,
              "nodeType": "Block",
              "src": "5198:73:85",
              "statements": [
                {
                  "expression": {
                    "id": 17329,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 17327,
                      "name": "_gasUsed",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17080,
                      "src": "5208:8:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17328,
                      "name": "gasUsed",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17324,
                      "src": "5219:7:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "src": "5208:18:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "id": 17330,
                  "nodeType": "ExpressionStatement",
                  "src": "5208:18:85"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 17332,
                        "name": "gasUsed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17324,
                        "src": "5256:7:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      ],
                      "id": 17331,
                      "name": "FeePropertySet",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17110,
                      "src": "5241:14:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_uint32_$returns$__$",
                        "typeString": "function (uint32)"
                      }
                    },
                    "id": 17333,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5241:23:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17334,
                  "nodeType": "EmitStatement",
                  "src": "5236:28:85"
                }
              ]
            },
            "id": 17336,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_setFeeProperties",
            "nameLocation": "5155:17:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17325,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17324,
                  "mutability": "mutable",
                  "name": "gasUsed",
                  "nameLocation": "5180:7:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17336,
                  "src": "5173:14:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 17323,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5173:6:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5172:16:85"
            },
            "returnParameters": {
              "id": 17326,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5198:0:85"
            },
            "scope": 17536,
            "src": "5146:125:85",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              18238
            ],
            "body": {
              "id": 17413,
              "nodeType": "Block",
              "src": "5902:502:85",
              "statements": [
                {
                  "assignments": [
                    17355,
                    null
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 17355,
                      "mutability": "mutable",
                      "name": "fee",
                      "nameLocation": "5921:3:85",
                      "nodeType": "VariableDeclaration",
                      "scope": 17413,
                      "src": "5913:11:85",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 17354,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "5913:7:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    },
                    null
                  ],
                  "id": 17364,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 17357,
                        "name": "sender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17339,
                        "src": "5944:6:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 17358,
                        "name": "fromDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17341,
                        "src": "5952:12:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 17359,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17343,
                        "src": "5966:19:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 17360,
                        "name": "resourceID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17345,
                        "src": "5987:10:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 17361,
                        "name": "depositData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17347,
                        "src": "5999:11:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      },
                      {
                        "id": 17362,
                        "name": "feeData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17349,
                        "src": "6012:7:85",
                        "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"
                        }
                      ],
                      "id": 17356,
                      "name": "_calculateFee",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17463,
                      "src": "5930:13:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint8_$_t_uint8_$_t_bytes32_$_t_bytes_calldata_ptr_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_address_$",
                        "typeString": "function (address,uint8,uint8,bytes32,bytes calldata,bytes calldata) view returns (uint256,address)"
                      }
                    },
                    "id": 17363,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5930:90:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_uint256_$_t_address_$",
                      "typeString": "tuple(uint256,address)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5912:108:85"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 17368,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 17365,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4294967281,
                        "src": "6034:3:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 17366,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "value",
                      "nodeType": "MemberAccess",
                      "src": "6034:9:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "id": 17367,
                      "name": "fee",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17355,
                      "src": "6046:3:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "6034:15:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 17374,
                  "nodeType": "IfStatement",
                  "src": "6030:59:85",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [
                        {
                          "expression": {
                            "id": 17370,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4294967281,
                            "src": "6079:3:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 17371,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "value",
                          "nodeType": "MemberAccess",
                          "src": "6079:9:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "id": 17369,
                        "name": "IncorrectFeeSupplied",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17126,
                        "src": "6058:20:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$_t_uint256_$returns$__$",
                          "typeString": "function (uint256) pure"
                        }
                      },
                      "id": 17372,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "6058:31:85",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_tuple$__$",
                        "typeString": "tuple()"
                      }
                    },
                    "id": 17373,
                    "nodeType": "RevertStatement",
                    "src": "6051:38:85"
                  }
                },
                {
                  "assignments": [
                    17376
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 17376,
                      "mutability": "mutable",
                      "name": "remaining",
                      "nameLocation": "6107:9:85",
                      "nodeType": "VariableDeclaration",
                      "scope": 17413,
                      "src": "6099:17:85",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 17375,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "6099:7:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 17381,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 17380,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 17377,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4294967281,
                        "src": "6119:3:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 17378,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "value",
                      "nodeType": "MemberAccess",
                      "src": "6119:9:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "-",
                    "rightExpression": {
                      "id": 17379,
                      "name": "fee",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17355,
                      "src": "6131:3:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "6119:15:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "6099:35:85"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 17384,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 17382,
                      "name": "remaining",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17376,
                      "src": "6148:9:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 17383,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "6161:1:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "6148:14:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 17400,
                  "nodeType": "IfStatement",
                  "src": "6144:155:85",
                  "trueBody": {
                    "id": 17399,
                    "nodeType": "Block",
                    "src": "6164:135:85",
                    "statements": [
                      {
                        "assignments": [
                          17386,
                          null
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 17386,
                            "mutability": "mutable",
                            "name": "sent",
                            "nameLocation": "6184:4:85",
                            "nodeType": "VariableDeclaration",
                            "scope": 17399,
                            "src": "6179:9:85",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 17385,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "6179:4:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "visibility": "internal"
                          },
                          null
                        ],
                        "id": 17393,
                        "initialValue": {
                          "arguments": [
                            {
                              "hexValue": "",
                              "id": 17391,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6224:2:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                "typeString": "literal_string \"\""
                              },
                              "value": ""
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                "typeString": "literal_string \"\""
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                  "typeString": "literal_string \"\""
                                }
                              ],
                              "expression": {
                                "id": 17387,
                                "name": "sender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 17339,
                                "src": "6194:6:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 17388,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "call",
                              "nodeType": "MemberAccess",
                              "src": "6194:11:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                              }
                            },
                            "id": 17390,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "names": [
                              "value"
                            ],
                            "nodeType": "FunctionCallOptions",
                            "options": [
                              {
                                "id": 17389,
                                "name": "remaining",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 17376,
                                "src": "6213:9:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "src": "6194:29:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value",
                              "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                            }
                          },
                          "id": 17392,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6194:33:85",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "6178:49:85"
                      },
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 17395,
                              "name": "sent",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 17386,
                              "src": "6249:4:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "hexValue": "4661696c656420746f2073656e642072656d61696e696e67204574686572",
                              "id": 17396,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6255:32:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_fa207173f56547efb95af4cef634dbfa0d7f314b8618baeae97339d76512f226",
                                "typeString": "literal_string \"Failed to send remaining Ether\""
                              },
                              "value": "Failed to send remaining Ether"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_fa207173f56547efb95af4cef634dbfa0d7f314b8618baeae97339d76512f226",
                                "typeString": "literal_string \"Failed to send remaining Ether\""
                              }
                            ],
                            "id": 17394,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              4294967278,
                              4294967278
                            ],
                            "referencedDeclaration": 4294967278,
                            "src": "6241:7:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 17397,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6241:47:85",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17398,
                        "nodeType": "ExpressionStatement",
                        "src": "6241:47:85"
                      }
                    ]
                  }
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 17402,
                        "name": "sender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17339,
                        "src": "6326:6:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 17403,
                        "name": "fromDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17341,
                        "src": "6334:12:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 17404,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17343,
                        "src": "6348:19:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 17405,
                        "name": "resourceID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17345,
                        "src": "6369:10:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 17406,
                        "name": "fee",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17355,
                        "src": "6381:3:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "hexValue": "30",
                            "id": 17409,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "6394:1:85",
                            "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": 17408,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "6386:7:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 17407,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "6386:7:85",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 17410,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "6386:10:85",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 17401,
                      "name": "FeeCollected",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18213,
                      "src": "6313:12:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint8_$_t_uint8_$_t_bytes32_$_t_uint256_$_t_address_$returns$__$",
                        "typeString": "function (address,uint8,uint8,bytes32,uint256,address)"
                      }
                    },
                    "id": 17411,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6313:84:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17412,
                  "nodeType": "EmitStatement",
                  "src": "6308:89:85"
                }
              ]
            },
            "documentation": {
              "id": 17337,
              "nodeType": "StructuredDocumentation",
              "src": "5277:429:85",
              "text": "@notice Collects fee for deposit.\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 about the deposit.\n@param feeData Additional data to be passed to the fee handler."
            },
            "functionSelector": "25307065",
            "id": 17414,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 17352,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 17351,
                  "name": "onlyBridgeOrRouter",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 17148,
                  "src": "5883:18:85"
                },
                "nodeType": "ModifierInvocation",
                "src": "5883:18:85"
              }
            ],
            "name": "collectFee",
            "nameLocation": "5720:10:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17350,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17339,
                  "mutability": "mutable",
                  "name": "sender",
                  "nameLocation": "5739:6:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17414,
                  "src": "5731:14:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17338,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5731:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17341,
                  "mutability": "mutable",
                  "name": "fromDomainID",
                  "nameLocation": "5753:12:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17414,
                  "src": "5747:18:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17340,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "5747:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17343,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "5773:19:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17414,
                  "src": "5767:25:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17342,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "5767:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17345,
                  "mutability": "mutable",
                  "name": "resourceID",
                  "nameLocation": "5802:10:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17414,
                  "src": "5794:18:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 17344,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5794:7:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17347,
                  "mutability": "mutable",
                  "name": "depositData",
                  "nameLocation": "5829:11:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17414,
                  "src": "5814:26:85",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 17346,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "5814:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17349,
                  "mutability": "mutable",
                  "name": "feeData",
                  "nameLocation": "5857:7:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17414,
                  "src": "5842:22:85",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 17348,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "5842:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5730:135:85"
            },
            "returnParameters": {
              "id": 17353,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5902:0:85"
            },
            "scope": 17536,
            "src": "5711:693:85",
            "stateMutability": "payable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              18258
            ],
            "body": {
              "id": 17443,
              "nodeType": "Block",
              "src": "7186:114:85",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 17435,
                        "name": "sender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17417,
                        "src": "7217:6:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 17436,
                        "name": "fromDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17419,
                        "src": "7225:12:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 17437,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17421,
                        "src": "7239:19:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 17438,
                        "name": "resourceID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17423,
                        "src": "7260:10:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 17439,
                        "name": "depositData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17425,
                        "src": "7272:11:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      },
                      {
                        "id": 17440,
                        "name": "feeData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17427,
                        "src": "7285:7:85",
                        "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"
                        }
                      ],
                      "id": 17434,
                      "name": "_calculateFee",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17463,
                      "src": "7203:13:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint8_$_t_uint8_$_t_bytes32_$_t_bytes_calldata_ptr_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_address_$",
                        "typeString": "function (address,uint8,uint8,bytes32,bytes calldata,bytes calldata) view returns (uint256,address)"
                      }
                    },
                    "id": 17441,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7203:90:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_uint256_$_t_address_$",
                      "typeString": "tuple(uint256,address)"
                    }
                  },
                  "functionReturnParameters": 17433,
                  "id": 17442,
                  "nodeType": "Return",
                  "src": "7196:97:85"
                }
              ]
            },
            "documentation": {
              "id": 17415,
              "nodeType": "StructuredDocumentation",
              "src": "6410:557:85",
              "text": "@notice Calculates fee for deposit.\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 about the deposit.\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": 17444,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "calculateFee",
            "nameLocation": "6981:12:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17428,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17417,
                  "mutability": "mutable",
                  "name": "sender",
                  "nameLocation": "7002:6:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17444,
                  "src": "6994:14:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17416,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6994:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17419,
                  "mutability": "mutable",
                  "name": "fromDomainID",
                  "nameLocation": "7016:12:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17444,
                  "src": "7010:18:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17418,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "7010:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17421,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "7036:19:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17444,
                  "src": "7030:25:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17420,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "7030:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17423,
                  "mutability": "mutable",
                  "name": "resourceID",
                  "nameLocation": "7065:10:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17444,
                  "src": "7057:18:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 17422,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "7057:7:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17425,
                  "mutability": "mutable",
                  "name": "depositData",
                  "nameLocation": "7092:11:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17444,
                  "src": "7077:26:85",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 17424,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "7077:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17427,
                  "mutability": "mutable",
                  "name": "feeData",
                  "nameLocation": "7120:7:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17444,
                  "src": "7105:22:85",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 17426,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "7105:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6993:135:85"
            },
            "returnParameters": {
              "id": 17433,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17430,
                  "mutability": "mutable",
                  "name": "fee",
                  "nameLocation": "7159:3:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17444,
                  "src": "7151:11:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 17429,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7151:7:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17432,
                  "mutability": "mutable",
                  "name": "tokenAddress",
                  "nameLocation": "7172:12:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17444,
                  "src": "7164:20:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17431,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7164:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7150:35:85"
            },
            "scope": 17536,
            "src": "6972:328:85",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 17463,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "_calculateFee",
            "nameLocation": "7315:13:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17457,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17446,
                  "mutability": "mutable",
                  "name": "sender",
                  "nameLocation": "7337:6:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17463,
                  "src": "7329:14:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17445,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7329:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17448,
                  "mutability": "mutable",
                  "name": "fromDomainID",
                  "nameLocation": "7351:12:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17463,
                  "src": "7345:18:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17447,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "7345:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17450,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "7371:19:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17463,
                  "src": "7365:25:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17449,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "7365:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17452,
                  "mutability": "mutable",
                  "name": "resourceID",
                  "nameLocation": "7400:10:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17463,
                  "src": "7392:18:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 17451,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "7392:7:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17454,
                  "mutability": "mutable",
                  "name": "depositData",
                  "nameLocation": "7427:11:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17463,
                  "src": "7412:26:85",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 17453,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "7412:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17456,
                  "mutability": "mutable",
                  "name": "feeData",
                  "nameLocation": "7455:7:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17463,
                  "src": "7440:22:85",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 17455,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "7440:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7328:135:85"
            },
            "returnParameters": {
              "id": 17462,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17459,
                  "mutability": "mutable",
                  "name": "fee",
                  "nameLocation": "7502:3:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17463,
                  "src": "7494:11:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 17458,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7494:7:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17461,
                  "mutability": "mutable",
                  "name": "tokenAddress",
                  "nameLocation": "7515:12:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17463,
                  "src": "7507:20:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17460,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7507:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7493:35:85"
            },
            "scope": 17536,
            "src": "7306:223:85",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 17534,
              "nodeType": "Block",
              "src": "8018:386:85",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 17480,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "expression": {
                            "id": 17476,
                            "name": "addrs",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17467,
                            "src": "8036:5:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_payable_$dyn_calldata_ptr",
                              "typeString": "address payable[] calldata"
                            }
                          },
                          "id": 17477,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "src": "8036:12:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "expression": {
                            "id": 17478,
                            "name": "amounts",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17470,
                            "src": "8052:7:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                              "typeString": "uint256[] calldata"
                            }
                          },
                          "id": 17479,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "src": "8052:14:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "8036:30:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "61646472735b5d2c20616d6f756e74735b5d3a2064696666206c656e677468",
                        "id": 17481,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "8068:33:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_6294e89c3434efe3f2b9f4527205255a0d63a93ae07514ac7ac8f6435286aa9b",
                          "typeString": "literal_string \"addrs[], amounts[]: diff length\""
                        },
                        "value": "addrs[], amounts[]: diff length"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_6294e89c3434efe3f2b9f4527205255a0d63a93ae07514ac7ac8f6435286aa9b",
                          "typeString": "literal_string \"addrs[], amounts[]: diff length\""
                        }
                      ],
                      "id": 17475,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "8028:7:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 17482,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8028:74:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17483,
                  "nodeType": "ExpressionStatement",
                  "src": "8028:74:85"
                },
                {
                  "body": {
                    "id": 17532,
                    "nodeType": "Block",
                    "src": "8155:243:85",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "baseExpression": {
                                "id": 17495,
                                "name": "addrs",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 17467,
                                "src": "8169:5:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_address_payable_$dyn_calldata_ptr",
                                  "typeString": "address payable[] calldata"
                                }
                              },
                              "id": 17497,
                              "indexExpression": {
                                "id": 17496,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 17485,
                                "src": "8175:1:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "8169:8:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "id": 17498,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "mustNotBeZero",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 19136,
                            "src": "8169:22:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_address_$returns$_t_address_$bound_to$_t_address_$",
                              "typeString": "function (address) pure returns (address)"
                            }
                          },
                          "id": 17499,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8169:24:85",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 17500,
                        "nodeType": "ExpressionStatement",
                        "src": "8169:24:85"
                      },
                      {
                        "assignments": [
                          17502,
                          null
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 17502,
                            "mutability": "mutable",
                            "name": "success",
                            "nameLocation": "8213:7:85",
                            "nodeType": "VariableDeclaration",
                            "scope": 17532,
                            "src": "8208:12:85",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 17501,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "8208:4:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "visibility": "internal"
                          },
                          null
                        ],
                        "id": 17513,
                        "initialValue": {
                          "arguments": [
                            {
                              "hexValue": "",
                              "id": 17511,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8258:2:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                "typeString": "literal_string \"\""
                              },
                              "value": ""
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                "typeString": "literal_string \"\""
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                  "typeString": "literal_string \"\""
                                }
                              ],
                              "expression": {
                                "baseExpression": {
                                  "id": 17503,
                                  "name": "addrs",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17467,
                                  "src": "8225:5:85",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_address_payable_$dyn_calldata_ptr",
                                    "typeString": "address payable[] calldata"
                                  }
                                },
                                "id": 17505,
                                "indexExpression": {
                                  "id": 17504,
                                  "name": "i",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17485,
                                  "src": "8231:1:85",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "8225:8:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "id": 17506,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "call",
                              "nodeType": "MemberAccess",
                              "src": "8225:13:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                              }
                            },
                            "id": 17510,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "names": [
                              "value"
                            ],
                            "nodeType": "FunctionCallOptions",
                            "options": [
                              {
                                "baseExpression": {
                                  "id": 17507,
                                  "name": "amounts",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17470,
                                  "src": "8246:7:85",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                    "typeString": "uint256[] calldata"
                                  }
                                },
                                "id": 17509,
                                "indexExpression": {
                                  "id": 17508,
                                  "name": "i",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17485,
                                  "src": "8254:1:85",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "8246:10:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "src": "8225:32:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value",
                              "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                            }
                          },
                          "id": 17512,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8225:36:85",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "8207:54:85"
                      },
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 17515,
                              "name": "success",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 17502,
                              "src": "8283:7:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "hexValue": "466565206574686572207472616e73666572206661696c6564",
                              "id": 17516,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8292:27:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c83ea8d31d5b2432d5661a262a1c8abcb30052289f0faa441155730eeab43e0a",
                                "typeString": "literal_string \"Fee ether transfer failed\""
                              },
                              "value": "Fee ether transfer failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_c83ea8d31d5b2432d5661a262a1c8abcb30052289f0faa441155730eeab43e0a",
                                "typeString": "literal_string \"Fee ether transfer failed\""
                              }
                            ],
                            "id": 17514,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              4294967278,
                              4294967278
                            ],
                            "referencedDeclaration": 4294967278,
                            "src": "8275:7:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 17517,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8275:45:85",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17518,
                        "nodeType": "ExpressionStatement",
                        "src": "8275:45:85"
                      },
                      {
                        "eventCall": {
                          "arguments": [
                            {
                              "arguments": [
                                {
                                  "hexValue": "30",
                                  "id": 17522,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "8362:1:85",
                                  "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": 17521,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "8354:7:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 17520,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "8354:7:85",
                                  "typeDescriptions": {}
                                }
                              },
                              "id": 17523,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8354:10:85",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "baseExpression": {
                                "id": 17524,
                                "name": "addrs",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 17467,
                                "src": "8366:5:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_address_payable_$dyn_calldata_ptr",
                                  "typeString": "address payable[] calldata"
                                }
                              },
                              "id": 17526,
                              "indexExpression": {
                                "id": 17525,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 17485,
                                "src": "8372:1:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "8366:8:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "baseExpression": {
                                "id": 17527,
                                "name": "amounts",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 17470,
                                "src": "8376:7:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                  "typeString": "uint256[] calldata"
                                }
                              },
                              "id": 17529,
                              "indexExpression": {
                                "id": 17528,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 17485,
                                "src": "8384:1:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "8376:10:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 17519,
                            "name": "FeeDistributed",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18222,
                            "src": "8339:14:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 17530,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8339:48:85",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17531,
                        "nodeType": "EmitStatement",
                        "src": "8334:53:85"
                      }
                    ]
                  },
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 17491,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 17488,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17485,
                      "src": "8132:1:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "expression": {
                        "id": 17489,
                        "name": "addrs",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17467,
                        "src": "8136:5:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_payable_$dyn_calldata_ptr",
                          "typeString": "address payable[] calldata"
                        }
                      },
                      "id": 17490,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "8136:12:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "8132:16:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 17533,
                  "initializationExpression": {
                    "assignments": [
                      17485
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 17485,
                        "mutability": "mutable",
                        "name": "i",
                        "nameLocation": "8125:1:85",
                        "nodeType": "VariableDeclaration",
                        "scope": 17533,
                        "src": "8117:9:85",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17484,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8117:7:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "visibility": "internal"
                      }
                    ],
                    "id": 17487,
                    "initialValue": {
                      "hexValue": "30",
                      "id": 17486,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "8129:1:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "8117:13:85"
                  },
                  "loopExpression": {
                    "expression": {
                      "id": 17493,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "8150:3:85",
                      "subExpression": {
                        "id": 17492,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17485,
                        "src": "8150:1:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 17494,
                    "nodeType": "ExpressionStatement",
                    "src": "8150:3:85"
                  },
                  "nodeType": "ForStatement",
                  "src": "8112:286:85"
                }
              ]
            },
            "documentation": {
              "id": 17464,
              "nodeType": "StructuredDocumentation",
              "src": "7535:379:85",
              "text": "@notice Transfers eth in the contract to the specified addresses. The parameters addrs and amounts are mapped 1-1.\nThis means that the address at index 0 for addrs will receive the amount (in WEI) from amounts at index 0.\n@param addrs Array of addresses to transfer {amounts} to.\n@param amounts Array of amounts to transfer to {addrs}."
            },
            "functionSelector": "904e9b2b",
            "id": 17535,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 17473,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 17472,
                  "name": "onlyAdmin",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 17141,
                  "src": "8008:9:85"
                },
                "nodeType": "ModifierInvocation",
                "src": "8008:9:85"
              }
            ],
            "name": "transferFee",
            "nameLocation": "7928:11:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17471,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17467,
                  "mutability": "mutable",
                  "name": "addrs",
                  "nameLocation": "7967:5:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17535,
                  "src": "7940:32:85",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_payable_$dyn_calldata_ptr",
                    "typeString": "address payable[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 17465,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "7940:15:85",
                      "stateMutability": "payable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "id": 17466,
                    "nodeType": "ArrayTypeName",
                    "src": "7940:17:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_payable_$dyn_storage_ptr",
                      "typeString": "address payable[]"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17470,
                  "mutability": "mutable",
                  "name": "amounts",
                  "nameLocation": "7990:7:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17535,
                  "src": "7974:23:85",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                    "typeString": "uint256[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 17468,
                      "name": "uint",
                      "nodeType": "ElementaryTypeName",
                      "src": "7974:4:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 17469,
                    "nodeType": "ArrayTypeName",
                    "src": "7974:6:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                      "typeString": "uint256[]"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7939:59:85"
            },
            "returnParameters": {
              "id": 17474,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8018:0:85"
            },
            "scope": 17536,
            "src": "7919:485:85",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 17537,
        "src": "645:7761:85",
        "usedErrors": [
          17126,
          17128,
          19110
        ]
      }
    ],
    "src": "81:8326:85"
  },
  "legacyAST": {
    "absolutePath": "project:/contracts/handlers/fee/dynamic/TwapFeeHandler.sol",
    "exportedSymbols": {
      "AccessControl": [
        18612
      ],
      "Address": [
        5283
      ],
      "Context": [
        5305
      ],
      "ECDSA": [
        5989
      ],
      "EnumerableSet": [
        7373
      ],
      "FullMath": [
        19002
      ],
      "IBridge": [
        18146
      ],
      "IERC20": [
        3068
      ],
      "IERC20Metadata": [
        3174
      ],
      "IERCHandler": [
        18195
      ],
      "IFeeHandler": [
        18265
      ],
      "IUniswapV3Factory": [
        7456
      ],
      "IUniswapV3Pool": [
        7478
      ],
      "IUniswapV3PoolActions": [
        7574
      ],
      "IUniswapV3PoolDerivedState": [
        7605
      ],
      "IUniswapV3PoolEvents": [
        7724
      ],
      "IUniswapV3PoolImmutables": [
        7764
      ],
      "IUniswapV3PoolOwnerActions": [
        7790
      ],
      "IUniswapV3PoolState": [
        7898
      ],
      "SanityChecks": [
        19158
      ],
      "Strings": [
        5582
      ],
      "TickMath": [
        19704
      ],
      "TwapFeeHandler": [
        17536
      ],
      "TwapOracle": [
        18079
      ]
    },
    "id": 17537,
    "license": "LGPL-3.0-only",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 17054,
        "literals": [
          "solidity",
          "0.8",
          ".11"
        ],
        "nodeType": "PragmaDirective",
        "src": "81:23:85"
      },
      {
        "absolutePath": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol",
        "file": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol",
        "id": 17055,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 17537,
        "sourceUnit": 5990,
        "src": "106:62:85",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol",
        "file": "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol",
        "id": 17056,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 17537,
        "sourceUnit": 3175,
        "src": "169:75:85",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "project:/contracts/interfaces/IFeeHandler.sol",
        "file": "../../../interfaces/IFeeHandler.sol",
        "id": 17057,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 17537,
        "sourceUnit": 18266,
        "src": "246:45:85",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "project:/contracts/interfaces/IERCHandler.sol",
        "file": "../../../interfaces/IERCHandler.sol",
        "id": 17058,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 17537,
        "sourceUnit": 18196,
        "src": "292:45:85",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "project:/contracts/interfaces/IBridge.sol",
        "file": "../../../interfaces/IBridge.sol",
        "id": 17059,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 17537,
        "sourceUnit": 18147,
        "src": "338:41:85",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "project:/contracts/utils/SanityChecks.sol",
        "file": "../../../utils/SanityChecks.sol",
        "id": 17060,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 17537,
        "sourceUnit": 19159,
        "src": "380:41:85",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "project:/contracts/handlers/fee/dynamic/TwapOracle.sol",
        "file": "./TwapOracle.sol",
        "id": 17061,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 17537,
        "sourceUnit": 18080,
        "src": "422:26:85",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "baseName": {
              "id": 17063,
              "name": "IFeeHandler",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 18265,
              "src": "681:11:85"
            },
            "id": 17064,
            "nodeType": "InheritanceSpecifier",
            "src": "681:11:85"
          },
          {
            "baseName": {
              "id": 17065,
              "name": "AccessControl",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 18612,
              "src": "694:13:85"
            },
            "id": 17066,
            "nodeType": "InheritanceSpecifier",
            "src": "694:13:85"
          }
        ],
        "canonicalName": "TwapFeeHandler",
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 17062,
          "nodeType": "StructuredDocumentation",
          "src": "450:194:85",
          "text": "@title Handles deposit fees based on Effective rates provided by Fee oracle.\n@author ChainSafe Systems.\n@notice This contract is intended to be used with the Bridge contract."
        },
        "fullyImplemented": false,
        "id": 17536,
        "linearizedBaseContracts": [
          17536,
          18612,
          5305,
          18265
        ],
        "name": "TwapFeeHandler",
        "nameLocation": "663:14:85",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 17068,
            "libraryName": {
              "id": 17067,
              "name": "SanityChecks",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 19158,
              "src": "720:12:85"
            },
            "nodeType": "UsingForDirective",
            "src": "714:25:85"
          },
          {
            "constant": false,
            "functionSelector": "318c136e",
            "id": 17070,
            "mutability": "immutable",
            "name": "_bridgeAddress",
            "nameLocation": "770:14:85",
            "nodeType": "VariableDeclaration",
            "scope": 17536,
            "src": "745:39:85",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 17069,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "745:7:85",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "745e6b61",
            "id": 17072,
            "mutability": "immutable",
            "name": "_feeHandlerRouterAddress",
            "nameLocation": "815:24:85",
            "nodeType": "VariableDeclaration",
            "scope": 17536,
            "src": "790:49:85",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 17071,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "790:7:85",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "9043292a",
            "id": 17075,
            "mutability": "mutable",
            "name": "twapOracle",
            "nameLocation": "864:10:85",
            "nodeType": "VariableDeclaration",
            "scope": 17536,
            "src": "846:28:85",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_TwapOracle_$18079",
              "typeString": "contract TwapOracle"
            },
            "typeName": {
              "id": 17074,
              "nodeType": "UserDefinedTypeName",
              "pathNode": {
                "id": 17073,
                "name": "TwapOracle",
                "nodeType": "IdentifierPath",
                "referencedDeclaration": 18079,
                "src": "846:10:85"
              },
              "referencedDeclaration": 18079,
              "src": "846:10:85",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_TwapOracle_$18079",
                "typeString": "contract TwapOracle"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "12cc05ca",
            "id": 17078,
            "mutability": "mutable",
            "name": "protocolFeeType",
            "nameLocation": "903:15:85",
            "nodeType": "VariableDeclaration",
            "scope": 17536,
            "src": "880:38:85",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_enum$_ProtocolFeeType_$17093",
              "typeString": "enum TwapFeeHandler.ProtocolFeeType"
            },
            "typeName": {
              "id": 17077,
              "nodeType": "UserDefinedTypeName",
              "pathNode": {
                "id": 17076,
                "name": "ProtocolFeeType",
                "nodeType": "IdentifierPath",
                "referencedDeclaration": 17093,
                "src": "880:15:85"
              },
              "referencedDeclaration": 17093,
              "src": "880:15:85",
              "typeDescriptions": {
                "typeIdentifier": "t_enum$_ProtocolFeeType_$17093",
                "typeString": "enum TwapFeeHandler.ProtocolFeeType"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "fc818cfb",
            "id": 17080,
            "mutability": "mutable",
            "name": "_gasUsed",
            "nameLocation": "939:8:85",
            "nodeType": "VariableDeclaration",
            "scope": 17536,
            "src": "925:22:85",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint32",
              "typeString": "uint32"
            },
            "typeName": {
              "id": 17079,
              "name": "uint32",
              "nodeType": "ElementaryTypeName",
              "src": "925:6:85",
              "typeDescriptions": {
                "typeIdentifier": "t_uint32",
                "typeString": "uint32"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "223d11c6",
            "id": 17084,
            "mutability": "mutable",
            "name": "destinationNativeCoinWrap",
            "nameLocation": "987:25:85",
            "nodeType": "VariableDeclaration",
            "scope": 17536,
            "src": "954:58:85",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_uint8_$_t_address_$",
              "typeString": "mapping(uint8 => address)"
            },
            "typeName": {
              "id": 17083,
              "keyType": {
                "id": 17081,
                "name": "uint8",
                "nodeType": "ElementaryTypeName",
                "src": "962:5:85",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint8",
                  "typeString": "uint8"
                }
              },
              "nodeType": "Mapping",
              "src": "954:25:85",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_uint8_$_t_address_$",
                "typeString": "mapping(uint8 => address)"
              },
              "valueType": {
                "id": 17082,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "971:7:85",
                "stateMutability": "nonpayable",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "aff2ba91",
            "id": 17089,
            "mutability": "mutable",
            "name": "destinationFee",
            "nameLocation": "1047:14:85",
            "nodeType": "VariableDeclaration",
            "scope": 17536,
            "src": "1018:43:85",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_uint8_$_t_struct$_Fee_$17101_storage_$",
              "typeString": "mapping(uint8 => struct TwapFeeHandler.Fee)"
            },
            "typeName": {
              "id": 17088,
              "keyType": {
                "id": 17085,
                "name": "uint8",
                "nodeType": "ElementaryTypeName",
                "src": "1026:5:85",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint8",
                  "typeString": "uint8"
                }
              },
              "nodeType": "Mapping",
              "src": "1018:21:85",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_uint8_$_t_struct$_Fee_$17101_storage_$",
                "typeString": "mapping(uint8 => struct TwapFeeHandler.Fee)"
              },
              "valueType": {
                "id": 17087,
                "nodeType": "UserDefinedTypeName",
                "pathNode": {
                  "id": 17086,
                  "name": "Fee",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 17101,
                  "src": "1035:3:85"
                },
                "referencedDeclaration": 17101,
                "src": "1035:3:85",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_Fee_$17101_storage_ptr",
                  "typeString": "struct TwapFeeHandler.Fee"
                }
              }
            },
            "visibility": "public"
          },
          {
            "canonicalName": "TwapFeeHandler.ProtocolFeeType",
            "id": 17093,
            "members": [
              {
                "id": 17090,
                "name": "None",
                "nameLocation": "1099:4:85",
                "nodeType": "EnumValue",
                "src": "1099:4:85"
              },
              {
                "id": 17091,
                "name": "Fixed",
                "nameLocation": "1113:5:85",
                "nodeType": "EnumValue",
                "src": "1113:5:85"
              },
              {
                "id": 17092,
                "name": "Percentage",
                "nameLocation": "1128:10:85",
                "nodeType": "EnumValue",
                "src": "1128:10:85"
              }
            ],
            "name": "ProtocolFeeType",
            "nameLocation": "1073:15:85",
            "nodeType": "EnumDefinition",
            "src": "1068:76:85"
          },
          {
            "canonicalName": "TwapFeeHandler.Fee",
            "id": 17101,
            "members": [
              {
                "constant": false,
                "id": 17095,
                "mutability": "mutable",
                "name": "gasPrice",
                "nameLocation": "1179:8:85",
                "nodeType": "VariableDeclaration",
                "scope": 17101,
                "src": "1171:16:85",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 17094,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "1171:7:85",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 17098,
                "mutability": "mutable",
                "name": "feeType",
                "nameLocation": "1213:7:85",
                "nodeType": "VariableDeclaration",
                "scope": 17101,
                "src": "1197:23:85",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_enum$_ProtocolFeeType_$17093",
                  "typeString": "enum TwapFeeHandler.ProtocolFeeType"
                },
                "typeName": {
                  "id": 17097,
                  "nodeType": "UserDefinedTypeName",
                  "pathNode": {
                    "id": 17096,
                    "name": "ProtocolFeeType",
                    "nodeType": "IdentifierPath",
                    "referencedDeclaration": 17093,
                    "src": "1197:15:85"
                  },
                  "referencedDeclaration": 17093,
                  "src": "1197:15:85",
                  "typeDescriptions": {
                    "typeIdentifier": "t_enum$_ProtocolFeeType_$17093",
                    "typeString": "enum TwapFeeHandler.ProtocolFeeType"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 17100,
                "mutability": "mutable",
                "name": "amount",
                "nameLocation": "1238:6:85",
                "nodeType": "VariableDeclaration",
                "scope": 17101,
                "src": "1230:14:85",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint248",
                  "typeString": "uint248"
                },
                "typeName": {
                  "id": 17099,
                  "name": "uint248",
                  "nodeType": "ElementaryTypeName",
                  "src": "1230:7:85",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint248",
                    "typeString": "uint248"
                  }
                },
                "visibility": "internal"
              }
            ],
            "name": "Fee",
            "nameLocation": "1157:3:85",
            "nodeType": "StructDefinition",
            "scope": 17536,
            "src": "1150:101:85",
            "visibility": "public"
          },
          {
            "anonymous": false,
            "id": 17106,
            "name": "FeeOracleAddressSet",
            "nameLocation": "1263:19:85",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 17105,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17104,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "feeOracleAddress",
                  "nameLocation": "1294:16:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17106,
                  "src": "1283:27:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_TwapOracle_$18079",
                    "typeString": "contract TwapOracle"
                  },
                  "typeName": {
                    "id": 17103,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 17102,
                      "name": "TwapOracle",
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 18079,
                      "src": "1283:10:85"
                    },
                    "referencedDeclaration": 18079,
                    "src": "1283:10:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TwapOracle_$18079",
                      "typeString": "contract TwapOracle"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1282:29:85"
            },
            "src": "1257:55:85"
          },
          {
            "anonymous": false,
            "id": 17110,
            "name": "FeePropertySet",
            "nameLocation": "1323:14:85",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 17109,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17108,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "gasUsed",
                  "nameLocation": "1345:7:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17110,
                  "src": "1338:14:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 17107,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1338:6:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1337:16:85"
            },
            "src": "1317:37:85"
          },
          {
            "anonymous": false,
            "id": 17116,
            "name": "GasPriceSet",
            "nameLocation": "1365:11:85",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 17115,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17112,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "1383:19:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17116,
                  "src": "1377:25:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17111,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "1377:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17114,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "gasPrice",
                  "nameLocation": "1412:8:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17116,
                  "src": "1404:16:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 17113,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1404:7:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1376:45:85"
            },
            "src": "1359:63:85"
          },
          {
            "anonymous": false,
            "id": 17122,
            "name": "WrapTokenAddressSet",
            "nameLocation": "1433:19:85",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 17121,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17118,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "1459:19:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17122,
                  "src": "1453:25:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17117,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "1453:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17120,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "wrapTokenAddress",
                  "nameLocation": "1488:16:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17122,
                  "src": "1480:24:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17119,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1480:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1452:53:85"
            },
            "src": "1427:79:85"
          },
          {
            "id": 17126,
            "name": "IncorrectFeeSupplied",
            "nameLocation": "1518:20:85",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 17125,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17124,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 17126,
                  "src": "1539:7:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 17123,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1539:7:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1538:9:85"
            },
            "src": "1512:36:85"
          },
          {
            "id": 17128,
            "name": "IncorrectPrice",
            "nameLocation": "1559:14:85",
            "nodeType": "ErrorDefinition",
            "parameters": {
              "id": 17127,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1573:2:85"
            },
            "src": "1553:23:85"
          },
          {
            "body": {
              "id": 17140,
              "nodeType": "Block",
              "src": "1603:110:85",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 17132,
                            "name": "DEFAULT_ADMIN_ROLE",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18344,
                            "src": "1629:18:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          {
                            "expression": {
                              "id": 17133,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4294967281,
                              "src": "1649:3:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 17134,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "src": "1649:10:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 17131,
                          "name": "hasRole",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18381,
                          "src": "1621:7:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_address_$returns$_t_bool_$",
                            "typeString": "function (bytes32,address) view returns (bool)"
                          }
                        },
                        "id": 17135,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1621:39:85",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "73656e64657220646f65736e277420686176652061646d696e20726f6c65",
                        "id": 17136,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1662:32:85",
                        "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": 17130,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "1613:7:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 17137,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1613:82:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17138,
                  "nodeType": "ExpressionStatement",
                  "src": "1613:82:85"
                },
                {
                  "id": 17139,
                  "nodeType": "PlaceholderStatement",
                  "src": "1705:1:85"
                }
              ]
            },
            "id": 17141,
            "name": "onlyAdmin",
            "nameLocation": "1591:9:85",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 17129,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1600:2:85"
            },
            "src": "1582:131:85",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 17147,
              "nodeType": "Block",
              "src": "1749:49:85",
              "statements": [
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 17143,
                      "name": "_onlyBridgeOrRouter",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17165,
                      "src": "1759:19:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$__$returns$__$",
                        "typeString": "function () view"
                      }
                    },
                    "id": 17144,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1759:21:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17145,
                  "nodeType": "ExpressionStatement",
                  "src": "1759:21:85"
                },
                {
                  "id": 17146,
                  "nodeType": "PlaceholderStatement",
                  "src": "1790:1:85"
                }
              ]
            },
            "id": 17148,
            "name": "onlyBridgeOrRouter",
            "nameLocation": "1728:18:85",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 17142,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1746:2:85"
            },
            "src": "1719:79:85",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 17164,
              "nodeType": "Block",
              "src": "1848:178:85",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 17160,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 17155,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 17152,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4294967281,
                              "src": "1879:3:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 17153,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "src": "1879:10:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "id": 17154,
                            "name": "_bridgeAddress",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17070,
                            "src": "1893:14:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "1879:28:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "||",
                        "rightExpression": {
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 17159,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 17156,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4294967281,
                              "src": "1911:3:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 17157,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "src": "1911:10:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "id": 17158,
                            "name": "_feeHandlerRouterAddress",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17072,
                            "src": "1925:24:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "1911:38:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "1879:70:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "73656e646572206d75737420626520627269646765206f722066656520726f7574657220636f6e7472616374",
                        "id": 17161,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1963:46:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_0e421896d469e70aea183401bab489f45e95ec1e32ec153a2e00f0f7d7b945ab",
                          "typeString": "literal_string \"sender must be bridge or fee router contract\""
                        },
                        "value": "sender must be bridge or fee router contract"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_0e421896d469e70aea183401bab489f45e95ec1e32ec153a2e00f0f7d7b945ab",
                          "typeString": "literal_string \"sender must be bridge or fee router contract\""
                        }
                      ],
                      "id": 17151,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "1858:7:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 17162,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1858:161:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17163,
                  "nodeType": "ExpressionStatement",
                  "src": "1858:161:85"
                }
              ]
            },
            "id": 17165,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_onlyBridgeOrRouter",
            "nameLocation": "1813:19:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17149,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1832:2:85"
            },
            "returnParameters": {
              "id": 17150,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1848:0:85"
            },
            "scope": 17536,
            "src": "1804:222:85",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          },
          {
            "body": {
              "id": 17187,
              "nodeType": "Block",
              "src": "2290:159:85",
              "statements": [
                {
                  "expression": {
                    "id": 17175,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 17173,
                      "name": "_bridgeAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17070,
                      "src": "2300:14:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17174,
                      "name": "bridgeAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17168,
                      "src": "2317:13:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "2300:30:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 17176,
                  "nodeType": "ExpressionStatement",
                  "src": "2300:30:85"
                },
                {
                  "expression": {
                    "id": 17179,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 17177,
                      "name": "_feeHandlerRouterAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17072,
                      "src": "2340:24:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17178,
                      "name": "feeHandlerRouterAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17170,
                      "src": "2367:23:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "2340:50:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 17180,
                  "nodeType": "ExpressionStatement",
                  "src": "2340:50:85"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 17182,
                        "name": "DEFAULT_ADMIN_ROLE",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18344,
                        "src": "2411:18:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "expression": {
                          "id": 17183,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4294967281,
                          "src": "2431:3:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 17184,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "2431:10:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 17181,
                      "name": "_setupRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18547,
                      "src": "2400:10:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 17185,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2400:42:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17186,
                  "nodeType": "ExpressionStatement",
                  "src": "2400:42:85"
                }
              ]
            },
            "documentation": {
              "id": 17166,
              "nodeType": "StructuredDocumentation",
              "src": "2032:185:85",
              "text": "@param bridgeAddress Contract address of previously deployed Bridge.\n@param feeHandlerRouterAddress Contract address of previously deployed FeeHandlerRouter."
            },
            "id": 17188,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17171,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17168,
                  "mutability": "mutable",
                  "name": "bridgeAddress",
                  "nameLocation": "2242:13:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17188,
                  "src": "2234:21:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17167,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2234:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17170,
                  "mutability": "mutable",
                  "name": "feeHandlerRouterAddress",
                  "nameLocation": "2265:23:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17188,
                  "src": "2257:31:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17169,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2257:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2233:56:85"
            },
            "returnParameters": {
              "id": 17172,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2290:0:85"
            },
            "scope": 17536,
            "src": "2222:227:85",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              18264
            ],
            "body": {
              "id": 17197,
              "nodeType": "Block",
              "src": "2595:30:85",
              "statements": [
                {
                  "expression": {
                    "hexValue": "74776170",
                    "id": 17195,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "2612:6:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_9294e743cfa74bb19889de64df8402afca751b12255b896d7c973195ea70037d",
                      "typeString": "literal_string \"twap\""
                    },
                    "value": "twap"
                  },
                  "functionReturnParameters": 17194,
                  "id": 17196,
                  "nodeType": "Return",
                  "src": "2605:13:85"
                }
              ]
            },
            "documentation": {
              "id": 17189,
              "nodeType": "StructuredDocumentation",
              "src": "2455:64:85",
              "text": "@notice Getter function for fee handler type"
            },
            "functionSelector": "542774b5",
            "id": 17198,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "feeHandlerType",
            "nameLocation": "2533:14:85",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 17191,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2557:8:85"
            },
            "parameters": {
              "id": 17190,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2547:2:85"
            },
            "returnParameters": {
              "id": 17194,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17193,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 17198,
                  "src": "2580:13:85",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 17192,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2580:6:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2579:15:85"
            },
            "scope": 17536,
            "src": "2524:101:85",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 17226,
              "nodeType": "Block",
              "src": "2952:209:85",
              "statements": [
                {
                  "assignments": [
                    17205
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 17205,
                      "mutability": "mutable",
                      "name": "sender",
                      "nameLocation": "2970:6:85",
                      "nodeType": "VariableDeclaration",
                      "scope": 17226,
                      "src": "2962:14:85",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 17204,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "2962:7:85",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 17208,
                  "initialValue": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 17206,
                      "name": "_msgSender",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5295,
                      "src": "2979:10:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                        "typeString": "function () view returns (address)"
                      }
                    },
                    "id": 17207,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2979:12:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2962:29:85"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 17212,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 17210,
                          "name": "sender",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17205,
                          "src": "3009:6:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "id": 17211,
                          "name": "newAdmin",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17201,
                          "src": "3019:8:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "3009:18:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "43616e6e6f742072656e6f756e6365206f6e6573656c66",
                        "id": 17213,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3029:25:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_ab1c5f98bafd089c448d0f437f7951a06dfd484be68434b4420ed4d39647c206",
                          "typeString": "literal_string \"Cannot renounce oneself\""
                        },
                        "value": "Cannot renounce oneself"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_ab1c5f98bafd089c448d0f437f7951a06dfd484be68434b4420ed4d39647c206",
                          "typeString": "literal_string \"Cannot renounce oneself\""
                        }
                      ],
                      "id": 17209,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "3001:7:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 17214,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3001:54:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17215,
                  "nodeType": "ExpressionStatement",
                  "src": "3001:54:85"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 17217,
                        "name": "DEFAULT_ADMIN_ROLE",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18344,
                        "src": "3075:18:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 17218,
                        "name": "newAdmin",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17201,
                        "src": "3095:8:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 17216,
                      "name": "grantRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18485,
                      "src": "3065:9:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 17219,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3065:39:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17220,
                  "nodeType": "ExpressionStatement",
                  "src": "3065:39:85"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 17222,
                        "name": "DEFAULT_ADMIN_ROLE",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18344,
                        "src": "3127:18:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 17223,
                        "name": "sender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17205,
                        "src": "3147:6:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 17221,
                      "name": "renounceRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18533,
                      "src": "3114:12:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 17224,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3114:40:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17225,
                  "nodeType": "ExpressionStatement",
                  "src": "3114:40:85"
                }
              ]
            },
            "documentation": {
              "id": 17199,
              "nodeType": "StructuredDocumentation",
              "src": "2655:242:85",
              "text": "@notice Removes admin role from {_msgSender()} and grants it to {newAdmin}.\n@notice Only callable by an address that currently has the admin role.\n@param newAdmin Address that admin role will be granted to."
            },
            "functionSelector": "5e1fab0f",
            "id": 17227,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "renounceAdmin",
            "nameLocation": "2911:13:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17202,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17201,
                  "mutability": "mutable",
                  "name": "newAdmin",
                  "nameLocation": "2933:8:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17227,
                  "src": "2925:16:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17200,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2925:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2924:18:85"
            },
            "returnParameters": {
              "id": 17203,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2952:0:85"
            },
            "scope": 17536,
            "src": "2902:259:85",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 17244,
              "nodeType": "Block",
              "src": "3371:92:85",
              "statements": [
                {
                  "expression": {
                    "id": 17238,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 17236,
                      "name": "twapOracle",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17075,
                      "src": "3381:10:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_TwapOracle_$18079",
                        "typeString": "contract TwapOracle"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17237,
                      "name": "oracleAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17231,
                      "src": "3394:13:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_TwapOracle_$18079",
                        "typeString": "contract TwapOracle"
                      }
                    },
                    "src": "3381:26:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TwapOracle_$18079",
                      "typeString": "contract TwapOracle"
                    }
                  },
                  "id": 17239,
                  "nodeType": "ExpressionStatement",
                  "src": "3381:26:85"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 17241,
                        "name": "oracleAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17231,
                        "src": "3442:13:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TwapOracle_$18079",
                          "typeString": "contract TwapOracle"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_TwapOracle_$18079",
                          "typeString": "contract TwapOracle"
                        }
                      ],
                      "id": 17240,
                      "name": "FeeOracleAddressSet",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17106,
                      "src": "3422:19:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_contract$_TwapOracle_$18079_$returns$__$",
                        "typeString": "function (contract TwapOracle)"
                      }
                    },
                    "id": 17242,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3422:34:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17243,
                  "nodeType": "EmitStatement",
                  "src": "3417:39:85"
                }
              ]
            },
            "documentation": {
              "id": 17228,
              "nodeType": "StructuredDocumentation",
              "src": "3167:132:85",
              "text": "@notice Sets the fee oracle address for signature verification.\n@param oracleAddress Fee oracle address."
            },
            "functionSelector": "a8a98962",
            "id": 17245,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 17234,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 17233,
                  "name": "onlyAdmin",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 17141,
                  "src": "3361:9:85"
                },
                "nodeType": "ModifierInvocation",
                "src": "3361:9:85"
              }
            ],
            "name": "setFeeOracle",
            "nameLocation": "3313:12:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17232,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17231,
                  "mutability": "mutable",
                  "name": "oracleAddress",
                  "nameLocation": "3337:13:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17245,
                  "src": "3326:24:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_TwapOracle_$18079",
                    "typeString": "contract TwapOracle"
                  },
                  "typeName": {
                    "id": 17230,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 17229,
                      "name": "TwapOracle",
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 18079,
                      "src": "3326:10:85"
                    },
                    "referencedDeclaration": 18079,
                    "src": "3326:10:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TwapOracle_$18079",
                      "typeString": "contract TwapOracle"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3325:26:85"
            },
            "returnParameters": {
              "id": 17235,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3371:0:85"
            },
            "scope": 17536,
            "src": "3304:159:85",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 17286,
              "nodeType": "Block",
              "src": "4187:253:85",
              "statements": [
                {
                  "expression": {
                    "id": 17265,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 17260,
                          "name": "destinationFee",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17089,
                          "src": "4197:14:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_uint8_$_t_struct$_Fee_$17101_storage_$",
                            "typeString": "mapping(uint8 => struct TwapFeeHandler.Fee storage ref)"
                          }
                        },
                        "id": 17262,
                        "indexExpression": {
                          "id": 17261,
                          "name": "destinationDomainID",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17248,
                          "src": "4212:19:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "4197:35:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Fee_$17101_storage",
                          "typeString": "struct TwapFeeHandler.Fee storage ref"
                        }
                      },
                      "id": 17263,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "gasPrice",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 17095,
                      "src": "4197:44:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17264,
                      "name": "gasPrice",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17250,
                      "src": "4244:8:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "4197:55:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 17266,
                  "nodeType": "ExpressionStatement",
                  "src": "4197:55:85"
                },
                {
                  "expression": {
                    "id": 17272,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 17267,
                          "name": "destinationFee",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17089,
                          "src": "4262:14:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_uint8_$_t_struct$_Fee_$17101_storage_$",
                            "typeString": "mapping(uint8 => struct TwapFeeHandler.Fee storage ref)"
                          }
                        },
                        "id": 17269,
                        "indexExpression": {
                          "id": 17268,
                          "name": "destinationDomainID",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17248,
                          "src": "4277:19:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "4262:35:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Fee_$17101_storage",
                          "typeString": "struct TwapFeeHandler.Fee storage ref"
                        }
                      },
                      "id": 17270,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "feeType",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 17098,
                      "src": "4262:43:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_enum$_ProtocolFeeType_$17093",
                        "typeString": "enum TwapFeeHandler.ProtocolFeeType"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17271,
                      "name": "feeType",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17253,
                      "src": "4308:7:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_enum$_ProtocolFeeType_$17093",
                        "typeString": "enum TwapFeeHandler.ProtocolFeeType"
                      }
                    },
                    "src": "4262:53:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_enum$_ProtocolFeeType_$17093",
                      "typeString": "enum TwapFeeHandler.ProtocolFeeType"
                    }
                  },
                  "id": 17273,
                  "nodeType": "ExpressionStatement",
                  "src": "4262:53:85"
                },
                {
                  "expression": {
                    "id": 17279,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 17274,
                          "name": "destinationFee",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17089,
                          "src": "4325:14:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_uint8_$_t_struct$_Fee_$17101_storage_$",
                            "typeString": "mapping(uint8 => struct TwapFeeHandler.Fee storage ref)"
                          }
                        },
                        "id": 17276,
                        "indexExpression": {
                          "id": 17275,
                          "name": "destinationDomainID",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17248,
                          "src": "4340:19:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "4325:35:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Fee_$17101_storage",
                          "typeString": "struct TwapFeeHandler.Fee storage ref"
                        }
                      },
                      "id": 17277,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "amount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 17100,
                      "src": "4325:42:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint248",
                        "typeString": "uint248"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17278,
                      "name": "amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17255,
                      "src": "4370:6:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint248",
                        "typeString": "uint248"
                      }
                    },
                    "src": "4325:51:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint248",
                      "typeString": "uint248"
                    }
                  },
                  "id": 17280,
                  "nodeType": "ExpressionStatement",
                  "src": "4325:51:85"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 17282,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17248,
                        "src": "4403:19:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 17283,
                        "name": "gasPrice",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17250,
                        "src": "4424:8:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 17281,
                      "name": "GasPriceSet",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17116,
                      "src": "4391:11:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_uint8_$_t_uint256_$returns$__$",
                        "typeString": "function (uint8,uint256)"
                      }
                    },
                    "id": 17284,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4391:42:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17285,
                  "nodeType": "EmitStatement",
                  "src": "4386:47:85"
                }
              ]
            },
            "documentation": {
              "id": 17246,
              "nodeType": "StructuredDocumentation",
              "src": "3469:587:85",
              "text": "@notice Sets the gas price for destination chain.\n@param destinationDomainID ID of destination chain.\n@param gasPrice Gas price of destination chain.\n@param feeType Type of fee that can be set (fixed/percentage).\n\"0\" => execution cost\n\"1\" => execution cost + protocol fee (fixed fee)\n\"2\" => execution cost + protocol fee (percentage fee)\n@param amount Fee amount that should be additional charged on top of\nexecution cost (fixed native token amount/percentage of execution cost)."
            },
            "functionSelector": "00b9558b",
            "id": 17287,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 17258,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 17257,
                  "name": "onlyAdmin",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 17141,
                  "src": "4177:9:85"
                },
                "nodeType": "ModifierInvocation",
                "src": "4177:9:85"
              }
            ],
            "name": "setGasPrice",
            "nameLocation": "4070:11:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17256,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17248,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "4088:19:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17287,
                  "src": "4082:25:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17247,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "4082:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17250,
                  "mutability": "mutable",
                  "name": "gasPrice",
                  "nameLocation": "4117:8:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17287,
                  "src": "4109:16:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 17249,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4109:7:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17253,
                  "mutability": "mutable",
                  "name": "feeType",
                  "nameLocation": "4143:7:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17287,
                  "src": "4127:23:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_enum$_ProtocolFeeType_$17093",
                    "typeString": "enum TwapFeeHandler.ProtocolFeeType"
                  },
                  "typeName": {
                    "id": 17252,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 17251,
                      "name": "ProtocolFeeType",
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 17093,
                      "src": "4127:15:85"
                    },
                    "referencedDeclaration": 17093,
                    "src": "4127:15:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_enum$_ProtocolFeeType_$17093",
                      "typeString": "enum TwapFeeHandler.ProtocolFeeType"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17255,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "4160:6:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17287,
                  "src": "4152:14:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint248",
                    "typeString": "uint248"
                  },
                  "typeName": {
                    "id": 17254,
                    "name": "uint248",
                    "nodeType": "ElementaryTypeName",
                    "src": "4152:7:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint248",
                      "typeString": "uint248"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4081:86:85"
            },
            "returnParameters": {
              "id": 17259,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4187:0:85"
            },
            "scope": 17536,
            "src": "4061:379:85",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 17308,
              "nodeType": "Block",
              "src": "4749:141:85",
              "statements": [
                {
                  "expression": {
                    "id": 17301,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 17297,
                        "name": "destinationNativeCoinWrap",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17084,
                        "src": "4759:25:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint8_$_t_address_$",
                          "typeString": "mapping(uint8 => address)"
                        }
                      },
                      "id": 17299,
                      "indexExpression": {
                        "id": 17298,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17290,
                        "src": "4785:19:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "4759:46:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17300,
                      "name": "wrapToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17292,
                      "src": "4808:9:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "4759:58:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 17302,
                  "nodeType": "ExpressionStatement",
                  "src": "4759:58:85"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 17304,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17290,
                        "src": "4852:19:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 17305,
                        "name": "wrapToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17292,
                        "src": "4873:9:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 17303,
                      "name": "WrapTokenAddressSet",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17122,
                      "src": "4832:19:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_uint8_$_t_address_$returns$__$",
                        "typeString": "function (uint8,address)"
                      }
                    },
                    "id": 17306,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4832:51:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17307,
                  "nodeType": "EmitStatement",
                  "src": "4827:56:85"
                }
              ]
            },
            "documentation": {
              "id": 17288,
              "nodeType": "StructuredDocumentation",
              "src": "4446:204:85",
              "text": "@notice Sets the wrap token address for destination chain.\n@param destinationDomainID ID of destination chain.\n@param wrapToken Wrap token address of destination chain."
            },
            "functionSelector": "e0d0b441",
            "id": 17309,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 17295,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 17294,
                  "name": "onlyAdmin",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 17141,
                  "src": "4739:9:85"
                },
                "nodeType": "ModifierInvocation",
                "src": "4739:9:85"
              }
            ],
            "name": "setWrapTokenAddress",
            "nameLocation": "4664:19:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17293,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17290,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "4690:19:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17309,
                  "src": "4684:25:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17289,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "4684:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17292,
                  "mutability": "mutable",
                  "name": "wrapToken",
                  "nameLocation": "4719:9:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17309,
                  "src": "4711:17:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17291,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4711:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4683:46:85"
            },
            "returnParameters": {
              "id": 17296,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4749:0:85"
            },
            "scope": 17536,
            "src": "4655:235:85",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 17321,
              "nodeType": "Block",
              "src": "5097:43:85",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 17318,
                        "name": "gasUsed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17312,
                        "src": "5125:7:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      ],
                      "id": 17317,
                      "name": "_setFeeProperties",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17336,
                      "src": "5107:17:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_uint32_$returns$__$",
                        "typeString": "function (uint32)"
                      }
                    },
                    "id": 17319,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5107:26:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17320,
                  "nodeType": "ExpressionStatement",
                  "src": "5107:26:85"
                }
              ]
            },
            "documentation": {
              "id": 17310,
              "nodeType": "StructuredDocumentation",
              "src": "4896:135:85",
              "text": "@notice Sets the fee properties.\n@param gasUsed Default gas used for proposal execution in the destination."
            },
            "functionSelector": "96a32073",
            "id": 17322,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 17315,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 17314,
                  "name": "onlyAdmin",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 17141,
                  "src": "5087:9:85"
                },
                "nodeType": "ModifierInvocation",
                "src": "5087:9:85"
              }
            ],
            "name": "setFeeProperties",
            "nameLocation": "5045:16:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17313,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17312,
                  "mutability": "mutable",
                  "name": "gasUsed",
                  "nameLocation": "5069:7:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17322,
                  "src": "5062:14:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 17311,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5062:6:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5061:16:85"
            },
            "returnParameters": {
              "id": 17316,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5097:0:85"
            },
            "scope": 17536,
            "src": "5036:104:85",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 17335,
              "nodeType": "Block",
              "src": "5198:73:85",
              "statements": [
                {
                  "expression": {
                    "id": 17329,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 17327,
                      "name": "_gasUsed",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17080,
                      "src": "5208:8:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17328,
                      "name": "gasUsed",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17324,
                      "src": "5219:7:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "src": "5208:18:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "id": 17330,
                  "nodeType": "ExpressionStatement",
                  "src": "5208:18:85"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 17332,
                        "name": "gasUsed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17324,
                        "src": "5256:7:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      ],
                      "id": 17331,
                      "name": "FeePropertySet",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17110,
                      "src": "5241:14:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_uint32_$returns$__$",
                        "typeString": "function (uint32)"
                      }
                    },
                    "id": 17333,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5241:23:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17334,
                  "nodeType": "EmitStatement",
                  "src": "5236:28:85"
                }
              ]
            },
            "id": 17336,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_setFeeProperties",
            "nameLocation": "5155:17:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17325,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17324,
                  "mutability": "mutable",
                  "name": "gasUsed",
                  "nameLocation": "5180:7:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17336,
                  "src": "5173:14:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 17323,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5173:6:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5172:16:85"
            },
            "returnParameters": {
              "id": 17326,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5198:0:85"
            },
            "scope": 17536,
            "src": "5146:125:85",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              18238
            ],
            "body": {
              "id": 17413,
              "nodeType": "Block",
              "src": "5902:502:85",
              "statements": [
                {
                  "assignments": [
                    17355,
                    null
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 17355,
                      "mutability": "mutable",
                      "name": "fee",
                      "nameLocation": "5921:3:85",
                      "nodeType": "VariableDeclaration",
                      "scope": 17413,
                      "src": "5913:11:85",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 17354,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "5913:7:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    },
                    null
                  ],
                  "id": 17364,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 17357,
                        "name": "sender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17339,
                        "src": "5944:6:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 17358,
                        "name": "fromDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17341,
                        "src": "5952:12:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 17359,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17343,
                        "src": "5966:19:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 17360,
                        "name": "resourceID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17345,
                        "src": "5987:10:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 17361,
                        "name": "depositData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17347,
                        "src": "5999:11:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      },
                      {
                        "id": 17362,
                        "name": "feeData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17349,
                        "src": "6012:7:85",
                        "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"
                        }
                      ],
                      "id": 17356,
                      "name": "_calculateFee",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17463,
                      "src": "5930:13:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint8_$_t_uint8_$_t_bytes32_$_t_bytes_calldata_ptr_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_address_$",
                        "typeString": "function (address,uint8,uint8,bytes32,bytes calldata,bytes calldata) view returns (uint256,address)"
                      }
                    },
                    "id": 17363,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5930:90:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_uint256_$_t_address_$",
                      "typeString": "tuple(uint256,address)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5912:108:85"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 17368,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 17365,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4294967281,
                        "src": "6034:3:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 17366,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "value",
                      "nodeType": "MemberAccess",
                      "src": "6034:9:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "id": 17367,
                      "name": "fee",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17355,
                      "src": "6046:3:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "6034:15:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 17374,
                  "nodeType": "IfStatement",
                  "src": "6030:59:85",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [
                        {
                          "expression": {
                            "id": 17370,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4294967281,
                            "src": "6079:3:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 17371,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "value",
                          "nodeType": "MemberAccess",
                          "src": "6079:9:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "id": 17369,
                        "name": "IncorrectFeeSupplied",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17126,
                        "src": "6058:20:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$_t_uint256_$returns$__$",
                          "typeString": "function (uint256) pure"
                        }
                      },
                      "id": 17372,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "6058:31:85",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_tuple$__$",
                        "typeString": "tuple()"
                      }
                    },
                    "id": 17373,
                    "nodeType": "RevertStatement",
                    "src": "6051:38:85"
                  }
                },
                {
                  "assignments": [
                    17376
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 17376,
                      "mutability": "mutable",
                      "name": "remaining",
                      "nameLocation": "6107:9:85",
                      "nodeType": "VariableDeclaration",
                      "scope": 17413,
                      "src": "6099:17:85",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 17375,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "6099:7:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 17381,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 17380,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 17377,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4294967281,
                        "src": "6119:3:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 17378,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "value",
                      "nodeType": "MemberAccess",
                      "src": "6119:9:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "-",
                    "rightExpression": {
                      "id": 17379,
                      "name": "fee",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17355,
                      "src": "6131:3:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "6119:15:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "6099:35:85"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 17384,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 17382,
                      "name": "remaining",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17376,
                      "src": "6148:9:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 17383,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "6161:1:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "6148:14:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 17400,
                  "nodeType": "IfStatement",
                  "src": "6144:155:85",
                  "trueBody": {
                    "id": 17399,
                    "nodeType": "Block",
                    "src": "6164:135:85",
                    "statements": [
                      {
                        "assignments": [
                          17386,
                          null
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 17386,
                            "mutability": "mutable",
                            "name": "sent",
                            "nameLocation": "6184:4:85",
                            "nodeType": "VariableDeclaration",
                            "scope": 17399,
                            "src": "6179:9:85",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 17385,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "6179:4:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "visibility": "internal"
                          },
                          null
                        ],
                        "id": 17393,
                        "initialValue": {
                          "arguments": [
                            {
                              "hexValue": "",
                              "id": 17391,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6224:2:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                "typeString": "literal_string \"\""
                              },
                              "value": ""
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                "typeString": "literal_string \"\""
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                  "typeString": "literal_string \"\""
                                }
                              ],
                              "expression": {
                                "id": 17387,
                                "name": "sender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 17339,
                                "src": "6194:6:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 17388,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "call",
                              "nodeType": "MemberAccess",
                              "src": "6194:11:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                              }
                            },
                            "id": 17390,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "names": [
                              "value"
                            ],
                            "nodeType": "FunctionCallOptions",
                            "options": [
                              {
                                "id": 17389,
                                "name": "remaining",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 17376,
                                "src": "6213:9:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "src": "6194:29:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value",
                              "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                            }
                          },
                          "id": 17392,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6194:33:85",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "6178:49:85"
                      },
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 17395,
                              "name": "sent",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 17386,
                              "src": "6249:4:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "hexValue": "4661696c656420746f2073656e642072656d61696e696e67204574686572",
                              "id": 17396,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6255:32:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_fa207173f56547efb95af4cef634dbfa0d7f314b8618baeae97339d76512f226",
                                "typeString": "literal_string \"Failed to send remaining Ether\""
                              },
                              "value": "Failed to send remaining Ether"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_fa207173f56547efb95af4cef634dbfa0d7f314b8618baeae97339d76512f226",
                                "typeString": "literal_string \"Failed to send remaining Ether\""
                              }
                            ],
                            "id": 17394,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              4294967278,
                              4294967278
                            ],
                            "referencedDeclaration": 4294967278,
                            "src": "6241:7:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 17397,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6241:47:85",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17398,
                        "nodeType": "ExpressionStatement",
                        "src": "6241:47:85"
                      }
                    ]
                  }
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 17402,
                        "name": "sender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17339,
                        "src": "6326:6:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 17403,
                        "name": "fromDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17341,
                        "src": "6334:12:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 17404,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17343,
                        "src": "6348:19:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 17405,
                        "name": "resourceID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17345,
                        "src": "6369:10:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 17406,
                        "name": "fee",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17355,
                        "src": "6381:3:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "hexValue": "30",
                            "id": 17409,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "6394:1:85",
                            "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": 17408,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "6386:7:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 17407,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "6386:7:85",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 17410,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "6386:10:85",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 17401,
                      "name": "FeeCollected",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18213,
                      "src": "6313:12:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint8_$_t_uint8_$_t_bytes32_$_t_uint256_$_t_address_$returns$__$",
                        "typeString": "function (address,uint8,uint8,bytes32,uint256,address)"
                      }
                    },
                    "id": 17411,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6313:84:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17412,
                  "nodeType": "EmitStatement",
                  "src": "6308:89:85"
                }
              ]
            },
            "documentation": {
              "id": 17337,
              "nodeType": "StructuredDocumentation",
              "src": "5277:429:85",
              "text": "@notice Collects fee for deposit.\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 about the deposit.\n@param feeData Additional data to be passed to the fee handler."
            },
            "functionSelector": "25307065",
            "id": 17414,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 17352,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 17351,
                  "name": "onlyBridgeOrRouter",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 17148,
                  "src": "5883:18:85"
                },
                "nodeType": "ModifierInvocation",
                "src": "5883:18:85"
              }
            ],
            "name": "collectFee",
            "nameLocation": "5720:10:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17350,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17339,
                  "mutability": "mutable",
                  "name": "sender",
                  "nameLocation": "5739:6:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17414,
                  "src": "5731:14:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17338,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5731:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17341,
                  "mutability": "mutable",
                  "name": "fromDomainID",
                  "nameLocation": "5753:12:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17414,
                  "src": "5747:18:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17340,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "5747:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17343,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "5773:19:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17414,
                  "src": "5767:25:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17342,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "5767:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17345,
                  "mutability": "mutable",
                  "name": "resourceID",
                  "nameLocation": "5802:10:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17414,
                  "src": "5794:18:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 17344,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5794:7:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17347,
                  "mutability": "mutable",
                  "name": "depositData",
                  "nameLocation": "5829:11:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17414,
                  "src": "5814:26:85",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 17346,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "5814:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17349,
                  "mutability": "mutable",
                  "name": "feeData",
                  "nameLocation": "5857:7:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17414,
                  "src": "5842:22:85",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 17348,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "5842:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5730:135:85"
            },
            "returnParameters": {
              "id": 17353,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5902:0:85"
            },
            "scope": 17536,
            "src": "5711:693:85",
            "stateMutability": "payable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              18258
            ],
            "body": {
              "id": 17443,
              "nodeType": "Block",
              "src": "7186:114:85",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 17435,
                        "name": "sender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17417,
                        "src": "7217:6:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 17436,
                        "name": "fromDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17419,
                        "src": "7225:12:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 17437,
                        "name": "destinationDomainID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17421,
                        "src": "7239:19:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 17438,
                        "name": "resourceID",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17423,
                        "src": "7260:10:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 17439,
                        "name": "depositData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17425,
                        "src": "7272:11:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      },
                      {
                        "id": 17440,
                        "name": "feeData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17427,
                        "src": "7285:7:85",
                        "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"
                        }
                      ],
                      "id": 17434,
                      "name": "_calculateFee",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17463,
                      "src": "7203:13:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint8_$_t_uint8_$_t_bytes32_$_t_bytes_calldata_ptr_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_address_$",
                        "typeString": "function (address,uint8,uint8,bytes32,bytes calldata,bytes calldata) view returns (uint256,address)"
                      }
                    },
                    "id": 17441,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7203:90:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_uint256_$_t_address_$",
                      "typeString": "tuple(uint256,address)"
                    }
                  },
                  "functionReturnParameters": 17433,
                  "id": 17442,
                  "nodeType": "Return",
                  "src": "7196:97:85"
                }
              ]
            },
            "documentation": {
              "id": 17415,
              "nodeType": "StructuredDocumentation",
              "src": "6410:557:85",
              "text": "@notice Calculates fee for deposit.\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 about the deposit.\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": 17444,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "calculateFee",
            "nameLocation": "6981:12:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17428,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17417,
                  "mutability": "mutable",
                  "name": "sender",
                  "nameLocation": "7002:6:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17444,
                  "src": "6994:14:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17416,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6994:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17419,
                  "mutability": "mutable",
                  "name": "fromDomainID",
                  "nameLocation": "7016:12:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17444,
                  "src": "7010:18:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17418,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "7010:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17421,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "7036:19:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17444,
                  "src": "7030:25:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17420,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "7030:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17423,
                  "mutability": "mutable",
                  "name": "resourceID",
                  "nameLocation": "7065:10:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17444,
                  "src": "7057:18:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 17422,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "7057:7:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17425,
                  "mutability": "mutable",
                  "name": "depositData",
                  "nameLocation": "7092:11:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17444,
                  "src": "7077:26:85",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 17424,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "7077:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17427,
                  "mutability": "mutable",
                  "name": "feeData",
                  "nameLocation": "7120:7:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17444,
                  "src": "7105:22:85",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 17426,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "7105:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6993:135:85"
            },
            "returnParameters": {
              "id": 17433,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17430,
                  "mutability": "mutable",
                  "name": "fee",
                  "nameLocation": "7159:3:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17444,
                  "src": "7151:11:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 17429,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7151:7:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17432,
                  "mutability": "mutable",
                  "name": "tokenAddress",
                  "nameLocation": "7172:12:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17444,
                  "src": "7164:20:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17431,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7164:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7150:35:85"
            },
            "scope": 17536,
            "src": "6972:328:85",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 17463,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "_calculateFee",
            "nameLocation": "7315:13:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17457,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17446,
                  "mutability": "mutable",
                  "name": "sender",
                  "nameLocation": "7337:6:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17463,
                  "src": "7329:14:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17445,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7329:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17448,
                  "mutability": "mutable",
                  "name": "fromDomainID",
                  "nameLocation": "7351:12:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17463,
                  "src": "7345:18:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17447,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "7345:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17450,
                  "mutability": "mutable",
                  "name": "destinationDomainID",
                  "nameLocation": "7371:19:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17463,
                  "src": "7365:25:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 17449,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "7365:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17452,
                  "mutability": "mutable",
                  "name": "resourceID",
                  "nameLocation": "7400:10:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17463,
                  "src": "7392:18:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 17451,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "7392:7:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17454,
                  "mutability": "mutable",
                  "name": "depositData",
                  "nameLocation": "7427:11:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17463,
                  "src": "7412:26:85",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 17453,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "7412:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17456,
                  "mutability": "mutable",
                  "name": "feeData",
                  "nameLocation": "7455:7:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17463,
                  "src": "7440:22:85",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 17455,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "7440:5:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7328:135:85"
            },
            "returnParameters": {
              "id": 17462,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17459,
                  "mutability": "mutable",
                  "name": "fee",
                  "nameLocation": "7502:3:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17463,
                  "src": "7494:11:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 17458,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7494:7:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17461,
                  "mutability": "mutable",
                  "name": "tokenAddress",
                  "nameLocation": "7515:12:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17463,
                  "src": "7507:20:85",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17460,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7507:7:85",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7493:35:85"
            },
            "scope": 17536,
            "src": "7306:223:85",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 17534,
              "nodeType": "Block",
              "src": "8018:386:85",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 17480,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "expression": {
                            "id": 17476,
                            "name": "addrs",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17467,
                            "src": "8036:5:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_payable_$dyn_calldata_ptr",
                              "typeString": "address payable[] calldata"
                            }
                          },
                          "id": 17477,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "src": "8036:12:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "expression": {
                            "id": 17478,
                            "name": "amounts",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17470,
                            "src": "8052:7:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                              "typeString": "uint256[] calldata"
                            }
                          },
                          "id": 17479,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "src": "8052:14:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "8036:30:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "61646472735b5d2c20616d6f756e74735b5d3a2064696666206c656e677468",
                        "id": 17481,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "8068:33:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_6294e89c3434efe3f2b9f4527205255a0d63a93ae07514ac7ac8f6435286aa9b",
                          "typeString": "literal_string \"addrs[], amounts[]: diff length\""
                        },
                        "value": "addrs[], amounts[]: diff length"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_6294e89c3434efe3f2b9f4527205255a0d63a93ae07514ac7ac8f6435286aa9b",
                          "typeString": "literal_string \"addrs[], amounts[]: diff length\""
                        }
                      ],
                      "id": 17475,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "8028:7:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 17482,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8028:74:85",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17483,
                  "nodeType": "ExpressionStatement",
                  "src": "8028:74:85"
                },
                {
                  "body": {
                    "id": 17532,
                    "nodeType": "Block",
                    "src": "8155:243:85",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "baseExpression": {
                                "id": 17495,
                                "name": "addrs",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 17467,
                                "src": "8169:5:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_address_payable_$dyn_calldata_ptr",
                                  "typeString": "address payable[] calldata"
                                }
                              },
                              "id": 17497,
                              "indexExpression": {
                                "id": 17496,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 17485,
                                "src": "8175:1:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "8169:8:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "id": 17498,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "mustNotBeZero",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 19136,
                            "src": "8169:22:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_address_$returns$_t_address_$bound_to$_t_address_$",
                              "typeString": "function (address) pure returns (address)"
                            }
                          },
                          "id": 17499,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8169:24:85",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 17500,
                        "nodeType": "ExpressionStatement",
                        "src": "8169:24:85"
                      },
                      {
                        "assignments": [
                          17502,
                          null
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 17502,
                            "mutability": "mutable",
                            "name": "success",
                            "nameLocation": "8213:7:85",
                            "nodeType": "VariableDeclaration",
                            "scope": 17532,
                            "src": "8208:12:85",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 17501,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "8208:4:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "visibility": "internal"
                          },
                          null
                        ],
                        "id": 17513,
                        "initialValue": {
                          "arguments": [
                            {
                              "hexValue": "",
                              "id": 17511,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8258:2:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                "typeString": "literal_string \"\""
                              },
                              "value": ""
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                "typeString": "literal_string \"\""
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                  "typeString": "literal_string \"\""
                                }
                              ],
                              "expression": {
                                "baseExpression": {
                                  "id": 17503,
                                  "name": "addrs",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17467,
                                  "src": "8225:5:85",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_address_payable_$dyn_calldata_ptr",
                                    "typeString": "address payable[] calldata"
                                  }
                                },
                                "id": 17505,
                                "indexExpression": {
                                  "id": 17504,
                                  "name": "i",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17485,
                                  "src": "8231:1:85",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "8225:8:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "id": 17506,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "call",
                              "nodeType": "MemberAccess",
                              "src": "8225:13:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                              }
                            },
                            "id": 17510,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "names": [
                              "value"
                            ],
                            "nodeType": "FunctionCallOptions",
                            "options": [
                              {
                                "baseExpression": {
                                  "id": 17507,
                                  "name": "amounts",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17470,
                                  "src": "8246:7:85",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                    "typeString": "uint256[] calldata"
                                  }
                                },
                                "id": 17509,
                                "indexExpression": {
                                  "id": 17508,
                                  "name": "i",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17485,
                                  "src": "8254:1:85",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "8246:10:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "src": "8225:32:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value",
                              "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                            }
                          },
                          "id": 17512,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8225:36:85",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "8207:54:85"
                      },
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 17515,
                              "name": "success",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 17502,
                              "src": "8283:7:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "hexValue": "466565206574686572207472616e73666572206661696c6564",
                              "id": 17516,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8292:27:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c83ea8d31d5b2432d5661a262a1c8abcb30052289f0faa441155730eeab43e0a",
                                "typeString": "literal_string \"Fee ether transfer failed\""
                              },
                              "value": "Fee ether transfer failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_c83ea8d31d5b2432d5661a262a1c8abcb30052289f0faa441155730eeab43e0a",
                                "typeString": "literal_string \"Fee ether transfer failed\""
                              }
                            ],
                            "id": 17514,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              4294967278,
                              4294967278
                            ],
                            "referencedDeclaration": 4294967278,
                            "src": "8275:7:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 17517,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8275:45:85",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17518,
                        "nodeType": "ExpressionStatement",
                        "src": "8275:45:85"
                      },
                      {
                        "eventCall": {
                          "arguments": [
                            {
                              "arguments": [
                                {
                                  "hexValue": "30",
                                  "id": 17522,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "8362:1:85",
                                  "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": 17521,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "8354:7:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 17520,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "8354:7:85",
                                  "typeDescriptions": {}
                                }
                              },
                              "id": 17523,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8354:10:85",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "baseExpression": {
                                "id": 17524,
                                "name": "addrs",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 17467,
                                "src": "8366:5:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_address_payable_$dyn_calldata_ptr",
                                  "typeString": "address payable[] calldata"
                                }
                              },
                              "id": 17526,
                              "indexExpression": {
                                "id": 17525,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 17485,
                                "src": "8372:1:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "8366:8:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "baseExpression": {
                                "id": 17527,
                                "name": "amounts",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 17470,
                                "src": "8376:7:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                  "typeString": "uint256[] calldata"
                                }
                              },
                              "id": 17529,
                              "indexExpression": {
                                "id": 17528,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 17485,
                                "src": "8384:1:85",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "8376:10:85",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 17519,
                            "name": "FeeDistributed",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18222,
                            "src": "8339:14:85",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 17530,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8339:48:85",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17531,
                        "nodeType": "EmitStatement",
                        "src": "8334:53:85"
                      }
                    ]
                  },
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 17491,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 17488,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17485,
                      "src": "8132:1:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "expression": {
                        "id": 17489,
                        "name": "addrs",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17467,
                        "src": "8136:5:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_payable_$dyn_calldata_ptr",
                          "typeString": "address payable[] calldata"
                        }
                      },
                      "id": 17490,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "8136:12:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "8132:16:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 17533,
                  "initializationExpression": {
                    "assignments": [
                      17485
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 17485,
                        "mutability": "mutable",
                        "name": "i",
                        "nameLocation": "8125:1:85",
                        "nodeType": "VariableDeclaration",
                        "scope": 17533,
                        "src": "8117:9:85",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17484,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8117:7:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "visibility": "internal"
                      }
                    ],
                    "id": 17487,
                    "initialValue": {
                      "hexValue": "30",
                      "id": 17486,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "8129:1:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "8117:13:85"
                  },
                  "loopExpression": {
                    "expression": {
                      "id": 17493,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "8150:3:85",
                      "subExpression": {
                        "id": 17492,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17485,
                        "src": "8150:1:85",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 17494,
                    "nodeType": "ExpressionStatement",
                    "src": "8150:3:85"
                  },
                  "nodeType": "ForStatement",
                  "src": "8112:286:85"
                }
              ]
            },
            "documentation": {
              "id": 17464,
              "nodeType": "StructuredDocumentation",
              "src": "7535:379:85",
              "text": "@notice Transfers eth in the contract to the specified addresses. The parameters addrs and amounts are mapped 1-1.\nThis means that the address at index 0 for addrs will receive the amount (in WEI) from amounts at index 0.\n@param addrs Array of addresses to transfer {amounts} to.\n@param amounts Array of amounts to transfer to {addrs}."
            },
            "functionSelector": "904e9b2b",
            "id": 17535,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 17473,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 17472,
                  "name": "onlyAdmin",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 17141,
                  "src": "8008:9:85"
                },
                "nodeType": "ModifierInvocation",
                "src": "8008:9:85"
              }
            ],
            "name": "transferFee",
            "nameLocation": "7928:11:85",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17471,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17467,
                  "mutability": "mutable",
                  "name": "addrs",
                  "nameLocation": "7967:5:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17535,
                  "src": "7940:32:85",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_payable_$dyn_calldata_ptr",
                    "typeString": "address payable[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 17465,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "7940:15:85",
                      "stateMutability": "payable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "id": 17466,
                    "nodeType": "ArrayTypeName",
                    "src": "7940:17:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_payable_$dyn_storage_ptr",
                      "typeString": "address payable[]"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17470,
                  "mutability": "mutable",
                  "name": "amounts",
                  "nameLocation": "7990:7:85",
                  "nodeType": "VariableDeclaration",
                  "scope": 17535,
                  "src": "7974:23:85",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                    "typeString": "uint256[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 17468,
                      "name": "uint",
                      "nodeType": "ElementaryTypeName",
                      "src": "7974:4:85",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 17469,
                    "nodeType": "ArrayTypeName",
                    "src": "7974:6:85",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                      "typeString": "uint256[]"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7939:59:85"
            },
            "returnParameters": {
              "id": 17474,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8018:0:85"
            },
            "scope": 17536,
            "src": "7919:485:85",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 17537,
        "src": "645:7761:85",
        "usedErrors": [
          17126,
          17128,
          19110
        ]
      }
    ],
    "src": "81:8326:85"
  },
  "compiler": {
    "name": "solc",
    "version": "0.8.11+commit.d7f03943.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.4.6",
  "updatedAt": "2024-09-24T09:31:11.944Z",
  "devdoc": {
    "author": "ChainSafe Systems.",
    "kind": "dev",
    "methods": {
      "calculateFee(address,uint8,uint8,bytes32,bytes,bytes)": {
        "params": {
          "depositData": "Additional data about the deposit.",
          "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 about the deposit.",
          "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.",
          "feeHandlerRouterAddress": "Contract address of previously deployed FeeHandlerRouter."
        }
      },
      "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`."
      },
      "renounceAdmin(address)": {
        "params": {
          "newAdmin": "Address that admin role will be granted to."
        }
      },
      "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."
      },
      "setFeeOracle(address)": {
        "params": {
          "oracleAddress": "Fee oracle address."
        }
      },
      "setFeeProperties(uint32)": {
        "params": {
          "gasUsed": "Default gas used for proposal execution in the destination."
        }
      },
      "setGasPrice(uint8,uint256,uint8,uint248)": {
        "params": {
          "amount": "Fee amount that should be additional charged on top of execution cost (fixed native token amount/percentage of execution cost).",
          "destinationDomainID": "ID of destination chain.",
          "feeType": "Type of fee that can be set (fixed/percentage). \"0\" => execution cost \"1\" => execution cost + protocol fee (fixed fee) \"2\" => execution cost + protocol fee (percentage fee)",
          "gasPrice": "Gas price of destination chain."
        }
      },
      "setWrapTokenAddress(uint8,address)": {
        "params": {
          "destinationDomainID": "ID of destination chain.",
          "wrapToken": "Wrap token address of destination chain."
        }
      },
      "transferFee(address[],uint256[])": {
        "params": {
          "addrs": "Array of addresses to transfer {amounts} to.",
          "amounts": "Array of amounts to transfer to {addrs}."
        }
      }
    },
    "title": "Handles deposit fees based on Effective rates provided by Fee oracle.",
    "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": {
      "calculateFee(address,uint8,uint8,bytes32,bytes,bytes)": {
        "notice": "Calculates fee for deposit."
      },
      "collectFee(address,uint8,uint8,bytes32,bytes,bytes)": {
        "notice": "Collects fee for deposit."
      },
      "feeHandlerType()": {
        "notice": "Getter function for fee handler type"
      },
      "renounceAdmin(address)": {
        "notice": "Removes admin role from {_msgSender()} and grants it to {newAdmin}.Only callable by an address that currently has the admin role."
      },
      "setFeeOracle(address)": {
        "notice": "Sets the fee oracle address for signature verification."
      },
      "setFeeProperties(uint32)": {
        "notice": "Sets the fee properties."
      },
      "setGasPrice(uint8,uint256,uint8,uint248)": {
        "notice": "Sets the gas price for destination chain."
      },
      "setWrapTokenAddress(uint8,address)": {
        "notice": "Sets the wrap token address for destination chain."
      },
      "transferFee(address[],uint256[])": {
        "notice": "Transfers eth in the contract to the specified addresses. The parameters addrs and amounts are mapped 1-1. This means that the address at index 0 for addrs will receive the amount (in WEI) from amounts at index 0."
      }
    },
    "notice": "This contract is intended to be used with the Bridge contract.",
    "version": 1
  }
}