{
  "address": "0x77f1085BffA6DeCf644ff645C0A837Ed83Fb12b1",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract INormalResourceController",
          "name": "arStorageController",
          "type": "address"
        }
      ],
      "name": "ARStorageControllerUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract INormalResourceController",
          "name": "bandwidthController",
          "type": "address"
        }
      ],
      "name": "BandwidthControllerUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract IBilling",
          "name": "billing",
          "type": "address"
        }
      ],
      "name": "BillingUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract INormalResourceController",
          "name": "buildingTimeController",
          "type": "address"
        }
      ],
      "name": "BuildingTimeControllerUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract IDstChainPayment",
          "name": "dstChainPayment",
          "type": "address"
        }
      ],
      "name": "DstChainPaymentUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract IFundPool",
          "name": "fundPool",
          "type": "address"
        }
      ],
      "name": "FundPoolUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract IGovernance",
          "name": "governance",
          "type": "address"
        }
      ],
      "name": "GovernanceUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract IIPFSStorageController",
          "name": "ipfsStorageController",
          "type": "address"
        }
      ],
      "name": "IPFSStorageControllerUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "version",
          "type": "uint8"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "messageReceiver",
          "type": "address"
        }
      ],
      "name": "MessageReceiverUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract IProviderController",
          "name": "providerController",
          "type": "address"
        }
      ],
      "name": "ProviderControllerUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract IProviderRegistry",
          "name": "_providerRegistry",
          "type": "address"
        }
      ],
      "name": "ProviderRegistryUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract IResourcePriceAdaptor",
          "name": "resourcePriceAdaptor",
          "type": "address"
        }
      ],
      "name": "ResourcePriceAdaptorUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract IERC20Upgradeable",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "TokenUpdated",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "ARStorageController",
      "outputs": [
        {
          "internalType": "contract INormalResourceController",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "BandwidthController",
      "outputs": [
        {
          "internalType": "contract INormalResourceController",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "Billing",
      "outputs": [
        {
          "internalType": "contract IBilling",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "BuildingTimeController",
      "outputs": [
        {
          "internalType": "contract INormalResourceController",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "DstChainPayment",
      "outputs": [
        {
          "internalType": "contract IDstChainPayment",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FundPool",
      "outputs": [
        {
          "internalType": "contract IFundPool",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "Governance",
      "outputs": [
        {
          "internalType": "contract IGovernance",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "IPFSStorageController",
      "outputs": [
        {
          "internalType": "contract IIPFSStorageController",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MessageReceiver",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ProviderController",
      "outputs": [
        {
          "internalType": "contract IProviderController",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ProviderRegistry",
      "outputs": [
        {
          "internalType": "contract IProviderRegistry",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ResourcePriceAdaptor",
      "outputs": [
        {
          "internalType": "contract IResourcePriceAdaptor",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "Token",
      "outputs": [
        {
          "internalType": "contract IERC20Upgradeable",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract INormalResourceController",
          "name": "_arStorageController",
          "type": "address"
        }
      ],
      "name": "setARStorageController",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract INormalResourceController",
          "name": "_bandwidthController",
          "type": "address"
        }
      ],
      "name": "setBandwidthController",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IBilling",
          "name": "_billing",
          "type": "address"
        }
      ],
      "name": "setBilling",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract INormalResourceController",
          "name": "_buildingTimeController",
          "type": "address"
        }
      ],
      "name": "setBuildingTimeController",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IDstChainPayment",
          "name": "_dstChainPayment",
          "type": "address"
        }
      ],
      "name": "setDstChainPayment",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IFundPool",
          "name": "_pool",
          "type": "address"
        }
      ],
      "name": "setFundPool",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IGovernance",
          "name": "_governance",
          "type": "address"
        }
      ],
      "name": "setGovernance",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IIPFSStorageController",
          "name": "_ipfsStorageController",
          "type": "address"
        }
      ],
      "name": "setIPFSStorageController",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_messageReceiver",
          "type": "address"
        }
      ],
      "name": "setMessageReceiver",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IProviderController",
          "name": "_providerController",
          "type": "address"
        }
      ],
      "name": "setProviderController",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IProviderRegistry",
          "name": "_providerRegistry",
          "type": "address"
        }
      ],
      "name": "setProviderRegistry",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IResourcePriceAdaptor",
          "name": "_resourcePriceAdaptor",
          "type": "address"
        }
      ],
      "name": "setResourcePriceAdaptor",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC20Upgradeable",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "setToken",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0x2f312dd7e36d8570e6444605c6bae77ec820272e23176aff2811bbe8fc7d13fd",
  "receipt": {
    "to": null,
    "from": "0xe5bab2D79EB833FA25906Cd90540339C9aB8AE70",
    "contractAddress": "0x77f1085BffA6DeCf644ff645C0A837Ed83Fb12b1",
    "transactionIndex": 28,
    "gasUsed": "1002399",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000020000000000000000000001000000000000000000000008000000000000000004000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000400000000000000000000000000000080000000000000000000000000000000000000000000000000000000000080000001000000000000200000000000002000000000000400000000000000000000000000000000004000000000000000000001000010040008000000000000000000100000000000000000000000000000000000000000000000000100000000000000000000100000",
    "blockHash": "0xa8c5d9c72e08986ffadcf15aa16f5f9da7e49f3735faf192672fdc9dc5a17926",
    "transactionHash": "0x2f312dd7e36d8570e6444605c6bae77ec820272e23176aff2811bbe8fc7d13fd",
    "logs": [
      {
        "transactionIndex": 28,
        "blockNumber": 30063688,
        "transactionHash": "0x2f312dd7e36d8570e6444605c6bae77ec820272e23176aff2811bbe8fc7d13fd",
        "address": "0x77f1085BffA6DeCf644ff645C0A837Ed83Fb12b1",
        "topics": [
          "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"
        ],
        "data": "0x0000000000000000000000000000000000000000000000000000000000000001",
        "logIndex": 137,
        "blockHash": "0xa8c5d9c72e08986ffadcf15aa16f5f9da7e49f3735faf192672fdc9dc5a17926"
      },
      {
        "transactionIndex": 28,
        "blockNumber": 30063688,
        "transactionHash": "0x2f312dd7e36d8570e6444605c6bae77ec820272e23176aff2811bbe8fc7d13fd",
        "address": "0x0000000000000000000000000000000000001010",
        "topics": [
          "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63",
          "0x0000000000000000000000000000000000000000000000000000000000001010",
          "0x000000000000000000000000e5bab2d79eb833fa25906cd90540339c9ab8ae70",
          "0x000000000000000000000000bc6044f4a1688d8b8596a9f7d4659e09985eebe6"
        ],
        "data": "0x00000000000000000000000000000000000000000000000000a4d99b460db68400000000000000000000000000000000000000000000000089deb5df9a7b500000000000000000000000000000000000000000000000483bf4ed80d50967d7e90000000000000000000000000000000000000000000000008939dc44546d997c00000000000000000000000000000000000000000000483bf5925a704f758e6d",
        "logIndex": 138,
        "blockHash": "0xa8c5d9c72e08986ffadcf15aa16f5f9da7e49f3735faf192672fdc9dc5a17926"
      }
    ],
    "blockNumber": 30063688,
    "cumulativeGasUsed": "5679449",
    "status": 1,
    "byzantium": true
  },
  "args": [],
  "numDeployments": 1,
  "solcInputHash": "f1d9f0874da35f3fb2217d83f7f7a52b",
  "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract INormalResourceController\",\"name\":\"arStorageController\",\"type\":\"address\"}],\"name\":\"ARStorageControllerUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract INormalResourceController\",\"name\":\"bandwidthController\",\"type\":\"address\"}],\"name\":\"BandwidthControllerUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IBilling\",\"name\":\"billing\",\"type\":\"address\"}],\"name\":\"BillingUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract INormalResourceController\",\"name\":\"buildingTimeController\",\"type\":\"address\"}],\"name\":\"BuildingTimeControllerUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IDstChainPayment\",\"name\":\"dstChainPayment\",\"type\":\"address\"}],\"name\":\"DstChainPaymentUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IFundPool\",\"name\":\"fundPool\",\"type\":\"address\"}],\"name\":\"FundPoolUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IGovernance\",\"name\":\"governance\",\"type\":\"address\"}],\"name\":\"GovernanceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IIPFSStorageController\",\"name\":\"ipfsStorageController\",\"type\":\"address\"}],\"name\":\"IPFSStorageControllerUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"messageReceiver\",\"type\":\"address\"}],\"name\":\"MessageReceiverUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IProviderController\",\"name\":\"providerController\",\"type\":\"address\"}],\"name\":\"ProviderControllerUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IProviderRegistry\",\"name\":\"_providerRegistry\",\"type\":\"address\"}],\"name\":\"ProviderRegistryUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IResourcePriceAdaptor\",\"name\":\"resourcePriceAdaptor\",\"type\":\"address\"}],\"name\":\"ResourcePriceAdaptorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ARStorageController\",\"outputs\":[{\"internalType\":\"contract INormalResourceController\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BandwidthController\",\"outputs\":[{\"internalType\":\"contract INormalResourceController\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"Billing\",\"outputs\":[{\"internalType\":\"contract IBilling\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BuildingTimeController\",\"outputs\":[{\"internalType\":\"contract INormalResourceController\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DstChainPayment\",\"outputs\":[{\"internalType\":\"contract IDstChainPayment\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FundPool\",\"outputs\":[{\"internalType\":\"contract IFundPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"Governance\",\"outputs\":[{\"internalType\":\"contract IGovernance\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"IPFSStorageController\",\"outputs\":[{\"internalType\":\"contract IIPFSStorageController\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MessageReceiver\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ProviderController\",\"outputs\":[{\"internalType\":\"contract IProviderController\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ProviderRegistry\",\"outputs\":[{\"internalType\":\"contract IProviderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ResourcePriceAdaptor\",\"outputs\":[{\"internalType\":\"contract IResourcePriceAdaptor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"Token\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract INormalResourceController\",\"name\":\"_arStorageController\",\"type\":\"address\"}],\"name\":\"setARStorageController\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract INormalResourceController\",\"name\":\"_bandwidthController\",\"type\":\"address\"}],\"name\":\"setBandwidthController\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IBilling\",\"name\":\"_billing\",\"type\":\"address\"}],\"name\":\"setBilling\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract INormalResourceController\",\"name\":\"_buildingTimeController\",\"type\":\"address\"}],\"name\":\"setBuildingTimeController\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IDstChainPayment\",\"name\":\"_dstChainPayment\",\"type\":\"address\"}],\"name\":\"setDstChainPayment\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IFundPool\",\"name\":\"_pool\",\"type\":\"address\"}],\"name\":\"setFundPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IGovernance\",\"name\":\"_governance\",\"type\":\"address\"}],\"name\":\"setGovernance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IIPFSStorageController\",\"name\":\"_ipfsStorageController\",\"type\":\"address\"}],\"name\":\"setIPFSStorageController\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_messageReceiver\",\"type\":\"address\"}],\"name\":\"setMessageReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IProviderController\",\"name\":\"_providerController\",\"type\":\"address\"}],\"name\":\"setProviderController\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IProviderRegistry\",\"name\":\"_providerRegistry\",\"type\":\"address\"}],\"name\":\"setProviderRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IResourcePriceAdaptor\",\"name\":\"_resourcePriceAdaptor\",\"type\":\"address\"}],\"name\":\"setResourcePriceAdaptor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"setToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Alexandas\",\"details\":\"Router contract\",\"kind\":\"dev\",\"methods\":{\"initialize(address)\":{\"details\":\"proxy initialize function\",\"params\":{\"owner\":\"contract owner\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setARStorageController(address)\":{\"details\":\"update AR storage controller contract\",\"params\":{\"_arStorageController\":\"AR storage controller contract\"}},\"setBandwidthController(address)\":{\"details\":\"update bandwidth controller contract\",\"params\":{\"_bandwidthController\":\"bandwidth controller contract\"}},\"setBilling(address)\":{\"details\":\"update resource adaptor contract\",\"params\":{\"_billing\":\"billing contract\"}},\"setBuildingTimeController(address)\":{\"details\":\"update building time controller contract\",\"params\":{\"_buildingTimeController\":\"building time controller contract\"}},\"setDstChainPayment(address)\":{\"details\":\"update dst chain payment contract address\",\"params\":{\"_dstChainPayment\":\"dst chain payment contract address\"}},\"setFundPool(address)\":{\"details\":\"update resource adaptor contract\",\"params\":{\"_pool\":\"fund pool contract\"}},\"setGovernance(address)\":{\"details\":\"update GoverDrip contract address\",\"params\":{\"_governance\":\"governance contract address\"}},\"setIPFSStorageController(address)\":{\"details\":\"update ipfs storage controller contract\",\"params\":{\"_ipfsStorageController\":\"IPFS storage controller contract\"}},\"setMessageReceiver(address)\":{\"details\":\"set messageReceiver contract address\",\"params\":{\"_messageReceiver\":\"message receiver contract address\"}},\"setProviderController(address)\":{\"details\":\"update provider controller contract address\",\"params\":{\"_providerController\":\"provider controller contract address\"}},\"setProviderRegistry(address)\":{\"details\":\"update provider registry contract\",\"params\":{\"_providerRegistry\":\"provider registry contract address\"}},\"setResourcePriceAdaptor(address)\":{\"details\":\"update resource adaptor contract\",\"params\":{\"_resourcePriceAdaptor\":\"resource adaptor contract\"}},\"setToken(address)\":{\"details\":\"update token address\",\"params\":{\"_token\":\"token address\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"stateVariables\":{\"ARStorageController\":{\"details\":\"return AR storage controller\"},\"BandwidthController\":{\"details\":\"return bandwidth controller\"},\"Billing\":{\"details\":\"billing contract address\"},\"BuildingTimeController\":{\"details\":\"return building time controller\"},\"DstChainPayment\":{\"details\":\"dst chain payment contract address\"},\"FundPool\":{\"details\":\"fund pool contract address\"},\"Governance\":{\"details\":\"Governance contract address\"},\"IPFSStorageController\":{\"details\":\"return ipfs storage controller\"},\"MessageReceiver\":{\"details\":\"message receiver contract address\"},\"ProviderController\":{\"details\":\"provider controller contract address\"},\"ProviderRegistry\":{\"details\":\"providers contract address\"},\"ResourcePriceAdaptor\":{\"details\":\"return resource price adaptor contract address\"},\"Token\":{\"details\":\"token address\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/govers/Router.sol\":\"Router\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":false},\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal onlyInitializing {\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal onlyInitializing {\\n        _transferOwnership(_msgSender());\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        _transferOwnership(address(0));\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        _transferOwnership(newOwner);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Internal function without access restriction.\\n     */\\n    function _transferOwnership(address newOwner) internal virtual {\\n        address oldOwner = _owner;\\n        _owner = newOwner;\\n        emit OwnershipTransferred(oldOwner, newOwner);\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x652fee292f698d8dba81bf287cb71f1682f6483b67ebe601a5f7387dcfc30b34\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../token/ERC20/IERC20Upgradeable.sol\\\";\\n\",\"keccak256\":\"0xe73087c5001a37cf7186b3709377c7ceb01a0d38fb908723d1464cea66b4958c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n *     function initialize() initializer public {\\n *         __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n *     }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n *     function initializeV2() reinitializer(2) public {\\n *         __ERC20Permit_init(\\\"MyToken\\\");\\n *     }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n *     _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     * @custom:oz-retyped-from bool\\n     */\\n    uint8 private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Triggered when the contract has been initialized or reinitialized.\\n     */\\n    event Initialized(uint8 version);\\n\\n    /**\\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n     * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\\n     */\\n    modifier initializer() {\\n        bool isTopLevelCall = _setInitializedVersion(1);\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n        }\\n        _;\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n            emit Initialized(1);\\n        }\\n    }\\n\\n    /**\\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n     * used to initialize parent contracts.\\n     *\\n     * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\\n     * initialization step. This is essential to configure modules that are added through upgrades and that require\\n     * initialization.\\n     *\\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n     * a contract, executing them in the right order is up to the developer or operator.\\n     */\\n    modifier reinitializer(uint8 version) {\\n        bool isTopLevelCall = _setInitializedVersion(version);\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n        }\\n        _;\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n            emit Initialized(version);\\n        }\\n    }\\n\\n    /**\\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n     */\\n    modifier onlyInitializing() {\\n        require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n     * through proxies.\\n     */\\n    function _disableInitializers() internal virtual {\\n        _setInitializedVersion(type(uint8).max);\\n    }\\n\\n    function _setInitializedVersion(uint8 version) private returns (bool) {\\n        // If the contract is initializing we ignore whether _initialized is set in order to support multiple\\n        // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\\n        // of initializers, because in other contexts the contract may have been reentered.\\n        if (_initializing) {\\n            require(\\n                version == 1 && !AddressUpgradeable.isContract(address(this)),\\n                \\\"Initializable: contract is already initialized\\\"\\n            );\\n            return false;\\n        } else {\\n            require(_initialized < version, \\\"Initializable: contract is already initialized\\\");\\n            _initialized = version;\\n            return true;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x7454006cccb737612b00104d2f606d728e2818b778e7e55542f063c614ce46ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `from` to `to` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x4e733d3164f73f461eaf9d8087a7ad1ea180bdc8ba0d3d61b0e1ae16d8e63dff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n     *\\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n     * constructor.\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize/address.code.length, which returns 0\\n        // for contracts in construction, since the code is only stored at the end\\n        // of the constructor execution.\\n\\n        return account.code.length > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain `call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n     * revert reason using the provided one.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function verifyCallResult(\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal pure returns (bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x55cf2bd9fc76704ddcdc19834cd288b7de00fc0f298a40ea16a954ae8991db2d\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal onlyInitializing {\\n    }\\n\\n    function __Context_init_unchained() internal onlyInitializing {\\n    }\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n// CAUTION\\n// This version of SafeMath should only be used with Solidity 0.8 or later,\\n// because it relies on the compiler's built in overflow checks.\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations.\\n *\\n * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler\\n * now has built in overflow checking.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        unchecked {\\n            uint256 c = a + b;\\n            if (c < a) return (false, 0);\\n            return (true, c);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        unchecked {\\n            if (b > a) return (false, 0);\\n            return (true, a - b);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        unchecked {\\n            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n            // benefit is lost if 'b' is also tested.\\n            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n            if (a == 0) return (true, 0);\\n            uint256 c = a * b;\\n            if (c / a != b) return (false, 0);\\n            return (true, c);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        unchecked {\\n            if (b == 0) return (false, 0);\\n            return (true, a / b);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        unchecked {\\n            if (b == 0) return (false, 0);\\n            return (true, a % b);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a + b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a * b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(\\n        uint256 a,\\n        uint256 b,\\n        string memory errorMessage\\n    ) internal pure returns (uint256) {\\n        unchecked {\\n            require(b <= a, errorMessage);\\n            return a - b;\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(\\n        uint256 a,\\n        uint256 b,\\n        string memory errorMessage\\n    ) internal pure returns (uint256) {\\n        unchecked {\\n            require(b > 0, errorMessage);\\n            return a / b;\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(\\n        uint256 a,\\n        uint256 b,\\n        string memory errorMessage\\n    ) internal pure returns (uint256) {\\n        unchecked {\\n            require(b > 0, errorMessage);\\n            return a % b;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcaa8b7861115ea691c77ddbeac140a444e0edcd1d9812a43942c0f6b42b36a49\",\"license\":\"MIT\"},\"contracts/govers/Router.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\n\\npragma solidity >=0.8.0;\\n\\nimport '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';\\n\\nimport '../interfaces/IRouter.sol';\\n\\n/// @author Alexandas\\n/// @dev Router contract\\ncontract Router is IRouter, OwnableUpgradeable {\\n\\t/// @dev message receiver contract address\\n\\taddress public override MessageReceiver;\\n\\n\\t/// @dev Governance contract address\\n\\tIGovernance public override Governance;\\n\\n\\t/// @dev providers contract address\\n\\tIProviderRegistry public override ProviderRegistry;\\n\\n\\t/// @dev provider controller contract address\\n\\tIProviderController public override ProviderController;\\n\\n\\t/// @dev token address\\n\\tIERC20Upgradeable public override Token;\\n\\n\\t/// @dev return building time controller\\n\\tINormalResourceController public override BuildingTimeController;\\n\\n\\t/// @dev return bandwidth controller\\n\\tINormalResourceController public override BandwidthController;\\n\\n\\t/// @dev return AR storage controller\\n\\tINormalResourceController public override ARStorageController;\\n\\n\\t/// @dev return ipfs storage controller\\n\\tIIPFSStorageController public override IPFSStorageController;\\n\\n\\t/// @dev return resource price adaptor contract address\\n\\tIResourcePriceAdaptor public override ResourcePriceAdaptor;\\n\\n\\t/// @dev dst chain payment contract address\\n\\tIDstChainPayment public override DstChainPayment;\\n\\n\\t/// @dev billing contract address\\n\\tIBilling public override Billing;\\n\\n\\t/// @dev fund pool contract address\\n\\tIFundPool public override FundPool;\\n\\n\\tconstructor() initializer {}\\n\\n\\t/// @dev proxy initialize function\\n\\t/// @param owner contract owner\\n\\tfunction initialize(address owner) external initializer {\\n\\t\\t_transferOwnership(owner);\\n\\t}\\n\\n\\t/// @dev set messageReceiver contract address\\n\\t/// @param _messageReceiver message receiver contract address\\n\\tfunction setMessageReceiver(address _messageReceiver) external onlyOwner {\\n\\t\\trequire(address(_messageReceiver) != address(0), 'Router: zero address');\\n\\t\\tMessageReceiver = _messageReceiver;\\n\\t\\temit MessageReceiverUpdated(_messageReceiver);\\n\\t}\\n\\n\\t/// @dev update GoverDrip contract address\\n\\t/// @param _governance governance contract address\\n\\tfunction setGovernance(IGovernance _governance) external onlyOwner {\\n\\t\\trequire(address(_governance) != address(0), 'Router: zero address');\\n\\t\\tGovernance = _governance;\\n\\t\\temit GovernanceUpdated(_governance);\\n\\t}\\n\\n\\t/// @dev update provider registry contract\\n\\t/// @param _providerRegistry provider registry contract address\\n\\tfunction setProviderRegistry(IProviderRegistry _providerRegistry) external onlyOwner {\\n\\t\\trequire(address(_providerRegistry) != address(0), 'Router: zero address');\\n\\t\\tProviderRegistry = _providerRegistry;\\n\\t\\temit ProviderRegistryUpdated(_providerRegistry);\\n\\t}\\n\\n\\t/// @dev update provider controller contract address\\n\\t/// @param _providerController provider controller contract address\\n\\tfunction setProviderController(IProviderController _providerController) external onlyOwner {\\n\\t\\trequire(address(_providerController) != address(0), 'Router: zero address');\\n\\t\\tProviderController = _providerController;\\n\\t\\temit ProviderControllerUpdated(_providerController);\\n\\t}\\n\\n\\t/// @dev update token address\\n\\t/// @param _token token address\\n\\tfunction setToken(IERC20Upgradeable _token) external onlyOwner {\\n\\t\\trequire(address(_token) != address(0), 'Router: zero address');\\n\\t\\tToken = _token;\\n\\t\\temit TokenUpdated(_token);\\n\\t}\\n\\n\\t/// @dev update building time controller contract\\n\\t/// @param _buildingTimeController building time controller contract\\n\\tfunction setBuildingTimeController(INormalResourceController _buildingTimeController) external onlyOwner {\\n\\t\\trequire(address(_buildingTimeController) != address(0), 'Router: zero address');\\n\\t\\tBuildingTimeController = _buildingTimeController;\\n\\t\\temit BuildingTimeControllerUpdated(_buildingTimeController);\\n\\t}\\n\\n\\t/// @dev update bandwidth controller contract\\n\\t/// @param _bandwidthController bandwidth controller contract\\n\\tfunction setBandwidthController(INormalResourceController _bandwidthController) external onlyOwner {\\n\\t\\trequire(address(_bandwidthController) != address(0), 'Router: zero address');\\n\\t\\tBandwidthController = _bandwidthController;\\n\\t\\temit BandwidthControllerUpdated(_bandwidthController);\\n\\t}\\n\\n\\t/// @dev update AR storage controller contract\\n\\t/// @param _arStorageController AR storage controller contract\\n\\tfunction setARStorageController(INormalResourceController _arStorageController) external onlyOwner {\\n\\t\\trequire(address(_arStorageController) != address(0), 'Router: zero address');\\n\\t\\tARStorageController = _arStorageController;\\n\\t\\temit ARStorageControllerUpdated(_arStorageController);\\n\\t}\\n\\n\\t/// @dev update ipfs storage controller contract\\n\\t/// @param _ipfsStorageController IPFS storage controller contract\\n\\tfunction setIPFSStorageController(IIPFSStorageController _ipfsStorageController) external onlyOwner {\\n\\t\\trequire(address(_ipfsStorageController) != address(0), 'Router: zero address');\\n\\t\\tIPFSStorageController = _ipfsStorageController;\\n\\t\\temit IPFSStorageControllerUpdated(_ipfsStorageController);\\n\\t}\\n\\n\\t/// @dev update resource adaptor contract\\n\\t/// @param _resourcePriceAdaptor resource adaptor contract\\n\\tfunction setResourcePriceAdaptor(IResourcePriceAdaptor _resourcePriceAdaptor) external onlyOwner {\\n\\t\\trequire(address(_resourcePriceAdaptor) != address(0), 'Router: zero address');\\n\\t\\tResourcePriceAdaptor = _resourcePriceAdaptor;\\n\\t\\temit ResourcePriceAdaptorUpdated(_resourcePriceAdaptor);\\n\\t}\\n\\n\\t/// @dev update dst chain payment contract address\\n\\t/// @param _dstChainPayment dst chain payment contract address\\n\\tfunction setDstChainPayment(IDstChainPayment _dstChainPayment) external onlyOwner {\\n\\t\\trequire(address(_dstChainPayment) != address(0), 'Router: zero address');\\n\\t\\tDstChainPayment = _dstChainPayment;\\n\\t\\temit DstChainPaymentUpdated(_dstChainPayment);\\n\\t}\\n\\n\\t/// @dev update resource adaptor contract\\n\\t/// @param _billing billing contract\\n\\tfunction setBilling(IBilling _billing) external onlyOwner {\\n\\t\\trequire(address(_billing) != address(0), 'Router: zero address');\\n\\t\\tBilling = _billing;\\n\\t\\temit BillingUpdated(_billing);\\n\\t}\\n\\n\\t/// @dev update resource adaptor contract\\n\\t/// @param _pool fund pool contract\\n\\tfunction setFundPool(IFundPool _pool) external onlyOwner {\\n\\t\\trequire(address(_pool) != address(0), 'Router: zero address');\\n\\t\\tFundPool = _pool;\\n\\t\\temit FundPoolUpdated(_pool);\\n\\t}\\n}\\n\",\"keccak256\":\"0x50527752b0385b7a8ecd35757735c46ff9595af5865882902a43e33c09edb8d5\",\"license\":\"GPL-3.0-only\"},\"contracts/interfaces/IBilling.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSE\\n\\npragma solidity >=0.8.0;\\n\\nimport '@openzeppelin/contracts-upgradeable/interfaces/IERC20Upgradeable.sol';\\nimport '../libraries/ResourceData.sol';\\nimport '../resources/interfaces/IResourcePriceAdaptor.sol';\\n\\n/// @author Alexandas\\n/// @dev Billing interface\\ninterface IBilling {\\n\\tstruct BillEntry {\\n\\t\\tResourceData.ResourceType resourceType;\\n\\t\\tuint256 amount;\\n\\t}\\n\\n\\tstruct Bill {\\n\\t\\tuint256 indexBlock;\\n\\t\\tBillEntry[] entries;\\n\\t}\\n\\n\\t/// @dev emit when billing types hash updated\\n\\t/// @param hash billing types Hash\\n\\tevent BillingTypesHashUpdated(bytes32 hash);\\n\\n\\t/// @dev emit when bills finalized\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param bills bills data\\n\\t/// @param amount fee\\n\\t/// @param nonce nonce\\n\\tevent Billing(address provider, bytes32 account, bytes bills, uint256 amount, uint64 nonce);\\n\\n\\t/// @dev get billing types hash\\n\\t/// @return billing types hash\\n\\tfunction billingTypesHash() external view returns (bytes32);\\n\\n\\t/// @dev spend bills\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param bills billing data\\n\\t/// @param timeout tx timeout\\n\\t/// @param nonce billing nonce\\n\\t/// @param signature billing signature\\n\\t/// @return fee billing fee\\n\\tfunction spend(\\n\\t\\taddress provider,\\n\\t\\tbytes32 account,\\n\\t\\tbytes memory bills,\\n\\t\\tuint256 timeout,\\n\\t\\tuint64 nonce,\\n\\t\\tbytes memory signature\\n\\t) external returns (uint256 fee);\\n\\n\\t/// @dev return balance of provider\\n\\t/// @param provider provider address\\n\\t/// @return balance of provider\\n\\tfunction balanceOf(address provider) external view returns (uint256);\\n\\n\\t/// @dev provider nonces for account\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param nonce nonce\\n\\t/// @return whether nonce exists\\n\\tfunction nonceExists(\\n\\t\\taddress provider,\\n\\t\\tbytes32 account,\\n\\t\\tuint64 nonce\\n\\t) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x28413ecc2f7477ad5f216bc9e6d543fc567af662ee6a278abad15505ddf19597\",\"license\":\"UNLICENSE\"},\"contracts/interfaces/IDstChainPayment.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSE\\n\\npragma solidity >=0.8.0;\\n\\nimport '@openzeppelin/contracts-upgradeable/interfaces/IERC20Upgradeable.sol';\\nimport '../libraries/ResourceData.sol';\\n\\n/// @author Alexandas\\n/// @dev DstChainPayment interface\\ninterface IDstChainPayment {\\n\\tstruct PaymentPayload {\\n\\t\\taddress provider;\\n\\t\\tuint64 nonce;\\n\\t\\tbytes32 account;\\n\\t\\tResourceData.ValuePayload[] payloads;\\n\\t}\\n\\n\\t/// @dev emit when a user paid\\n\\t/// @param token token address\\n\\t/// @param payload payment payload\\n\\tevent Paid(IERC20Upgradeable token, PaymentPayload payload);\\n\\n\\t/// @dev pay from source chain only called by message receiver\\n\\t/// @param _token token address\\n\\t/// @param dstAmount token amount\\n\\t/// @param message payment payload message bytes\\n\\tfunction payFromSourceChain(\\n\\t\\tIERC20Upgradeable _token,\\n\\t\\tuint256 dstAmount,\\n\\t\\tbytes calldata message\\n\\t) external;\\n\\n\\t/// @dev pay on dst chain\\n\\t/// @param payload payment payload\\n\\t/// @return value payment value\\n\\tfunction pay(PaymentPayload memory payload) external returns (uint256 value);\\n\\n\\t/// @dev decode source chain message\\n\\t/// @param message message bytes\\n\\t/// @return provider provider address\\n\\t/// @return nonce nonce\\n\\t/// @return account user account\\n\\t/// @return payloads payment payloads\\n\\tfunction decodeSourceChainMessage(bytes memory message)\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (\\n\\t\\t\\taddress provider,\\n\\t\\t\\tuint64 nonce,\\n\\t\\t\\tbytes32 account,\\n\\t\\t\\tResourceData.ValuePayload[] memory payloads\\n\\t\\t);\\n\\n\\t/// @dev calculate fee for ipfs storage and expiration\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param amount ipfs storage amount\\n\\t/// @param expiration ipfs expiration(in seconds)\\n\\t/// @return storageFee ipfs storage fee\\n\\t/// @return expirationFee ipfs expiration fee\\n\\tfunction ipfsAlloctionsFee(\\n\\t\\taddress provider,\\n\\t\\tbytes32 account,\\n\\t\\tuint256 amount,\\n\\t\\tuint256 expiration\\n\\t) external view returns (uint256 storageFee, uint256 expirationFee);\\n\\n\\t/// @dev calculate ipfs storage and expiration with storage fee and expiration fee\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param storageFee storage fee\\n\\t/// @param expirationFee expiration fee\\n\\t/// @return amount ipfs storage amount\\n\\t/// @return expiration ipfs expiration(in seconds)\\n\\tfunction ipfsAllocations(\\n\\t\\taddress provider,\\n\\t\\tbytes32 account,\\n\\t\\tuint256 storageFee,\\n\\t\\tuint256 expirationFee\\n\\t) external view returns (uint256 amount, uint256 expiration);\\n\\n\\t/// @dev return balance of provider\\n\\t/// @param provider provider address\\n\\t/// @return balance of provider\\n\\tfunction balanceOf(address provider) external view returns (uint256);\\n\\n\\t/// @dev return resource price\\n\\t/// @param provider provider address\\n\\t/// @param resourceType resource type\\n\\t/// @return resource price\\n\\tfunction priceOf(address provider, ResourceData.ResourceType resourceType) external view returns (uint256);\\n\\n\\t/// @dev return value of amount resource\\n\\t/// @param provider provider address\\n\\t/// @param resourceType resource type\\n\\t/// @param amount resource amount\\n\\t/// @return token value\\n\\tfunction getValueOf(\\n\\t\\taddress provider,\\n\\t\\tResourceData.ResourceType resourceType,\\n\\t\\tuint256 amount\\n\\t) external view returns (uint256);\\n\\n\\t/// @dev return resource amount with value\\n\\t/// @param provider provider address\\n\\t/// @param resourceType resource type\\n\\t/// @param value token value\\n\\t/// @return resource amount\\n\\tfunction getAmountOf(\\n\\t\\taddress provider,\\n\\t\\tResourceData.ResourceType resourceType,\\n\\t\\tuint256 value\\n\\t) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xb291ce3c1e53e0904a98a9a6578b90caa7b5907db3f1f633a388476fe1dd9b5d\",\"license\":\"UNLICENSE\"},\"contracts/interfaces/IFundPool.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSE\\n\\npragma solidity >=0.8.0;\\n\\n/// @author Alexandas\\n/// @dev FundPool interface\\ninterface IFundPool {\\n\\n\\t/// @dev emit when bill spent\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param amount token amount\\n\\tevent Spent(address provider, bytes32 account, uint256 amount);\\n\\n\\t/// @dev emit when account recharged\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param amount token amount\\n\\tevent Recharged(address provider, bytes32 account, uint256 amount);\\n\\n\\t/// @dev emit when user withdrawn\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param to token receiver\\n\\t/// @param amount token amount\\n\\tevent Withdrawn(address provider, bytes32 account, address to, uint256 amount);\\n\\n\\t/// @dev recharge for account\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param amount token amount\\n\\tfunction recharge(\\n\\t\\taddress provider,\\n\\t\\tbytes32 account,\\n\\t\\tuint256 amount\\n\\t) external;\\n\\n\\t/// @dev spend bills for account\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param bills billing data\\n\\t/// @param timeout tx timeout\\n\\t/// @param nonce billing nonce\\n\\t/// @param signature provider signature\\n\\t/// @return fee bills fee\\n\\tfunction spend(\\n\\t\\taddress provider,\\n\\t\\tbytes32 account,\\n\\t\\tbytes memory bills,\\n\\t\\tuint256 timeout,\\n\\t\\tuint64 nonce,\\n\\t\\tbytes memory signature\\n\\t) external returns (uint256 fee);\\n\\n\\t/// @dev withdraw token for account\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param bills billing data\\n\\t/// @param timeout tx timeout\\n\\t/// @param nonce billing nonce\\n\\t/// @param signature billing signature\\n\\t/// @param to token receiver\\n\\t/// @param amount token amount\\n\\t/// @param signature provider signature\\n\\t/// @return fee bill fee\\n\\tfunction withdraw(\\n\\t\\taddress provider,\\n\\t\\tbytes32 account,\\n\\t\\tbytes memory bills,\\n\\t\\tuint256 timeout,\\n\\t\\tuint64 nonce,\\n\\t\\tbytes memory signature,\\n\\t\\taddress to,\\n\\t\\tuint256 amount\\n\\t) external returns (uint256 fee);\\n\\n\\t/// @dev return wallet of the account\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @return wallet of the account\\n\\tfunction walletOf(address provider, bytes32 account) external view returns (address);\\n\\n\\t/// @dev return balance of account\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @return balance of account account\\n\\tfunction balanceOf(address provider, bytes32 account) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x6612ea3955dc515aa88c904f58f044ebb82753881c4b0cfb128b60f5e949b666\",\"license\":\"UNLICENSE\"},\"contracts/interfaces/IGovernance.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSE\\n\\npragma solidity >=0.8.0;\\n\\nimport './IProviderRegistry.sol';\\nimport '../libraries/ResourceData.sol';\\n\\n/// @author Alexandas\\n/// @dev Governance interface\\ninterface IGovernance {\\n\\t/// @dev emit when governance drip resource to provider\\n\\t/// @param provider provider address\\n\\tevent GovernanceDrip(address provider);\\n\\n\\t/// @dev add a provider\\n\\t/// @param provider address\\n\\tfunction addProvider(address provider) external;\\n\\n\\t/// @dev remove a provider\\n\\t/// @param provider address\\n\\tfunction removeProvider(address provider) external;\\n\\n\\t/// @dev drip resource to provider\\n\\t/// @param provider provider address\\n\\t/// @param payloads resource payloads\\n\\tfunction drip(address provider, ResourceData.AmountPayload[] memory payloads) external;\\n}\\n\",\"keccak256\":\"0xfa284b7879ce25372f1f6c74ee8c7df6d41dedae6f3298b788086473c0d4c215\",\"license\":\"UNLICENSE\"},\"contracts/interfaces/IProviderController.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSE\\n\\npragma solidity >=0.8.0;\\n\\nimport '../libraries/ResourceData.sol';\\n\\n/// @author Alexandas\\n/// @dev provider controller interface\\ninterface IProviderController {\\n\\t/// @dev emit when account registered in provider\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\tevent AccountRegistered(address provider, bytes32 account);\\n\\n\\t/// @dev emit when provider drip resource to account\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\tevent ProviderDripped(address provider, bytes32 account);\\n\\n\\t/// @dev emit when wallet types hash updated\\n\\t/// @param hash wallet types hash\\n\\tevent WalletTypesHashUpdated(bytes32 hash);\\n\\n\\t/// @dev emit when wallet transferred\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param from original wallet address\\n\\t/// @param to new wallet address\\n\\tevent WalletTransferred(address provider, bytes32 account, address from, address to);\\n\\n\\t/// @dev keccak256(\\\"Wallet(address provider,bytes32 account,address wallet)\\\")\\n\\tfunction walletTypesHash() external view returns (bytes32);\\n\\n\\t/// @dev register account\\n\\t/// @param account user account\\n\\tfunction registerAccount(bytes32 account) external;\\n\\n\\t/// @dev register multiple account\\n\\t/// @param accounts user accounts\\n\\tfunction registerMult(bytes32[] memory accounts) external;\\n\\n\\t/// @dev Explain to a developer any extra details\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @return whether account exists\\n\\tfunction accountExists(address provider, bytes32 account) external view returns (bool);\\n\\n\\t/// @dev provider drip resource to multiple accounts\\n\\t/// @param accounts user accounts\\n\\t/// @param payloads resource amount payloads\\n\\tfunction dripMult(\\n\\t\\tbytes32[] memory accounts,\\n\\t\\tResourceData.AmountPayload[][] memory payloads\\n\\t) external;\\n\\n\\t/// @dev provider drip resource to user account\\n\\t/// @param account user account\\n\\t/// @param payloads resource amount payloads\\n\\tfunction drip(\\n\\t\\tbytes32 account,\\n\\t\\tResourceData.AmountPayload[] memory payloads\\n\\t) external;\\n\\n\\t/// @dev provider register and drip resource for multiple accounts\\n\\t/// @param accounts user accounts\\n\\t/// @param payloads resource amount payloads\\n\\tfunction registerAndDripMult(\\n\\t\\tbytes32[] memory accounts,\\n\\t\\tResourceData.AmountPayload[][] memory payloads\\n\\t) external;\\n\\n\\t/// @dev initialize wallet for the given account\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param wallet account wallet\\n\\t/// @param signature provider signature\\n\\tfunction initWallet(\\n\\t\\taddress provider,\\n\\t\\tbytes32 account,\\n\\t\\taddress wallet,\\n\\t\\tbytes memory signature\\n\\t) external;\\n\\n\\t/// @dev transfer wallet for the account\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param newWallet account wallet\\n\\tfunction transferWallet(\\n\\t\\taddress provider,\\n\\t\\tbytes32 account,\\n\\t\\taddress newWallet\\n\\t) external;\\n\\n\\t/// @dev return wallet for the account\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @return wallet for the account\\n\\tfunction walletOf(address provider, bytes32 account) external view returns (address);\\n\\n\\t/// @dev return whether wallet exists\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @return whether wallet exists\\n\\tfunction walletExists(address provider, bytes32 account) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x659cb15e3bf5e88e20b9d09ca05f6d748eac4d51c9251a6d1043fe2fca217dcb\",\"license\":\"UNLICENSE\"},\"contracts/interfaces/IProviderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSE\\n\\npragma solidity >=0.8.0;\\n\\n/// @author Alexandas\\n/// @dev provider registry interface\\ninterface IProviderRegistry {\\n\\t/// @dev emit when provider is added\\n\\t/// @param provider provider address\\n\\tevent AddProvider(address provider);\\n\\n\\t/// @dev emit when provider removed\\n\\t/// @param provider provider address\\n\\tevent RemoveProvider(address provider);\\n\\n\\tevent AddProivderWallet(address provider, address wallet);\\n\\n\\tevent RemoveProviderWallet(address provider, address wallet);\\n\\n\\t/// @dev add a provider\\n\\t/// @param provider address\\n\\tfunction addProvider(address provider) external;\\n\\n\\t/// @dev remove a provider\\n\\t/// @param provider address\\n\\tfunction removeProvider(address provider) external;\\n\\n\\t/// @dev return whether address is a provider\\n\\t/// @param provider address\\n\\tfunction isProvider(address provider) external view returns (bool);\\n\\n\\t/// @dev return provider wallet\\n\\t/// @param provider address\\n\\t/// @return provider wallet\\n\\tfunction providerWallet(address provider) external view returns (address);\\n\\n\\t/// @dev return provider wallet exists\\n\\t/// @param provider address\\n\\t/// @return whether provider wallet exists\\n\\tfunction providerWalletExists(address provider) external view returns (bool);\\n\\n\\t/// @dev return whether a valid signature\\n\\t/// @param provider address\\n\\t/// @param hash message hash\\n\\t/// @param signature provider signature for message hash\\n\\t/// @return is valid signature\\n\\tfunction isValidSignature(\\n\\t\\taddress provider,\\n\\t\\tbytes32 hash,\\n\\t\\tbytes memory signature\\n\\t) external returns (bool);\\n}\\n\",\"keccak256\":\"0xa51e867c83ef543d6aa67facb3df5952b83ed6aea7fc9c2129a4105377d29bf2\",\"license\":\"UNLICENSE\"},\"contracts/interfaces/IRouter.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSE\\n\\npragma solidity >=0.8.0;\\n\\nimport '@openzeppelin/contracts-upgradeable/interfaces/IERC20Upgradeable.sol';\\n\\nimport '../interfaces/IGovernance.sol';\\nimport '../interfaces/IProviderRegistry.sol';\\nimport '../interfaces/IProviderController.sol';\\nimport '../interfaces/IDstChainPayment.sol';\\nimport '../interfaces/IBilling.sol';\\nimport '../interfaces/IFundPool.sol';\\nimport '../resources/interfaces/INormalResourceController.sol';\\nimport '../resources/interfaces/IIPFSStorageController.sol';\\nimport '../resources/interfaces/IResourcePriceAdaptor.sol';\\n\\n/// @author Alexandas\\n/// @dev Router interface\\ninterface IRouter {\\n\\t/// @dev emit when governance contract address updated\\n\\t/// @param governance governance contract address\\n\\tevent GovernanceUpdated(IGovernance governance);\\n\\n\\t/// @dev emit when message receiver updated\\n\\t/// @param messageReceiver message receiver contract address\\n\\tevent MessageReceiverUpdated(address messageReceiver);\\n\\n\\t/// @dev emit when provider registry contract updated\\n\\t/// @param _providerRegistry provider registry contract\\n\\tevent ProviderRegistryUpdated(IProviderRegistry _providerRegistry);\\n\\n\\t/// @dev emit when dst ProviderController contract address updated\\n\\t/// @param providerController ProviderController contract address\\n\\tevent ProviderControllerUpdated(IProviderController providerController);\\n\\n\\t/// @dev emit when token updated\\n\\t/// @param token token address\\n\\tevent TokenUpdated(IERC20Upgradeable token);\\n\\n\\t/// @dev emit when building time controller updated\\n\\t/// @param buildingTimeController building time controller contract\\n\\tevent BuildingTimeControllerUpdated(INormalResourceController buildingTimeController);\\n\\n\\t/// @dev emit when bandwidth controller updated\\n\\t/// @param bandwidthController bandwidth controller contract\\n\\tevent BandwidthControllerUpdated(INormalResourceController bandwidthController);\\n\\n\\t/// @dev emit when AR storage controller updated\\n\\t/// @param arStorageController AR storage controller contract\\n\\tevent ARStorageControllerUpdated(INormalResourceController arStorageController);\\n\\n\\t/// @dev emit when ipfs storage controller updated\\n\\t/// @param ipfsStorageController IPFS storage controller contract\\n\\tevent IPFSStorageControllerUpdated(IIPFSStorageController ipfsStorageController);\\n\\n\\t/// @dev emit when resource price adaptor updated\\n\\t/// @param resourcePriceAdaptor resource price adaptor contract\\n\\tevent ResourcePriceAdaptorUpdated(IResourcePriceAdaptor resourcePriceAdaptor);\\n\\n\\t/// @dev emit when dst chain payment contract address updated\\n\\t/// @param dstChainPayment dst chain payment contract address\\n\\tevent DstChainPaymentUpdated(IDstChainPayment dstChainPayment);\\n\\n\\t/// @dev emit when billing contract updated\\n\\t/// @param billing billing contract\\n\\tevent BillingUpdated(IBilling billing);\\n\\n\\t/// @dev emit when fund pool contract updated\\n\\t/// @param fundPool fund pool contract\\n\\tevent FundPoolUpdated(IFundPool fundPool);\\n\\n\\t/// @dev message receiver contract address\\n\\tfunction MessageReceiver() external view returns (address);\\n\\n\\t/// @dev Governance contract address\\n\\tfunction Governance() external view returns (IGovernance);\\n\\n\\t/// @dev providers contract address\\n\\tfunction ProviderRegistry() external view returns (IProviderRegistry);\\n\\n\\t/// @dev provider controller contract address\\n\\tfunction ProviderController() external view returns (IProviderController);\\n\\n\\t/// @dev token address\\n\\tfunction Token() external view returns (IERC20Upgradeable);\\n\\n\\t/// @dev return building time controller\\n\\tfunction BuildingTimeController() external view returns (INormalResourceController);\\n\\n\\t/// @dev return bandwidth controller\\n\\tfunction BandwidthController() external view returns (INormalResourceController);\\n\\n\\t/// @dev return AR storage controller\\n\\tfunction ARStorageController() external view returns (INormalResourceController);\\n\\n\\t/// @dev return ipfs storage controller\\n\\tfunction IPFSStorageController() external view returns (IIPFSStorageController);\\n\\n\\t/// @dev return resource price adaptor contract address\\n\\tfunction ResourcePriceAdaptor() external view returns (IResourcePriceAdaptor);\\n\\n\\t/// @dev dst chain payment contract address\\n\\tfunction DstChainPayment() external view returns (IDstChainPayment);\\n\\n\\t/// @dev billing contract address\\n\\tfunction Billing() external view returns (IBilling);\\n\\n\\t/// @dev fund pool contract address\\n\\tfunction FundPool() external view returns (IFundPool);\\n}\\n\",\"keccak256\":\"0x32c01e0f705a5c96ad7550e7cb0e885c5479fa9353445c256eab4e8c0e14e8cf\",\"license\":\"UNLICENSE\"},\"contracts/libraries/ResourceData.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSE\\n\\npragma solidity >=0.8.0;\\nimport '@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol';\\nimport '@openzeppelin/contracts-upgradeable/interfaces/IERC20Upgradeable.sol';\\n\\n/// @author Alexandas\\n/// @dev resource data library\\nlibrary ResourceData {\\n\\tusing SafeMathUpgradeable for uint256;\\n\\n\\tenum ResourceType {\\n\\t\\tNull,\\n\\t\\tBuildingTime,\\n\\t\\tBandwidth,\\n\\t\\tARStorage,\\n\\t\\tIPFSStorage\\n\\t}\\n\\n\\tstruct ValuePayload {\\n\\t\\tResourceData.ResourceType resourceType;\\n\\t\\tuint256[] values;\\n\\t}\\n\\n\\tstruct AmountPayload {\\n\\t\\tResourceData.ResourceType resourceType;\\n\\t\\tuint256[] amounts;\\n\\t}\\n\\n\\tstruct ValuePayloads {\\n\\t\\tResourceData.ValuePayload[] payloads;\\n\\t}\\n\\n\\tfunction convertSourceChainPayloads(ValuePayloads memory valuePayloads, uint256 dstAmount)\\n\\t\\tinternal\\n\\t\\tpure\\n\\t\\treturns (ResourceData.ValuePayload[] memory newPayloads)\\n\\t{\\n\\t\\tResourceData.ValuePayload[] memory payloads = valuePayloads.payloads;\\n\\t\\trequire(payloads.length > 0, 'ResourceData: invalid payload length');\\n\\t\\tuint256 total = totalValue(payloads);\\n\\t\\trequire(total > 0, 'ResourceData: zero total value');\\n\\t\\tfor (uint256 i = 0; i < payloads.length; i++) {\\n\\t\\t\\trequire(payloads[i].values.length > 0, 'ResourceData: invalid value length');\\n\\t\\t\\tfor (uint256 j = 0; j < payloads[i].values.length; j++) {\\n\\t\\t\\t\\tpayloads[i].values[j] = payloads[i].values[j].mul(dstAmount).div(total);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn payloads;\\n\\t}\\n\\n\\t/// @dev payment payload total value\\n\\t/// @param payloads payment payloads\\n\\t/// @return value total value\\n\\tfunction totalValue(ResourceData.ValuePayload[] memory payloads) internal pure returns (uint256 value) {\\n\\t\\trequire(payloads.length > 0, 'ResourceData: invalid payloads length');\\n\\t\\tfor (uint256 i = 0; i < payloads.length; i++) {\\n\\t\\t\\tfor (uint256 j = 0; j < payloads[i].values.length; j++) {\\n\\t\\t\\t\\tvalue = value.add(payloads[i].values[j]);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t/// @dev match token amount to resource decimals\\n\\t/// @param token token contract address\\n\\t/// @param value token amount with resource decimals\\n\\t/// @return resource value\\n\\tfunction matchTokenToResource(IERC20Upgradeable token, uint256 value) internal view returns (uint256) {\\n\\t\\tuint256 _tokenDecimals = tokenDecimals(token);\\n\\t\\tuint256 _resourceDecimals = decimals();\\n\\t\\tif (_tokenDecimals <= _resourceDecimals) {\\n\\t\\t\\treturn value.mul(10**(_resourceDecimals.sub(_tokenDecimals)));\\n\\t\\t}\\n\\t\\treturn value.div(10**(_tokenDecimals.sub(_resourceDecimals)));\\n\\t}\\n\\n\\t/// @dev match value to token decimals\\n\\t/// @param token token contract address\\n\\t/// @param value resource value\\n\\t/// @return token value\\n\\tfunction matchResourceToToken(IERC20Upgradeable token, uint256 value) internal view returns (uint256) {\\n\\t\\tuint256 _tokenDecimals = tokenDecimals(token);\\n\\t\\tuint256 _resourceDecimals = decimals();\\n\\t\\tif (_tokenDecimals <= _resourceDecimals) {\\n\\t\\t\\treturn value.div(10**(_resourceDecimals.sub(_tokenDecimals)));\\n\\t\\t}\\n\\t\\treturn value.mul(10**(_tokenDecimals.sub(_resourceDecimals)));\\n\\t}\\n\\n\\t/// @dev return resource decimals\\n\\t/// @return resource decimals\\n\\tfunction decimals() internal pure returns (uint256) {\\n\\t\\treturn 18;\\n\\t}\\n\\n\\t/// @dev return token decimals\\n\\t/// @return token decimals\\n\\tfunction tokenDecimals(IERC20Upgradeable token) internal view returns (uint256) {\\n\\t\\t// keccak256(bytes4('decimals()'))\\n\\t\\t(bool success, bytes memory data) = address(token).staticcall(hex'313ce567');\\n\\t\\trequire(success, 'ResourceData: invalid token');\\n\\t\\treturn abi.decode(data, (uint256));\\n\\t}\\n}\\n\",\"keccak256\":\"0x0a952dc446468e24ad4fed971632b1c8408818ed86649ff01e662aa93decb050\",\"license\":\"UNLICENSE\"},\"contracts/resources/interfaces/IIPFSStorageController.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSE\\n\\npragma solidity >=0.8.0;\\nimport '@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol';\\n\\n/// @author Alexandas\\n/// @dev IPFS storage controller interface\\ninterface IIPFSStorageController {\\n\\tstruct Storage {\\n\\t\\tuint256 startTime;\\n\\t\\tuint256 expiration;\\n\\t\\tuint256 amount;\\n\\t}\\n\\n\\t/// @dev emit when ipfs storage allocated for the provider\\n\\t/// @param provider provider address\\n\\t/// @param amount ipfs storage amount\\n\\t/// @param expiration ipfs storage expiration\\n\\tevent ProviderAllocated(address provider, uint256 amount, uint256 expiration);\\n\\n\\t/// @dev emit when ipfs storage allocated for the account\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param amount ipfs storage amount\\n\\t/// @param expiration ipfs storage expiration\\n\\tevent AccountAllocated(address provider, bytes32 account, uint256 amount, uint256 expiration);\\n\\n\\t/// @dev emit when provider recovered ipfs storage\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param amount ipfs storage amount\\n\\tevent ProviderRecovered(address provider, bytes32 account, uint256 amount);\\n\\n\\t/// @dev allocate user's normal resource balance\\n\\t/// @param provider provider address\\n\\t/// @param amount resource amount\\n\\t/// @param expiration ipfs expiration\\n\\tfunction allocateProvider(address provider, uint256 amount, uint256 expiration) external;\\n\\n\\t/// @dev provider drip resource to account directly\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param amount ipfs storage amount\\n\\t/// @param expiration ipfs expiration\\n\\tfunction drip(address provider, bytes32 account, uint256 amount, uint256 expiration) external;\\n\\n\\t/// @dev allocate user's resource balance\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param amount ipfs storage amount\\n\\t/// @param expiration ipfs expiration\\n\\tfunction paymentAllocate(address provider, bytes32 account, uint256 amount, uint256 expiration) external;\\n\\n\\t/// @dev recover provider storage\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\tfunction recoverStorage(address provider, bytes32 account) external;\\n\\n\\t/// @dev return whether ipfs storage is expired for the provider\\n\\t/// @param provider provider address\\n\\t/// @return whether ipfs storage is expired for the provider\\n\\tfunction isProviderExpired(address provider) external view returns (bool);\\n\\n\\t/// @dev return ipfs storage start time for the provider\\n\\t/// @param provider provider address\\n\\t/// @return start time for the provider\\n\\tfunction providerStartTime(address provider) external view returns (uint256);\\n\\n\\t/// @dev return total expiration time for the provider\\n\\t/// @param provider provider address\\n\\t/// @return total expiration time for the provider\\n\\tfunction providerExpiration(address provider) external view returns (uint256);\\n\\n\\t/// @dev return available expiration time for the provider\\n\\t/// @param provider provider address\\n\\t/// @return available expiration time for the provider\\n\\tfunction providerAvailableExpiration(address provider) external view returns (uint256);\\n\\n\\t/// @dev return when the provider will expire\\n\\t/// @param provider provider address\\n\\t/// @return when the provider will expire\\n\\tfunction providerExpiredAt(address provider) external view returns (uint256);\\n\\n\\t/// @dev return ipfs storage amount for the provider\\n\\t/// @param provider provider address\\n\\t/// @return ipfs storage amount for the provider\\n\\tfunction providerBalanceOf(address provider) external view returns (uint256);\\n\\n\\t/// @dev return whether ipfs storage is expired for the account\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @return whether ipfs storage is expired for the account\\n\\tfunction isExpired(address provider, bytes32 account) external view returns (bool);\\n\\n\\t/// @dev return available expiration time for the account\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @return available expiration time for the account\\n\\tfunction availableExpiration(address provider, bytes32 account) external view returns (uint256);\\n\\n\\t/// @dev return when the account will expire\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @return when the account will expire\\n\\tfunction expiredAt(address provider, bytes32 account) external view returns (uint256);\\n\\n\\t/// @dev return ipfs storage start time for the account\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @return start time for the account\\n\\tfunction startTime(address provider, bytes32 account) external view returns (uint256);\\n\\n\\t/// @dev return total expiration time for the account\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @return total expiration time for the account\\n\\tfunction expiration(address provider, bytes32 account) external view returns (uint256);\\n\\n\\t/// @dev return ipfs storage amount for the account\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @return ipfs storage amount for the account\\n\\tfunction balanceOf(address provider, bytes32 account) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x737cd8d689d7a0ef9211d92c8d052bda00bc16ddb06ce326ee473c3ffc09a654\",\"license\":\"UNLICENSE\"},\"contracts/resources/interfaces/INormalResourceController.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSE\\n\\npragma solidity >=0.8.0;\\n\\n/// @author Alexandas\\n/// @dev normal resource controller interface\\ninterface INormalResourceController {\\n\\n\\t/// @dev emit when resource allocated for the provider\\n\\t/// @param provider provider address\\n\\t/// @param amount ipfs storage amount\\n\\tevent ProviderAllocated(address provider, uint256 amount);\\n\\n\\t/// @dev emit when resource allocated for the account\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param amount ipfs storage amount\\n\\tevent AccountAllocated(address provider, bytes32 account, uint256 amount);\\n\\n\\t/// @dev allocate resource for the provider\\n\\t/// @param provider provider address\\n\\t/// @param amount resource amount\\n\\tfunction allocateProvider(address provider, uint256 amount) external;\\n\\n\\t/// @dev allocate user's resource balance\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param amount resource amount\\n\\tfunction paymentAllocate(address provider, bytes32 account, uint256 amount) external;\\n\\n\\t/// @dev provider drip resource to account directly\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @param amount resource amount\\n\\tfunction drip(address provider, bytes32 account, uint256 amount) external;\\n\\n\\t/// @dev resource balance\\n\\t/// @param provider provider address\\n\\t/// @param account user account\\n\\t/// @return balance of the account\\n\\tfunction balanceOf(address provider, bytes32 account) external view returns (uint256);\\n\\n\\t/// @dev resource balance\\n\\t/// @param provider provider address\\n\\t/// @return balance of the account\\n\\tfunction providerBalanceOf(address provider) external view returns (uint256);\\n\\n}\\n\",\"keccak256\":\"0x7bf2ade38bde962e0b1430090225c343458a2fa9d002d413468e442a64fe76e7\",\"license\":\"UNLICENSE\"},\"contracts/resources/interfaces/IResourcePriceAdaptor.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSE\\n\\npragma solidity >=0.8.0;\\n\\nimport '../../libraries/ResourceData.sol';\\n\\n/// @author Alexandas\\n/// @dev resource adpator interface\\ninterface IResourcePriceAdaptor {\\n\\tstruct PriceAdaptor {\\n\\t\\tResourceData.ResourceType resourceType;\\n\\t\\tuint256 price;\\n\\t}\\n\\n\\t/// @dev emit when index block updated\\n\\t/// @param provider provider address\\n\\t/// @param priceIndexBlock price index block\\n\\tevent PriceIndexBlockUpdated(address provider, uint256 priceIndexBlock);\\n\\n\\t/// @dev emit when price updated\\n\\t/// @param provider provider address\\n\\t/// @param adaptors price adaptors\\n\\tevent PriceAdaptorsUpdated(address provider, PriceAdaptor[] adaptors);\\n\\n\\t/// @dev get price for resource at a specific block\\n\\t/// @param provider provider address\\n\\t/// @param resourceType resource type\\n\\t/// @param priceIndexBlock block number\\n\\t/// @return price for resource at a specific block\\n\\tfunction priceAt(address provider, ResourceData.ResourceType resourceType, uint256 priceIndexBlock) external view returns (uint256);\\n\\n\\t/// @dev get value for `amount` resource at a specific block\\n\\t/// @param provider provider address\\n\\t/// @param resourceType resource type\\n\\t/// @param amount resource amount\\n\\t/// @param priceIndexBlock block number\\n\\t/// @return token value in resource decimals(18)\\n\\tfunction getValueAt(\\n\\t\\taddress provider,\\n\\t\\tResourceData.ResourceType resourceType,\\n\\t\\tuint256 amount,\\n\\t\\tuint256 priceIndexBlock\\n\\t) external view returns (uint256);\\n\\n\\t/// @dev get amount resource with value at a specific block\\n\\t/// @param provider provider address\\n\\t/// @param resourceType resource type\\n\\t/// @param value token value\\n\\t/// @param priceIndexBlock block numer\\n\\t/// @return resource amount\\n\\tfunction getAmountAt(\\n\\t\\taddress provider,\\n\\t\\tResourceData.ResourceType resourceType,\\n\\t\\tuint256 value,\\n\\t\\tuint256 priceIndexBlock\\n\\t) external view returns (uint256);\\n\\n\\t/// @dev return resource price\\n\\t/// @param provider provider address\\n\\t/// @param resourceType resource type\\n\\t/// @return resource price\\n\\tfunction priceOf(address provider, ResourceData.ResourceType resourceType) external view returns (uint256);\\n\\n\\t/// @dev return value of amount resource\\n\\t/// @param provider provider address\\n\\t/// @param resourceType resource type\\n\\t/// @param amount resource amount\\n\\t/// @return token value in resource decimals(18)\\n\\tfunction getValueOf(address provider, ResourceData.ResourceType resourceType, uint256 amount) external view returns (uint256);\\n\\n\\t/// @dev return resource amount with value\\n\\t/// @param provider provider address\\n\\t/// @param resourceType resource type\\n\\t/// @param value token value in resource decimals(18)\\n\\t/// @return resource amount\\n\\tfunction getAmountOf(address provider, ResourceData.ResourceType resourceType, uint256 value) external view returns (uint256);\\n\\n}\\n\",\"keccak256\":\"0x777f11784c9b845ea144fa0eb3b33596e123e1f70f2952e9d7c24ce576fcf10d\",\"license\":\"UNLICENSE\"}},\"version\":1}",
  "bytecode": "0x60806040523480156200001157600080fd5b5060006200002060016200008e565b9050801562000039576000805461ff0019166101001790555b801562000087576000805461ff00191690556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906200007e9060019062000168565b60405180910390a15b50620001cb565b60008054610100900460ff1615620000f7578160ff166001148015620000c75750620000c5306200013b60201b62000d321760201c565b155b620000ef5760405162461bcd60e51b8152600401620000e69062000178565b60405180910390fd5b506000919050565b60005460ff808416911610620001215760405162461bcd60e51b8152600401620000e69062000178565b506000805460ff191660ff92909216919091179055600190565b6001600160a01b03163b151590565b600060ff82165b92915050565b62000162816200014a565b82525050565b6020810162000151828462000157565b602080825281016200015181602e81527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160208201526d191e481a5b9a5d1a585b1a5e995960921b604082015260600190565b61109a80620001db6000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063914fd2c311610104578063c4d66de8116100a2578063ed1f63d311610071578063ed1f63d3146103e5578063f2fde38b146103f8578063f760660e1461040b578063f931ca561461041e57600080fd5b8063c4d66de814610399578063e20ce6eb146103ac578063e70b7acb146103bf578063e8437249146103d257600080fd5b8063a2d2f2db116100de578063a2d2f2db1461034d578063a5a3f6c814610360578063ab033ea914610373578063c24126761461038657600080fd5b8063914fd2c3146103145780639453911214610327578063a1c841ca1461033a57600080fd5b8063429aafd91161017c578063715018a61161014b578063715018a6146102d5578063740e8061146102dd5780637a7fa753146102f05780638da5cb5b1461030357600080fd5b8063429aafd9146102895780634540a85b1461029c57806364f401ab146102af5780636ebdff2c146102c257600080fd5b8063144fa6d7116101b8578063144fa6d71461023057806322b31aba1461024357806337187fc3146102635780633b8ccfb11461027657600080fd5b80630251d6c3146101df5780630db81c35146101f45780630efdf9ac14610207575b600080fd5b6101f26101ed366004610e58565b610431565b005b6101f2610202366004610e58565b6104e0565b60655461021a906001600160a01b031681565b6040516102279190610e90565b60405180910390f35b6101f261023e366004610e58565b61057b565b606a54610256906001600160a01b031681565b6040516102279190610ece565b606e54610256906001600160a01b031681565b6101f2610284366004610ef0565b610616565b6101f2610297366004610e58565b6106b1565b6101f26102aa366004610e58565b61074c565b6101f26102bd366004610e58565b6107e7565b6101f26102d0366004610e58565b610882565b6101f261091d565b606d54610256906001600160a01b031681565b6101f26102fe366004610e58565b610953565b6033546001600160a01b031661021a565b6101f2610322366004610e58565b6109ee565b606654610256906001600160a01b031681565b606854610256906001600160a01b031681565b606c54610256906001600160a01b031681565b606754610256906001600160a01b031681565b6101f2610381366004610e58565b610a89565b606954610256906001600160a01b031681565b6101f26103a7366004610ef0565b610b24565b607054610256906001600160a01b031681565b607154610256906001600160a01b031681565b6101f26103e0366004610e58565b610ba0565b606f54610256906001600160a01b031681565b6101f2610406366004610ef0565b610c3b565b6101f2610419366004610e58565b610c97565b606b54610256906001600160a01b031681565b6033546001600160a01b031633146104645760405162461bcd60e51b815260040161045b90610f46565b60405180910390fd5b6001600160a01b03811661048a5760405162461bcd60e51b815260040161045b90610f81565b606e80546001600160a01b0319166001600160a01b0383161790556040517fefc72b6a1e0750c490adba6e2fad3861ed80249e7e9db7fa88133536978e1618906104d5908390610ece565b60405180910390a150565b6033546001600160a01b0316331461050a5760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b0381166105305760405162461bcd60e51b815260040161045b90610f81565b607080546001600160a01b0319166001600160a01b0383161790556040517fc5d588a42a81fee76e7e80a4ef88ac097d4b28eecfd9ac79629ae06eb3eae4b8906104d5908390610ece565b6033546001600160a01b031633146105a55760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b0381166105cb5760405162461bcd60e51b815260040161045b90610f81565b606980546001600160a01b0319166001600160a01b0383161790556040517f5ba6b30cd4b2f9e9e67f4feb9b9df10d5da3b057598e6901b217b7d590345e30906104d5908390610ece565b6033546001600160a01b031633146106405760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b0381166106665760405162461bcd60e51b815260040161045b90610f81565b606580546001600160a01b0319166001600160a01b0383161790556040517fafe9b28ca24a54df8c44769c685f7b92824aae021cdfcaa4719d493571a23c4c906104d5908390610e90565b6033546001600160a01b031633146106db5760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b0381166107015760405162461bcd60e51b815260040161045b90610f81565b606f80546001600160a01b0319166001600160a01b0383161790556040517ff2071e1b38ab3c561fb5d090a912ad00d911946da5f417b4eac46024a2f6ed60906104d5908390610ece565b6033546001600160a01b031633146107765760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b03811661079c5760405162461bcd60e51b815260040161045b90610f81565b606d80546001600160a01b0319166001600160a01b0383161790556040517f7b091d9397a2f75213edeec1728b27a9d863f0f8aafb62fce0f1154f48f110f8906104d5908390610ece565b6033546001600160a01b031633146108115760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b0381166108375760405162461bcd60e51b815260040161045b90610f81565b606880546001600160a01b0319166001600160a01b0383161790556040517f7877ecbc56deb4477526760cc3ac4edd24b62cb61fdcb7d768432dbe4b1c9e48906104d5908390610ece565b6033546001600160a01b031633146108ac5760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b0381166108d25760405162461bcd60e51b815260040161045b90610f81565b607180546001600160a01b0319166001600160a01b0383161790556040517f3d4983d02f8bc19207842d9d88346943f300d7737b764cead01f10f3b9d23147906104d5908390610ece565b6033546001600160a01b031633146109475760405162461bcd60e51b815260040161045b90610f46565b6109516000610d41565b565b6033546001600160a01b0316331461097d5760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b0381166109a35760405162461bcd60e51b815260040161045b90610f81565b606b80546001600160a01b0319166001600160a01b0383161790556040517f100702071f8eb4f459f5f9dcf12bba9b3aeafa0eca6a018364f645558d792c37906104d5908390610ece565b6033546001600160a01b03163314610a185760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b038116610a3e5760405162461bcd60e51b815260040161045b90610f81565b606c80546001600160a01b0319166001600160a01b0383161790556040517f6a7e09ebc58179cd1c17c89209474e58d29e43b1bf78dd57f896e7be983220eb906104d5908390610ece565b6033546001600160a01b03163314610ab35760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b038116610ad95760405162461bcd60e51b815260040161045b90610f81565b606680546001600160a01b0319166001600160a01b0383161790556040517f9d3e522e1e47a2f6009739342b9cc7b252a1888154e843ab55ee1c81745795ab906104d5908390610ece565b6000610b306001610d93565b90508015610b48576000805461ff0019166101001790555b610b5182610d41565b8015610b9c576000805461ff00191690556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890610b9390600190610fa5565b60405180910390a15b5050565b6033546001600160a01b03163314610bca5760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b038116610bf05760405162461bcd60e51b815260040161045b90610f81565b606a80546001600160a01b0319166001600160a01b0383161790556040517feb1b948f6c63784a1d91e42dd967c49aae87b1db36d3107e9b913963ae7cd039906104d5908390610ece565b6033546001600160a01b03163314610c655760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b038116610c8b5760405162461bcd60e51b815260040161045b90610ff9565b610c9481610d41565b50565b6033546001600160a01b03163314610cc15760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b038116610ce75760405162461bcd60e51b815260040161045b90610f81565b606780546001600160a01b0319166001600160a01b0383161790556040517fb8f8a6768be726978fef2f5342ee7b1d0eead3b5cbb0c5d55c68f56271ca0eeb906104d5908390610ece565b6001600160a01b03163b151590565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008054610100900460ff1615610dda578160ff166001148015610db65750303b155b610dd25760405162461bcd60e51b815260040161045b90611054565b506000919050565b60005460ff808416911610610e015760405162461bcd60e51b815260040161045b90611054565b506000805460ff191660ff92909216919091179055600190565b60006001600160a01b0382165b92915050565b6000610e2882610e1b565b610e4281610e2e565b8114610c9457600080fd5b8035610e2881610e39565b600060208284031215610e6d57610e6d600080fd5b6000610e798484610e4d565b949350505050565b610e8a81610e1b565b82525050565b60208101610e288284610e81565b60006001600160a01b038216610e28565b6000610e2882610e9e565b6000610e2882610eaf565b610e8a81610eba565b60208101610e288284610ec5565b610e4281610e1b565b8035610e2881610edc565b600060208284031215610f0557610f05600080fd5b6000610e798484610ee5565b60208082527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572910190815260005b5060200190565b60208082528101610e2881610f11565b6014815260006020820173526f757465723a207a65726f206164647265737360601b81529150610f3f565b60208082528101610e2881610f56565b600060ff8216610e28565b610e8a81610f91565b60208101610e288284610f9c565b602681526000602082017f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015291505b5060400190565b60208082528101610e2881610fb3565b602e81526000602082017f496e697469616c697a61626c653a20636f6e747261637420697320616c72656181526d191e481a5b9a5d1a585b1a5e995960921b60208201529150610ff2565b60208082528101610e288161100956fea26469706673582212209764ec0d94554fdcfddb22face98db3560554a2102040c7a6180adcf764bec6864736f6c63430008090033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101da5760003560e01c8063914fd2c311610104578063c4d66de8116100a2578063ed1f63d311610071578063ed1f63d3146103e5578063f2fde38b146103f8578063f760660e1461040b578063f931ca561461041e57600080fd5b8063c4d66de814610399578063e20ce6eb146103ac578063e70b7acb146103bf578063e8437249146103d257600080fd5b8063a2d2f2db116100de578063a2d2f2db1461034d578063a5a3f6c814610360578063ab033ea914610373578063c24126761461038657600080fd5b8063914fd2c3146103145780639453911214610327578063a1c841ca1461033a57600080fd5b8063429aafd91161017c578063715018a61161014b578063715018a6146102d5578063740e8061146102dd5780637a7fa753146102f05780638da5cb5b1461030357600080fd5b8063429aafd9146102895780634540a85b1461029c57806364f401ab146102af5780636ebdff2c146102c257600080fd5b8063144fa6d7116101b8578063144fa6d71461023057806322b31aba1461024357806337187fc3146102635780633b8ccfb11461027657600080fd5b80630251d6c3146101df5780630db81c35146101f45780630efdf9ac14610207575b600080fd5b6101f26101ed366004610e58565b610431565b005b6101f2610202366004610e58565b6104e0565b60655461021a906001600160a01b031681565b6040516102279190610e90565b60405180910390f35b6101f261023e366004610e58565b61057b565b606a54610256906001600160a01b031681565b6040516102279190610ece565b606e54610256906001600160a01b031681565b6101f2610284366004610ef0565b610616565b6101f2610297366004610e58565b6106b1565b6101f26102aa366004610e58565b61074c565b6101f26102bd366004610e58565b6107e7565b6101f26102d0366004610e58565b610882565b6101f261091d565b606d54610256906001600160a01b031681565b6101f26102fe366004610e58565b610953565b6033546001600160a01b031661021a565b6101f2610322366004610e58565b6109ee565b606654610256906001600160a01b031681565b606854610256906001600160a01b031681565b606c54610256906001600160a01b031681565b606754610256906001600160a01b031681565b6101f2610381366004610e58565b610a89565b606954610256906001600160a01b031681565b6101f26103a7366004610ef0565b610b24565b607054610256906001600160a01b031681565b607154610256906001600160a01b031681565b6101f26103e0366004610e58565b610ba0565b606f54610256906001600160a01b031681565b6101f2610406366004610ef0565b610c3b565b6101f2610419366004610e58565b610c97565b606b54610256906001600160a01b031681565b6033546001600160a01b031633146104645760405162461bcd60e51b815260040161045b90610f46565b60405180910390fd5b6001600160a01b03811661048a5760405162461bcd60e51b815260040161045b90610f81565b606e80546001600160a01b0319166001600160a01b0383161790556040517fefc72b6a1e0750c490adba6e2fad3861ed80249e7e9db7fa88133536978e1618906104d5908390610ece565b60405180910390a150565b6033546001600160a01b0316331461050a5760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b0381166105305760405162461bcd60e51b815260040161045b90610f81565b607080546001600160a01b0319166001600160a01b0383161790556040517fc5d588a42a81fee76e7e80a4ef88ac097d4b28eecfd9ac79629ae06eb3eae4b8906104d5908390610ece565b6033546001600160a01b031633146105a55760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b0381166105cb5760405162461bcd60e51b815260040161045b90610f81565b606980546001600160a01b0319166001600160a01b0383161790556040517f5ba6b30cd4b2f9e9e67f4feb9b9df10d5da3b057598e6901b217b7d590345e30906104d5908390610ece565b6033546001600160a01b031633146106405760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b0381166106665760405162461bcd60e51b815260040161045b90610f81565b606580546001600160a01b0319166001600160a01b0383161790556040517fafe9b28ca24a54df8c44769c685f7b92824aae021cdfcaa4719d493571a23c4c906104d5908390610e90565b6033546001600160a01b031633146106db5760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b0381166107015760405162461bcd60e51b815260040161045b90610f81565b606f80546001600160a01b0319166001600160a01b0383161790556040517ff2071e1b38ab3c561fb5d090a912ad00d911946da5f417b4eac46024a2f6ed60906104d5908390610ece565b6033546001600160a01b031633146107765760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b03811661079c5760405162461bcd60e51b815260040161045b90610f81565b606d80546001600160a01b0319166001600160a01b0383161790556040517f7b091d9397a2f75213edeec1728b27a9d863f0f8aafb62fce0f1154f48f110f8906104d5908390610ece565b6033546001600160a01b031633146108115760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b0381166108375760405162461bcd60e51b815260040161045b90610f81565b606880546001600160a01b0319166001600160a01b0383161790556040517f7877ecbc56deb4477526760cc3ac4edd24b62cb61fdcb7d768432dbe4b1c9e48906104d5908390610ece565b6033546001600160a01b031633146108ac5760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b0381166108d25760405162461bcd60e51b815260040161045b90610f81565b607180546001600160a01b0319166001600160a01b0383161790556040517f3d4983d02f8bc19207842d9d88346943f300d7737b764cead01f10f3b9d23147906104d5908390610ece565b6033546001600160a01b031633146109475760405162461bcd60e51b815260040161045b90610f46565b6109516000610d41565b565b6033546001600160a01b0316331461097d5760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b0381166109a35760405162461bcd60e51b815260040161045b90610f81565b606b80546001600160a01b0319166001600160a01b0383161790556040517f100702071f8eb4f459f5f9dcf12bba9b3aeafa0eca6a018364f645558d792c37906104d5908390610ece565b6033546001600160a01b03163314610a185760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b038116610a3e5760405162461bcd60e51b815260040161045b90610f81565b606c80546001600160a01b0319166001600160a01b0383161790556040517f6a7e09ebc58179cd1c17c89209474e58d29e43b1bf78dd57f896e7be983220eb906104d5908390610ece565b6033546001600160a01b03163314610ab35760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b038116610ad95760405162461bcd60e51b815260040161045b90610f81565b606680546001600160a01b0319166001600160a01b0383161790556040517f9d3e522e1e47a2f6009739342b9cc7b252a1888154e843ab55ee1c81745795ab906104d5908390610ece565b6000610b306001610d93565b90508015610b48576000805461ff0019166101001790555b610b5182610d41565b8015610b9c576000805461ff00191690556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890610b9390600190610fa5565b60405180910390a15b5050565b6033546001600160a01b03163314610bca5760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b038116610bf05760405162461bcd60e51b815260040161045b90610f81565b606a80546001600160a01b0319166001600160a01b0383161790556040517feb1b948f6c63784a1d91e42dd967c49aae87b1db36d3107e9b913963ae7cd039906104d5908390610ece565b6033546001600160a01b03163314610c655760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b038116610c8b5760405162461bcd60e51b815260040161045b90610ff9565b610c9481610d41565b50565b6033546001600160a01b03163314610cc15760405162461bcd60e51b815260040161045b90610f46565b6001600160a01b038116610ce75760405162461bcd60e51b815260040161045b90610f81565b606780546001600160a01b0319166001600160a01b0383161790556040517fb8f8a6768be726978fef2f5342ee7b1d0eead3b5cbb0c5d55c68f56271ca0eeb906104d5908390610ece565b6001600160a01b03163b151590565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008054610100900460ff1615610dda578160ff166001148015610db65750303b155b610dd25760405162461bcd60e51b815260040161045b90611054565b506000919050565b60005460ff808416911610610e015760405162461bcd60e51b815260040161045b90611054565b506000805460ff191660ff92909216919091179055600190565b60006001600160a01b0382165b92915050565b6000610e2882610e1b565b610e4281610e2e565b8114610c9457600080fd5b8035610e2881610e39565b600060208284031215610e6d57610e6d600080fd5b6000610e798484610e4d565b949350505050565b610e8a81610e1b565b82525050565b60208101610e288284610e81565b60006001600160a01b038216610e28565b6000610e2882610e9e565b6000610e2882610eaf565b610e8a81610eba565b60208101610e288284610ec5565b610e4281610e1b565b8035610e2881610edc565b600060208284031215610f0557610f05600080fd5b6000610e798484610ee5565b60208082527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572910190815260005b5060200190565b60208082528101610e2881610f11565b6014815260006020820173526f757465723a207a65726f206164647265737360601b81529150610f3f565b60208082528101610e2881610f56565b600060ff8216610e28565b610e8a81610f91565b60208101610e288284610f9c565b602681526000602082017f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015291505b5060400190565b60208082528101610e2881610fb3565b602e81526000602082017f496e697469616c697a61626c653a20636f6e747261637420697320616c72656181526d191e481a5b9a5d1a585b1a5e995960921b60208201529150610ff2565b60208082528101610e288161100956fea26469706673582212209764ec0d94554fdcfddb22face98db3560554a2102040c7a6180adcf764bec6864736f6c63430008090033",
  "devdoc": {
    "author": "Alexandas",
    "details": "Router contract",
    "kind": "dev",
    "methods": {
      "initialize(address)": {
        "details": "proxy initialize function",
        "params": {
          "owner": "contract owner"
        }
      },
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "renounceOwnership()": {
        "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
      },
      "setARStorageController(address)": {
        "details": "update AR storage controller contract",
        "params": {
          "_arStorageController": "AR storage controller contract"
        }
      },
      "setBandwidthController(address)": {
        "details": "update bandwidth controller contract",
        "params": {
          "_bandwidthController": "bandwidth controller contract"
        }
      },
      "setBilling(address)": {
        "details": "update resource adaptor contract",
        "params": {
          "_billing": "billing contract"
        }
      },
      "setBuildingTimeController(address)": {
        "details": "update building time controller contract",
        "params": {
          "_buildingTimeController": "building time controller contract"
        }
      },
      "setDstChainPayment(address)": {
        "details": "update dst chain payment contract address",
        "params": {
          "_dstChainPayment": "dst chain payment contract address"
        }
      },
      "setFundPool(address)": {
        "details": "update resource adaptor contract",
        "params": {
          "_pool": "fund pool contract"
        }
      },
      "setGovernance(address)": {
        "details": "update GoverDrip contract address",
        "params": {
          "_governance": "governance contract address"
        }
      },
      "setIPFSStorageController(address)": {
        "details": "update ipfs storage controller contract",
        "params": {
          "_ipfsStorageController": "IPFS storage controller contract"
        }
      },
      "setMessageReceiver(address)": {
        "details": "set messageReceiver contract address",
        "params": {
          "_messageReceiver": "message receiver contract address"
        }
      },
      "setProviderController(address)": {
        "details": "update provider controller contract address",
        "params": {
          "_providerController": "provider controller contract address"
        }
      },
      "setProviderRegistry(address)": {
        "details": "update provider registry contract",
        "params": {
          "_providerRegistry": "provider registry contract address"
        }
      },
      "setResourcePriceAdaptor(address)": {
        "details": "update resource adaptor contract",
        "params": {
          "_resourcePriceAdaptor": "resource adaptor contract"
        }
      },
      "setToken(address)": {
        "details": "update token address",
        "params": {
          "_token": "token address"
        }
      },
      "transferOwnership(address)": {
        "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
      }
    },
    "stateVariables": {
      "ARStorageController": {
        "details": "return AR storage controller"
      },
      "BandwidthController": {
        "details": "return bandwidth controller"
      },
      "Billing": {
        "details": "billing contract address"
      },
      "BuildingTimeController": {
        "details": "return building time controller"
      },
      "DstChainPayment": {
        "details": "dst chain payment contract address"
      },
      "FundPool": {
        "details": "fund pool contract address"
      },
      "Governance": {
        "details": "Governance contract address"
      },
      "IPFSStorageController": {
        "details": "return ipfs storage controller"
      },
      "MessageReceiver": {
        "details": "message receiver contract address"
      },
      "ProviderController": {
        "details": "provider controller contract address"
      },
      "ProviderRegistry": {
        "details": "providers contract address"
      },
      "ResourcePriceAdaptor": {
        "details": "return resource price adaptor contract address"
      },
      "Token": {
        "details": "token address"
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 147,
        "contract": "contracts/govers/Router.sol:Router",
        "label": "_initialized",
        "offset": 0,
        "slot": "0",
        "type": "t_uint8"
      },
      {
        "astId": 150,
        "contract": "contracts/govers/Router.sol:Router",
        "label": "_initializing",
        "offset": 1,
        "slot": "0",
        "type": "t_bool"
      },
      {
        "astId": 1038,
        "contract": "contracts/govers/Router.sol:Router",
        "label": "__gap",
        "offset": 0,
        "slot": "1",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 10,
        "contract": "contracts/govers/Router.sol:Router",
        "label": "_owner",
        "offset": 0,
        "slot": "51",
        "type": "t_address"
      },
      {
        "astId": 122,
        "contract": "contracts/govers/Router.sol:Router",
        "label": "__gap",
        "offset": 0,
        "slot": "52",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 5341,
        "contract": "contracts/govers/Router.sol:Router",
        "label": "MessageReceiver",
        "offset": 0,
        "slot": "101",
        "type": "t_address"
      },
      {
        "astId": 5346,
        "contract": "contracts/govers/Router.sol:Router",
        "label": "Governance",
        "offset": 0,
        "slot": "102",
        "type": "t_contract(IGovernance)6366"
      },
      {
        "astId": 5351,
        "contract": "contracts/govers/Router.sol:Router",
        "label": "ProviderRegistry",
        "offset": 0,
        "slot": "103",
        "type": "t_contract(IProviderRegistry)6667"
      },
      {
        "astId": 5356,
        "contract": "contracts/govers/Router.sol:Router",
        "label": "ProviderController",
        "offset": 0,
        "slot": "104",
        "type": "t_contract(IProviderController)6593"
      },
      {
        "astId": 5361,
        "contract": "contracts/govers/Router.sol:Router",
        "label": "Token",
        "offset": 0,
        "slot": "105",
        "type": "t_contract(IERC20Upgradeable)530"
      },
      {
        "astId": 5366,
        "contract": "contracts/govers/Router.sol:Router",
        "label": "BuildingTimeController",
        "offset": 0,
        "slot": "106",
        "type": "t_contract(INormalResourceController)11231"
      },
      {
        "astId": 5371,
        "contract": "contracts/govers/Router.sol:Router",
        "label": "BandwidthController",
        "offset": 0,
        "slot": "107",
        "type": "t_contract(INormalResourceController)11231"
      },
      {
        "astId": 5376,
        "contract": "contracts/govers/Router.sol:Router",
        "label": "ARStorageController",
        "offset": 0,
        "slot": "108",
        "type": "t_contract(INormalResourceController)11231"
      },
      {
        "astId": 5381,
        "contract": "contracts/govers/Router.sol:Router",
        "label": "IPFSStorageController",
        "offset": 0,
        "slot": "109",
        "type": "t_contract(IIPFSStorageController)11165"
      },
      {
        "astId": 5386,
        "contract": "contracts/govers/Router.sol:Router",
        "label": "ResourcePriceAdaptor",
        "offset": 0,
        "slot": "110",
        "type": "t_contract(IResourcePriceAdaptor)11356"
      },
      {
        "astId": 5391,
        "contract": "contracts/govers/Router.sol:Router",
        "label": "DstChainPayment",
        "offset": 0,
        "slot": "111",
        "type": "t_contract(IDstChainPayment)6230"
      },
      {
        "astId": 5396,
        "contract": "contracts/govers/Router.sol:Router",
        "label": "Billing",
        "offset": 0,
        "slot": "112",
        "type": "t_contract(IBilling)6091"
      },
      {
        "astId": 5401,
        "contract": "contracts/govers/Router.sol:Router",
        "label": "FundPool",
        "offset": 0,
        "slot": "113",
        "type": "t_contract(IFundPool)6333"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_uint256)49_storage": {
        "base": "t_uint256",
        "encoding": "inplace",
        "label": "uint256[49]",
        "numberOfBytes": "1568"
      },
      "t_array(t_uint256)50_storage": {
        "base": "t_uint256",
        "encoding": "inplace",
        "label": "uint256[50]",
        "numberOfBytes": "1600"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_contract(IBilling)6091": {
        "encoding": "inplace",
        "label": "contract IBilling",
        "numberOfBytes": "20"
      },
      "t_contract(IDstChainPayment)6230": {
        "encoding": "inplace",
        "label": "contract IDstChainPayment",
        "numberOfBytes": "20"
      },
      "t_contract(IERC20Upgradeable)530": {
        "encoding": "inplace",
        "label": "contract IERC20Upgradeable",
        "numberOfBytes": "20"
      },
      "t_contract(IFundPool)6333": {
        "encoding": "inplace",
        "label": "contract IFundPool",
        "numberOfBytes": "20"
      },
      "t_contract(IGovernance)6366": {
        "encoding": "inplace",
        "label": "contract IGovernance",
        "numberOfBytes": "20"
      },
      "t_contract(IIPFSStorageController)11165": {
        "encoding": "inplace",
        "label": "contract IIPFSStorageController",
        "numberOfBytes": "20"
      },
      "t_contract(INormalResourceController)11231": {
        "encoding": "inplace",
        "label": "contract INormalResourceController",
        "numberOfBytes": "20"
      },
      "t_contract(IProviderController)6593": {
        "encoding": "inplace",
        "label": "contract IProviderController",
        "numberOfBytes": "20"
      },
      "t_contract(IProviderRegistry)6667": {
        "encoding": "inplace",
        "label": "contract IProviderRegistry",
        "numberOfBytes": "20"
      },
      "t_contract(IResourcePriceAdaptor)11356": {
        "encoding": "inplace",
        "label": "contract IResourcePriceAdaptor",
        "numberOfBytes": "20"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      },
      "t_uint8": {
        "encoding": "inplace",
        "label": "uint8",
        "numberOfBytes": "1"
      }
    }
  }
}