From 74e6cfac019afb66f7116b7b3340af11d167f273 Mon Sep 17 00:00:00 2001 From: James Duncombe Date: Wed, 3 Apr 2024 18:28:59 +0100 Subject: [PATCH] Deploys Paymaster diamond to Amoy. --- deployments/amoy/Paymaster.json | 959 +++++++++++++++++++ deployments/amoy/PaymasterInitFacet.json | 93 ++ deployments/amoy/PaymasterTopFacet.json | 669 +++++++++++++ deployments/amoy/Paymaster_DiamondProxy.json | 903 +++++++++++++++++ 4 files changed, 2624 insertions(+) create mode 100644 deployments/amoy/Paymaster.json create mode 100644 deployments/amoy/PaymasterInitFacet.json create mode 100644 deployments/amoy/PaymasterTopFacet.json create mode 100644 deployments/amoy/Paymaster_DiamondProxy.json diff --git a/deployments/amoy/Paymaster.json b/deployments/amoy/Paymaster.json new file mode 100644 index 00000000..2f7dbe3e --- /dev/null +++ b/deployments/amoy/Paymaster.json @@ -0,0 +1,959 @@ +{ + "address": "0xf7E1464F712d6C1AF5e85ED711d3D3509792b903", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_contractOwner", + "type": "address" + }, + { + "components": [ + { + "internalType": "address", + "name": "facetAddress", + "type": "address" + }, + { + "internalType": "enum IDiamondCut.FacetCutAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "bytes4[]", + "name": "functionSelectors", + "type": "bytes4[]" + } + ], + "internalType": "struct IDiamondCut.FacetCut[]", + "name": "_diamondCut", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "address", + "name": "initContract", + "type": "address" + }, + { + "internalType": "bytes", + "name": "initData", + "type": "bytes" + } + ], + "internalType": "struct Diamond.Initialization[]", + "name": "_initializations", + "type": "tuple[]" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "ForwarderNotTrusted", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "InterfaceNotSupported", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidApprovalDataLength", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidPaymasterDataLength", + "type": "error" + }, + { + "inputs": [], + "name": "RelayHubAddressNotSet", + "type": "error" + }, + { + "inputs": [], + "name": "RequiresIssuerMemberCaller", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "who", + "type": "address" + } + ], + "name": "RequiresMarketplaceMembership", + "type": "error" + }, + { + "inputs": [], + "name": "RequiresRelayHubCaller", + "type": "error" + }, + { + "inputs": [], + "name": "ValueTransferNotSupported", + "type": "error" + }, + { + "inputs": [], + "name": "CALLDATA_SIZE_LIMIT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "FORWARDER_HUB_OVERHEAD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAYMASTER_ACCEPTANCE_BUDGET", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "POST_RELAYED_CALL_GAS_LIMIT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PRE_RELAYED_CALL_GAS_LIMIT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getGasAndDataLimits", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "acceptanceBudget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "preRelayedCallGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "postRelayedCallGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "calldataSizeLimit", + "type": "uint256" + } + ], + "internalType": "struct IPaymaster.GasAndDataLimits", + "name": "limits", + "type": "tuple" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getRelayHub", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTrustedForwarder", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "context", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "gasUseWithoutPost", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "maxFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPriorityFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "transactionCalldataGasUsed", + "type": "uint256" + }, + { + "internalType": "address", + "name": "relayWorker", + "type": "address" + }, + { + "internalType": "address", + "name": "paymaster", + "type": "address" + }, + { + "internalType": "address", + "name": "forwarder", + "type": "address" + }, + { + "internalType": "bytes", + "name": "paymasterData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "clientId", + "type": "uint256" + } + ], + "internalType": "struct GsnTypes.RelayData", + "name": "relayData", + "type": "tuple" + } + ], + "name": "postRelayedCall", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "gas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "validUntilTime", + "type": "uint256" + } + ], + "internalType": "struct IForwarder.ForwardRequest", + "name": "request", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "maxFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPriorityFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "transactionCalldataGasUsed", + "type": "uint256" + }, + { + "internalType": "address", + "name": "relayWorker", + "type": "address" + }, + { + "internalType": "address", + "name": "paymaster", + "type": "address" + }, + { + "internalType": "address", + "name": "forwarder", + "type": "address" + }, + { + "internalType": "bytes", + "name": "paymasterData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "clientId", + "type": "uint256" + } + ], + "internalType": "struct GsnTypes.RelayData", + "name": "relayData", + "type": "tuple" + } + ], + "internalType": "struct GsnTypes.RelayRequest", + "name": "relayRequest", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "approvalData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "preRelayedCall", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRelayHub", + "name": "hub", + "type": "address" + } + ], + "name": "setRelayHub", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "forwarder", + "type": "address" + } + ], + "name": "setTrustedForwarder", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "useRejectOnRecipientRevert", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "versionPaymaster", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "target", + "type": "address" + } + ], + "name": "withdrawRelayHubDepositTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "facetAddress", + "type": "address" + }, + { + "internalType": "enum IDiamondCut.FacetCutAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "bytes4[]", + "name": "functionSelectors", + "type": "bytes4[]" + } + ], + "indexed": false, + "internalType": "struct IDiamondCut.FacetCut[]", + "name": "_diamondCut", + "type": "tuple[]" + }, + { + "indexed": false, + "internalType": "address", + "name": "_init", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_calldata", + "type": "bytes" + } + ], + "name": "DiamondCut", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "facetAddress", + "type": "address" + }, + { + "internalType": "enum IDiamondCut.FacetCutAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "bytes4[]", + "name": "functionSelectors", + "type": "bytes4[]" + } + ], + "internalType": "struct IDiamondCut.FacetCut[]", + "name": "_diamondCut", + "type": "tuple[]" + }, + { + "internalType": "address", + "name": "_init", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_calldata", + "type": "bytes" + } + ], + "name": "diamondCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "owner_", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_functionSelector", + "type": "bytes4" + } + ], + "name": "facetAddress", + "outputs": [ + { + "internalType": "address", + "name": "facetAddress_", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "facetAddresses", + "outputs": [ + { + "internalType": "address[]", + "name": "facetAddresses_", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_facet", + "type": "address" + } + ], + "name": "facetFunctionSelectors", + "outputs": [ + { + "internalType": "bytes4[]", + "name": "facetFunctionSelectors_", + "type": "bytes4[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "facets", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "facetAddress", + "type": "address" + }, + { + "internalType": "bytes4[]", + "name": "functionSelectors", + "type": "bytes4[]" + } + ], + "internalType": "struct IDiamondLoupe.Facet[]", + "name": "facets_", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x73d766fe3e28b3fe8ee211354b1fba8aa5d15eba720e52f7443f9ba8a0a7ee2a", + "receipt": { + "to": "0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7", + "from": "0x717634cfe06FFAB2CEAA7fcf1b9019813f4B25FE", + "contractAddress": null, + "transactionIndex": 0, + "gasUsed": "2774465", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000100000000008000000000000000000000400000000000000000000000000840000000800001000001000000000900001000000000000000020000000000000000000800000000000000000080000000000000400020000000000000000000000000000000000000000000000000000000000000200000004000000000000000000000000000000000000000000000000000004000000000000000000081000000000000000000000000000000100000000020000000000000000000000400000000008000000000000000000000000000100000", + "blockHash": "0x4b2f3e9472a1f05cb7c0b01bb60d1f038aa6cac5f5b1b457d743cc16aafbbe28", + "transactionHash": "0x73d766fe3e28b3fe8ee211354b1fba8aa5d15eba720e52f7443f9ba8a0a7ee2a", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 5430709, + "transactionHash": "0x73d766fe3e28b3fe8ee211354b1fba8aa5d15eba720e52f7443f9ba8a0a7ee2a", + "address": "0xf7E1464F712d6C1AF5e85ED711d3D3509792b903", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000717634cfe06ffab2ceaa7fcf1b9019813f4b25fe" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x4b2f3e9472a1f05cb7c0b01bb60d1f038aa6cac5f5b1b457d743cc16aafbbe28" + }, + { + "transactionIndex": 0, + "blockNumber": 5430709, + "transactionHash": "0x73d766fe3e28b3fe8ee211354b1fba8aa5d15eba720e52f7443f9ba8a0a7ee2a", + "address": "0xf7E1464F712d6C1AF5e85ED711d3D3509792b903", + "topics": [ + "0x8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000460000000000000000000000000a6b9c6a2beecd86be8b260b21950fc324d5e74560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000105c5e3db100000000000000000000000000000000000000000000000000000000b90b41cf00000000000000000000000000000000000000000000000000000000df463a6600000000000000000000000000000000000000000000000000000000bbdaa3c900000000000000000000000000000000000000000000000000000000f9c002f700000000000000000000000000000000000000000000000000000000d0e30db000000000000000000000000000000000000000000000000000000000b039a88f000000000000000000000000000000000000000000000000000000007bdf2ec700000000000000000000000000000000000000000000000000000000ce1b815f0000000000000000000000000000000000000000000000000000000076fa01c30000000000000000000000000000000000000000000000000000000000be5dd4000000000000000000000000000000000000000000000000000000007bb0526400000000000000000000000000000000000000000000000000000000da742228000000000000000000000000000000000000000000000000000000004f33b4dd00000000000000000000000000000000000000000000000000000000921276ea000000000000000000000000000000000000000000000000000000002d14c4b700000000000000000000000000000000000000000000000000000000000000000000000000000000c9f56f2d03682dfeff086e0863fa286bcecd135e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000011f931c1c00000000000000000000000000000000000000000000000000000000000000000000000000000000826a7b5a4ca07decad923eef9493876d158ae7950000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000028da5cb5b00000000000000000000000000000000000000000000000000000000f2fde38b0000000000000000000000000000000000000000000000000000000000000000000000000000000076b56a1c775754a6970837fae291ca4907b9f1b8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000005cdffacc60000000000000000000000000000000000000000000000000000000052ef6b2c00000000000000000000000000000000000000000000000000000000adfca15e000000000000000000000000000000000000000000000000000000007a0ed6270000000000000000000000000000000000000000000000000000000001ffc9a7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "logIndex": 1, + "blockHash": "0x4b2f3e9472a1f05cb7c0b01bb60d1f038aa6cac5f5b1b457d743cc16aafbbe28" + }, + { + "transactionIndex": 0, + "blockNumber": 5430709, + "transactionHash": "0x73d766fe3e28b3fe8ee211354b1fba8aa5d15eba720e52f7443f9ba8a0a7ee2a", + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000717634cfe06ffab2ceaa7fcf1b9019813f4b25fe", + "0x0000000000000000000000004ad84f7014b7b44f723f284a85b1662337971439" + ], + "data": "0x000000000000000000000000000000000000000000000000000ec90ab452c23b000000000000000000000000000000000000000000000000038ea818c7415e86000000000000000000000000000000000000000000000028ed42919ad69adeb2000000000000000000000000000000000000000000000000037fdf0e12ee9c4b000000000000000000000000000000000000000000000028ed515aa58aeda0ed", + "logIndex": 2, + "blockHash": "0x4b2f3e9472a1f05cb7c0b01bb60d1f038aa6cac5f5b1b457d743cc16aafbbe28" + } + ], + "blockNumber": 5430709, + "cumulativeGasUsed": "2774465", + "status": 1, + "byzantium": true + }, + "args": [ + "0x717634cfe06FFAB2CEAA7fcf1b9019813f4B25FE", + [ + { + "facetAddress": "0xa6b9c6a2BeEcD86bE8b260b21950FC324D5e7456", + "functionSelectors": [ + "0x5c5e3db1", + "0xb90b41cf", + "0xdf463a66", + "0xbbdaa3c9", + "0xf9c002f7", + "0xd0e30db0", + "0xb039a88f", + "0x7bdf2ec7", + "0xce1b815f", + "0x76fa01c3", + "0x00be5dd4", + "0x7bb05264", + "0xda742228", + "0x4f33b4dd", + "0x921276ea", + "0x2d14c4b7" + ], + "action": 0 + }, + { + "facetAddress": "0xc9f56F2D03682dfeFf086e0863Fa286bcEcD135E", + "functionSelectors": [ + "0x1f931c1c" + ], + "action": 0 + }, + { + "facetAddress": "0x826a7b5a4Ca07dEcaD923EEF9493876d158ae795", + "functionSelectors": [ + "0x8da5cb5b", + "0xf2fde38b" + ], + "action": 0 + }, + { + "facetAddress": "0x76b56a1C775754a6970837FAE291Ca4907B9f1b8", + "functionSelectors": [ + "0xcdffacc6", + "0x52ef6b2c", + "0xadfca15e", + "0x7a0ed627", + "0x01ffc9a7" + ], + "action": 0 + } + ], + [ + { + "initContract": "0xc89B8d4A22CF47BA10191b41BF99F5F7dBe5F3f1", + "initData": "0x2a84809100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000148e2b093000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "initContract": "0x55BeFe5E916fAcF8ce99356acCa9Bec066f86cD2", + "initData": "0xb6a597dd000000000000000000000000c3a6cf54e39e49b7d5e927b96f8f5ba200853c41000000000000000000000000385d8298eacdba2002313feea062b1c3dd5da4ad" + } + ] + ], + "numDeployments": 1, + "solcInputHash": "3fe12e823553336a8d0f950a5a792ac9", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contractOwner\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"facetAddress\",\"type\":\"address\"},{\"internalType\":\"enum IDiamondCut.FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"functionSelectors\",\"type\":\"bytes4[]\"}],\"internalType\":\"struct IDiamondCut.FacetCut[]\",\"name\":\"_diamondCut\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"initContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initData\",\"type\":\"bytes\"}],\"internalType\":\"struct Diamond.Initialization[]\",\"name\":\"_initializations\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_contractOwner\":\"the owner of the contract. With default DiamondCutFacet, this is the sole address allowed to make further cuts.\",\"_diamondCut\":\"the list of facet to add\",\"_initializations\":\"the list of initialization pair to execute. This allow to setup a contract with multiple level of independent initialization.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"This construct a diamond contract\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/diamond/Diamond.sol\":\"Diamond\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/diamond/Diamond.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/******************************************************************************\\\\\\n* Author: Nick Mudge (https://twitter.com/mudgen)\\n* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535\\n*\\n* Implementation of a diamond.\\n/******************************************************************************/\\n\\nimport {LibDiamond} from \\\"./libraries/LibDiamond.sol\\\";\\nimport {IDiamondCut} from \\\"./interfaces/IDiamondCut.sol\\\";\\n\\ncontract Diamond {\\n struct Initialization {\\n address initContract;\\n bytes initData;\\n }\\n\\n /// @notice This construct a diamond contract\\n /// @param _contractOwner the owner of the contract. With default DiamondCutFacet, this is the sole address allowed to make further cuts.\\n /// @param _diamondCut the list of facet to add\\n /// @param _initializations the list of initialization pair to execute. This allow to setup a contract with multiple level of independent initialization.\\n constructor(\\n address _contractOwner,\\n IDiamondCut.FacetCut[] memory _diamondCut,\\n Initialization[] memory _initializations\\n ) payable {\\n if (_contractOwner != address(0)) {\\n LibDiamond.setContractOwner(_contractOwner);\\n }\\n\\n LibDiamond.diamondCut(_diamondCut, address(0), \\\"\\\");\\n\\n for (uint256 i = 0; i < _initializations.length; i++) {\\n LibDiamond.initializeDiamondCut(_initializations[i].initContract, _initializations[i].initData);\\n }\\n }\\n\\n // Find facet for function that is called and execute the\\n // function if a facet is found and return any value.\\n fallback() external payable {\\n LibDiamond.DiamondStorage storage ds;\\n bytes32 position = LibDiamond.DIAMOND_STORAGE_POSITION;\\n // get diamond storage\\n assembly {\\n ds.slot := position\\n }\\n // get facet from function selector\\n address facet = ds.selectorToFacetAndPosition[msg.sig].facetAddress;\\n require(facet != address(0), \\\"Diamond: Function does not exist\\\");\\n // Execute external function from facet using delegatecall and return any value.\\n assembly {\\n // copy function selector and any arguments\\n calldatacopy(0, 0, calldatasize())\\n // execute function call using the facet\\n let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0)\\n // get any return value\\n returndatacopy(0, 0, returndatasize())\\n // return any return value or error back to the caller\\n switch result\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n receive() external payable {}\\n}\\n\",\"keccak256\":\"0x9f459a9f18d5429b0dd40e60b4a67a27d2b94693c4d190ed9dd7034a894c1eb6\",\"license\":\"MIT\"},\"solc_0.8/diamond/interfaces/IDiamondCut.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/******************************************************************************\\\\\\n* Author: Nick Mudge (https://twitter.com/mudgen)\\n* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535\\n/******************************************************************************/\\n\\ninterface IDiamondCut {\\n enum FacetCutAction {Add, Replace, Remove}\\n // Add=0, Replace=1, Remove=2\\n\\n struct FacetCut {\\n address facetAddress;\\n FacetCutAction action;\\n bytes4[] functionSelectors;\\n }\\n\\n /// @notice Add/replace/remove any number of functions and optionally execute\\n /// a function with delegatecall\\n /// @param _diamondCut Contains the facet addresses and function selectors\\n /// @param _init The address of the contract or facet to execute _calldata\\n /// @param _calldata A function call, including function selector and arguments\\n /// _calldata is executed with delegatecall on _init\\n function diamondCut(\\n FacetCut[] calldata _diamondCut,\\n address _init,\\n bytes calldata _calldata\\n ) external;\\n\\n event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);\\n}\\n\",\"keccak256\":\"0xc00c16bfa30a3fa5f3dc684f7f8ba62c259962b25f647d9588739458989717fc\",\"license\":\"MIT\"},\"solc_0.8/diamond/libraries/LibDiamond.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/******************************************************************************\\\\\\n* Author: Nick Mudge (https://twitter.com/mudgen)\\n* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535\\n/******************************************************************************/\\nimport { IDiamondCut } from \\\"../interfaces/IDiamondCut.sol\\\";\\n\\nlibrary LibDiamond {\\n bytes32 constant DIAMOND_STORAGE_POSITION = keccak256(\\\"diamond.standard.diamond.storage\\\");\\n\\n struct FacetAddressAndPosition {\\n address facetAddress;\\n uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array\\n }\\n\\n struct FacetFunctionSelectors {\\n bytes4[] functionSelectors;\\n uint256 facetAddressPosition; // position of facetAddress in facetAddresses array\\n }\\n\\n struct DiamondStorage {\\n // maps function selector to the facet address and\\n // the position of the selector in the facetFunctionSelectors.selectors array\\n mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition;\\n // maps facet addresses to function selectors\\n mapping(address => FacetFunctionSelectors) facetFunctionSelectors;\\n // facet addresses\\n address[] facetAddresses;\\n // Used to query if a contract implements an interface.\\n // Used to implement ERC-165.\\n mapping(bytes4 => bool) supportedInterfaces;\\n // owner of the contract\\n address contractOwner;\\n }\\n\\n function diamondStorage() internal pure returns (DiamondStorage storage ds) {\\n bytes32 position = DIAMOND_STORAGE_POSITION;\\n assembly {\\n ds.slot := position\\n }\\n }\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n function setContractOwner(address _newOwner) internal {\\n DiamondStorage storage ds = diamondStorage();\\n address previousOwner = ds.contractOwner;\\n ds.contractOwner = _newOwner;\\n emit OwnershipTransferred(previousOwner, _newOwner);\\n }\\n\\n function contractOwner() internal view returns (address contractOwner_) {\\n contractOwner_ = diamondStorage().contractOwner;\\n }\\n\\n function enforceIsContractOwner() internal view {\\n require(msg.sender == diamondStorage().contractOwner, \\\"LibDiamond: Must be contract owner\\\");\\n }\\n\\n event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata);\\n\\n // Internal function version of diamondCut\\n function diamondCut(\\n IDiamondCut.FacetCut[] memory _diamondCut,\\n address _init,\\n bytes memory _calldata\\n ) internal {\\n for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) {\\n IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action;\\n if (action == IDiamondCut.FacetCutAction.Add) {\\n addFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);\\n } else if (action == IDiamondCut.FacetCutAction.Replace) {\\n replaceFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);\\n } else if (action == IDiamondCut.FacetCutAction.Remove) {\\n removeFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);\\n } else {\\n revert(\\\"LibDiamondCut: Incorrect FacetCutAction\\\");\\n }\\n }\\n emit DiamondCut(_diamondCut, _init, _calldata);\\n initializeDiamondCut(_init, _calldata);\\n }\\n\\n function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {\\n require(_functionSelectors.length > 0, \\\"LibDiamondCut: No selectors in facet to cut\\\");\\n DiamondStorage storage ds = diamondStorage(); \\n require(_facetAddress != address(0), \\\"LibDiamondCut: Add facet can't be address(0)\\\");\\n uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length);\\n // add new facet address if it does not exist\\n if (selectorPosition == 0) {\\n addFacet(ds, _facetAddress); \\n }\\n for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {\\n bytes4 selector = _functionSelectors[selectorIndex];\\n address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;\\n require(oldFacetAddress == address(0), \\\"LibDiamondCut: Can't add function that already exists\\\");\\n addFunction(ds, selector, selectorPosition, _facetAddress);\\n selectorPosition++;\\n }\\n }\\n\\n function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {\\n require(_functionSelectors.length > 0, \\\"LibDiamondCut: No selectors in facet to cut\\\");\\n DiamondStorage storage ds = diamondStorage();\\n require(_facetAddress != address(0), \\\"LibDiamondCut: Add facet can't be address(0)\\\");\\n uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length);\\n // add new facet address if it does not exist\\n if (selectorPosition == 0) {\\n addFacet(ds, _facetAddress);\\n }\\n for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {\\n bytes4 selector = _functionSelectors[selectorIndex];\\n address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;\\n require(oldFacetAddress != _facetAddress, \\\"LibDiamondCut: Can't replace function with same function\\\");\\n removeFunction(ds, oldFacetAddress, selector);\\n addFunction(ds, selector, selectorPosition, _facetAddress);\\n selectorPosition++;\\n }\\n }\\n\\n function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {\\n require(_functionSelectors.length > 0, \\\"LibDiamondCut: No selectors in facet to cut\\\");\\n DiamondStorage storage ds = diamondStorage();\\n // if function does not exist then do nothing and return\\n require(_facetAddress == address(0), \\\"LibDiamondCut: Remove facet address must be address(0)\\\");\\n for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {\\n bytes4 selector = _functionSelectors[selectorIndex];\\n address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;\\n removeFunction(ds, oldFacetAddress, selector);\\n }\\n }\\n\\n function addFacet(DiamondStorage storage ds, address _facetAddress) internal {\\n enforceHasContractCode(_facetAddress, \\\"LibDiamondCut: New facet has no code\\\");\\n ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds.facetAddresses.length;\\n ds.facetAddresses.push(_facetAddress);\\n } \\n\\n\\n function addFunction(DiamondStorage storage ds, bytes4 _selector, uint96 _selectorPosition, address _facetAddress) internal {\\n ds.selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition;\\n ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector);\\n ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress;\\n }\\n\\n function removeFunction(DiamondStorage storage ds, address _facetAddress, bytes4 _selector) internal { \\n require(_facetAddress != address(0), \\\"LibDiamondCut: Can't remove function that doesn't exist\\\");\\n // an immutable function is a function defined directly in a diamond\\n require(_facetAddress != address(this), \\\"LibDiamondCut: Can't remove immutable function\\\");\\n // replace selector with last selector, then delete last selector\\n uint256 selectorPosition = ds.selectorToFacetAndPosition[_selector].functionSelectorPosition;\\n uint256 lastSelectorPosition = ds.facetFunctionSelectors[_facetAddress].functionSelectors.length - 1;\\n // if not the same then replace _selector with lastSelector\\n if (selectorPosition != lastSelectorPosition) {\\n bytes4 lastSelector = ds.facetFunctionSelectors[_facetAddress].functionSelectors[lastSelectorPosition];\\n ds.facetFunctionSelectors[_facetAddress].functionSelectors[selectorPosition] = lastSelector;\\n ds.selectorToFacetAndPosition[lastSelector].functionSelectorPosition = uint96(selectorPosition);\\n }\\n // delete the last selector\\n ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop();\\n delete ds.selectorToFacetAndPosition[_selector];\\n\\n // if no more selectors for facet address then delete the facet address\\n if (lastSelectorPosition == 0) {\\n // replace facet address with last facet address and delete last facet address\\n uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1;\\n uint256 facetAddressPosition = ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;\\n if (facetAddressPosition != lastFacetAddressPosition) {\\n address lastFacetAddress = ds.facetAddresses[lastFacetAddressPosition];\\n ds.facetAddresses[facetAddressPosition] = lastFacetAddress;\\n ds.facetFunctionSelectors[lastFacetAddress].facetAddressPosition = facetAddressPosition;\\n }\\n ds.facetAddresses.pop();\\n delete ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;\\n }\\n }\\n\\n function initializeDiamondCut(address _init, bytes memory _calldata) internal {\\n if (_init == address(0)) {\\n require(_calldata.length == 0, \\\"LibDiamondCut: _init is address(0) but_calldata is not empty\\\");\\n } else {\\n require(_calldata.length > 0, \\\"LibDiamondCut: _calldata is empty but _init is not address(0)\\\");\\n if (_init != address(this)) {\\n enforceHasContractCode(_init, \\\"LibDiamondCut: _init address has no code\\\");\\n }\\n (bool success, bytes memory error) = _init.delegatecall(_calldata);\\n if (!success) {\\n if (error.length > 0) {\\n // bubble up the error\\n revert(string(error));\\n } else {\\n revert(\\\"LibDiamondCut: _init function reverted\\\");\\n }\\n }\\n }\\n }\\n\\n function enforceHasContractCode(address _contract, string memory _errorMessage) internal view {\\n uint256 contractSize;\\n assembly {\\n contractSize := extcodesize(_contract)\\n }\\n require(contractSize > 0, _errorMessage);\\n }\\n}\\n\",\"keccak256\":\"0x2205345e83eb86f5281f159a9215a096cb6d404782619f9b8e9d7a4a46c32a37\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040526040516200321e3803806200321e833981016040819052620000269162001340565b6001600160a01b038316156200004c576200004c83620000f760201b620001071760201c565b62000074826000604051806020016040528060008152506200017b60201b620001c11760201c565b60005b8151811015620000ed57620000d88282815181106200009a576200009a62001514565b602002602001015160000151838381518110620000bb57620000bb62001514565b602002602001015160200151620003d960201b620004051760201c565b80620000e48162001540565b91505062000077565b505050506200173d565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c132080546001600160a01b031981166001600160a01b0384811691821790935560405160008051602062003172833981519152939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60005b83518110156200038a5760008482815181106200019f576200019f62001514565b602002602001015160200151905060006002811115620001c357620001c36200155e565b816002811115620001d857620001d86200155e565b1415620002375762000231858381518110620001f857620001f862001514565b60200260200101516000015186848151811062000219576200021962001514565b602002602001015160400151620005fe60201b60201c565b62000374565b60018160028111156200024e576200024e6200155e565b1415620002a757620002318583815181106200026e576200026e62001514565b6020026020010151600001518684815181106200028f576200028f62001514565b6020026020010151604001516200088860201b60201c565b6002816002811115620002be57620002be6200155e565b1415620003175762000231858381518110620002de57620002de62001514565b602002602001015160000151868481518110620002ff57620002ff62001514565b60200260200101516040015162000b1e60201b60201c565b60405162461bcd60e51b815260206004820152602760248201527f4c69624469616d6f6e644375743a20496e636f727265637420466163657443756044820152663a20b1ba34b7b760c91b60648201526084015b60405180910390fd5b5080620003818162001540565b9150506200017e565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673838383604051620003c093929190620015a2565b60405180910390a1620003d48282620003d9565b505050565b6001600160a01b03821662000463578051156200045f5760405162461bcd60e51b815260206004820152603c60248201527f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860448201527f3029206275745f63616c6c64617461206973206e6f7420656d7074790000000060648201526084016200036b565b5050565b6000815111620004dc5760405162461bcd60e51b815260206004820152603d60248201527f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460448201527f7920627574205f696e6974206973206e6f74206164647265737328302900000060648201526084016200036b565b6001600160a01b038216301462000512576200051282604051806060016040528060288152602001620031926028913962000c7e565b600080836001600160a01b0316836040516200052f9190620016a9565b600060405180830381855af49150503d80600081146200056c576040519150601f19603f3d011682016040523d82523d6000602084013e62000571565b606091505b509150915081620005f857805115620005a0578060405162461bcd60e51b81526004016200036b9190620016c7565b60405162461bcd60e51b815260206004820152602660248201527f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e2072656044820152651d995c9d195960d21b60648201526084016200036b565b50505050565b6000815111620006545760405162461bcd60e51b815260206004820152602b6024820152600080516020620031fe83398151915260448201526a1858d95d081d1bc818dd5d60aa1b60648201526084016200036b565b600080516020620031728339815191526001600160a01b038316620006c05760405162461bcd60e51b815260206004820152602c6024820152600080516020620031ba83398151915260448201526b65206164647265737328302960a01b60648201526084016200036b565b6001600160a01b03831660009081526001820160205260409020546001600160601b038116620006f657620006f6828562000ca2565b60005b8351811015620008815760008482815181106200071a576200071a62001514565b6020908102919091018101516001600160e01b031981166000908152918690526040909120549091506001600160a01b03168015620007c25760405162461bcd60e51b815260206004820152603560248201527f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60448201527f6e207468617420616c726561647920657869737473000000000000000000000060648201526084016200036b565b6001600160e01b0319821660008181526020878152604080832080546001600160a01b03908116600160a01b6001600160601b038c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281546001600160a01b031916179055836200086681620016e3565b94505050508080620008789062001540565b915050620006f9565b5050505050565b6000815111620008de5760405162461bcd60e51b815260206004820152602b6024820152600080516020620031fe83398151915260448201526a1858d95d081d1bc818dd5d60aa1b60648201526084016200036b565b600080516020620031728339815191526001600160a01b0383166200094a5760405162461bcd60e51b815260206004820152602c6024820152600080516020620031ba83398151915260448201526b65206164647265737328302960a01b60648201526084016200036b565b6001600160a01b03831660009081526001820160205260409020546001600160601b038116620009805762000980828562000ca2565b60005b835181101562000881576000848281518110620009a457620009a462001514565b6020908102919091018101516001600160e01b031981166000908152918690526040909120549091506001600160a01b0390811690871681141562000a525760405162461bcd60e51b815260206004820152603860248201527f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60448201527f6374696f6e20776974682073616d652066756e6374696f6e000000000000000060648201526084016200036b565b62000a5f85828462000d0f565b6001600160e01b0319821660008181526020878152604080832080546001600160a01b03908116600160a01b6001600160601b038c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281546001600160a01b0319161790558362000b0381620016e3565b9450505050808062000b159062001540565b91505062000983565b600081511162000b745760405162461bcd60e51b815260206004820152602b6024820152600080516020620031fe83398151915260448201526a1858d95d081d1bc818dd5d60aa1b60648201526084016200036b565b600080516020620031728339815191526001600160a01b0383161562000c035760405162461bcd60e51b815260206004820152603660248201527f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260448201527f657373206d75737420626520616464726573732830290000000000000000000060648201526084016200036b565b60005b8251811015620005f857600083828151811062000c275762000c2762001514565b6020908102919091018101516001600160e01b031981166000908152918590526040909120549091506001600160a01b031662000c6684828462000d0f565b5050808062000c759062001540565b91505062000c06565b813b8181620005f85760405162461bcd60e51b81526004016200036b9190620016c7565b62000cc781604051806060016040528060248152602001620031da6024913962000c7e565b6002820180546001600160a01b0390921660008181526001948501602090815260408220860185905594840183559182529290200180546001600160a01b0319169091179055565b6001600160a01b03821662000d8d5760405162461bcd60e51b815260206004820152603760248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360448201527f74696f6e207468617420646f65736e277420657869737400000000000000000060648201526084016200036b565b6001600160a01b03821630141562000dff5760405162461bcd60e51b815260206004820152602e60248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560448201526d3a30b1363290333ab731ba34b7b760911b60648201526084016200036b565b6001600160e01b03198116600090815260208481526040808320546001600160a01b0386168452600180880190935290832054600160a01b9091046001600160601b0316929162000e50916200170d565b905080821462000f49576001600160a01b0384166000908152600186016020526040812080548390811062000e895762000e8962001514565b600091825260208083206008830401546001600160a01b038916845260018a019091526040909220805460079092166004026101000a90920460e01b92508291908590811062000edd5762000edd62001514565b600091825260208083206008830401805463ffffffff60079094166004026101000a938402191660e09590951c929092029390931790556001600160e01b03199290921682528690526040902080546001600160a01b0316600160a01b6001600160601b038516021790555b6001600160a01b0384166000908152600186016020526040902080548062000f755762000f7562001727565b60008281526020808220600860001990940193840401805463ffffffff600460078716026101000a0219169055919092556001600160e01b0319851682528690526040812055806200088157600285015460009062000fd7906001906200170d565b6001600160a01b03861660009081526001808901602052604090912001549091508082146200108d5760008760020183815481106200101a576200101a62001514565b6000918252602090912001546002890180546001600160a01b0390921692508291849081106200104e576200104e62001514565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055929091168152600189810190925260409020018190555b86600201805480620010a357620010a362001727565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0388168252600189810190915260408220015550505050505050565b80516001600160a01b03811681146200110457600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171562001144576200114462001109565b60405290565b604051606081016001600160401b038111828210171562001144576200114462001109565b604051601f8201601f191681016001600160401b03811182821017156200119a576200119a62001109565b604052919050565b60006001600160401b03821115620011be57620011be62001109565b5060051b60200190565b60005b83811015620011e5578181015183820152602001620011cb565b83811115620005f85750506000910152565b6000601f83818401126200120a57600080fd5b82516020620012236200121d83620011a2565b6200116f565b82815260059290921b850181019181810190878411156200124357600080fd5b8287015b84811015620013345780516001600160401b0380821115620012695760008081fd5b908901906040601f19838d038101821315620012855760008081fd5b6200128f6200111f565b6200129c898601620010ec565b81528285015184811115620012b15760008081fd5b8086019550508d603f860112620012c85760008081fd5b8885015184811115620012df57620012df62001109565b620012f08a848e840116016200116f565b94508085528e848288010111156200130a57600092508283fd5b6200131b818b8701868901620011c8565b5080890193909352505084525091830191830162001247565b50979650505050505050565b6000806000606084860312156200135657600080fd5b6200136184620010ec565b60208501519093506001600160401b03808211156200137f57600080fd5b818601915086601f8301126200139457600080fd5b8151620013a56200121d82620011a2565b8082825260208201915060208360051b860101925089831115620013c857600080fd5b602085015b83811015620014e057805185811115620013e657600080fd5b86016060818d03601f19011215620013fd57600080fd5b620014076200114a565b6200141560208301620010ec565b81526040820151600381106200142a57600080fd5b60208201526060820151878111156200144257600080fd5b8083019250508c603f8301126200145857600080fd5b60208201516200146c6200121d82620011a2565b81815260059190911b83016040019060208101908f8311156200148e57600080fd5b6040850194505b82851015620014c95784516001600160e01b031981168114620014b757600080fd5b82526020948501949091019062001495565b6040840152505084525060209283019201620013cd565b5060408901519096509350505080821115620014fb57600080fd5b506200150a86828701620011f7565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156200155757620015576200152a565b5060010190565b634e487b7160e01b600052602160045260246000fd5b600081518084526200158e816020860160208601620011c8565b601f01601f19169290920160200192915050565b60006060808301818452808751808352608092508286019150828160051b8701016020808b0160005b848110156200167757898403607f19018652815180516001600160a01b031685528381015189860190600381106200161357634e487b7160e01b600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b80831015620016615783516001600160e01b031916825292860192600192909201919086019062001635565b50978501979550505090820190600101620015cb565b50506001600160a01b038a169088015286810360408801526200169b818962001574565b9a9950505050505050505050565b60008251620016bd818460208701620011c8565b9190910192915050565b602081526000620016dc602083018462001574565b9392505050565b60006001600160601b03828116808214156200170357620017036200152a565b6001019392505050565b6000828210156200172257620017226200152a565b500390565b634e487b7160e01b600052603160045260246000fd5b611a25806200174d6000396000f3fe60806040523661000b57005b600080357fffffffff000000000000000000000000000000000000000000000000000000001681527fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c6020819052604090912054819073ffffffffffffffffffffffffffffffffffffffff16806100e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4469616d6f6e643a2046756e6374696f6e20646f6573206e6f7420657869737460448201526064015b60405180910390fd5b3660008037600080366000845af43d6000803e808015610102573d6000f35b3d6000fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c132080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff8481169182179093556040517fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60005b83518110156103ba5760008482815181106101e1576101e1611657565b60200260200101516020015190506000600281111561020257610202611686565b81600281111561021457610214611686565b14156102635761025e85838151811061022f5761022f611657565b60200260200101516000015186848151811061024d5761024d611657565b6020026020010151604001516106be565b6103a7565b600181600281111561027757610277611686565b14156102c15761025e85838151811061029257610292611657565b6020026020010151600001518684815181106102b0576102b0611657565b602002602001015160400151610a71565b60028160028111156102d5576102d5611686565b141561031f5761025e8583815181106102f0576102f0611657565b60200260200101516000015186848151811061030e5761030e611657565b602002602001015160400151610e2e565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4c69624469616d6f6e644375743a20496e636f7272656374204661636574437560448201527f74416374696f6e0000000000000000000000000000000000000000000000000060648201526084016100da565b50806103b2816116e4565b9150506101c4565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6738383836040516103ee93929190611793565b60405180910390a16104008282610405565b505050565b73ffffffffffffffffffffffffffffffffffffffff82166104b3578051156104af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860448201527f3029206275745f63616c6c64617461206973206e6f7420656d7074790000000060648201526084016100da565b5050565b6000815111610544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460448201527f7920627574205f696e6974206973206e6f74206164647265737328302900000060648201526084016100da565b73ffffffffffffffffffffffffffffffffffffffff8216301461058357610583826040518060600160405280602881526020016119a46028913961101b565b6000808373ffffffffffffffffffffffffffffffffffffffff16836040516105ab91906118fb565b600060405180830381855af49150503d80600081146105e6576040519150601f19603f3d011682016040523d82523d6000602084013e6105eb565b606091505b5091509150816106b85780511561063057806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100da9190611917565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e20726560448201527f766572746564000000000000000000000000000000000000000000000000000060648201526084016100da565b50505050565b600081511161074f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201527f6163657420746f2063757400000000000000000000000000000000000000000060648201526084016100da565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c73ffffffffffffffffffffffffffffffffffffffff8316610813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260448201527f652061646472657373283029000000000000000000000000000000000000000060648201526084016100da565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001820160205260409020546bffffffffffffffffffffffff8116610858576108588285611056565b60005b8351811015610a6a57600084828151811061087857610878611657565b6020908102919091018101517fffffffff00000000000000000000000000000000000000000000000000000000811660009081529186905260409091205490915073ffffffffffffffffffffffffffffffffffffffff16801561095d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60448201527f6e207468617420616c726561647920657869737473000000000000000000000060648201526084016100da565b7fffffffff000000000000000000000000000000000000000000000000000000008216600081815260208781526040808320805473ffffffffffffffffffffffffffffffffffffffff908116740100000000000000000000000000000000000000006bffffffffffffffffffffffff8c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281547fffffffffffffffffffffffff00000000000000000000000000000000000000001617905583610a5281611931565b94505050508080610a62906116e4565b91505061085b565b5050505050565b6000815111610b02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201527f6163657420746f2063757400000000000000000000000000000000000000000060648201526084016100da565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c73ffffffffffffffffffffffffffffffffffffffff8316610bc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260448201527f652061646472657373283029000000000000000000000000000000000000000060648201526084016100da565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001820160205260409020546bffffffffffffffffffffffff8116610c0b57610c0b8285611056565b60005b8351811015610a6a576000848281518110610c2b57610c2b611657565b6020908102919091018101517fffffffff00000000000000000000000000000000000000000000000000000000811660009081529186905260409091205490915073ffffffffffffffffffffffffffffffffffffffff908116908716811415610d16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60448201527f6374696f6e20776974682073616d652066756e6374696f6e000000000000000060648201526084016100da565b610d218582846110e5565b7fffffffff000000000000000000000000000000000000000000000000000000008216600081815260208781526040808320805473ffffffffffffffffffffffffffffffffffffffff908116740100000000000000000000000000000000000000006bffffffffffffffffffffffff8c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281547fffffffffffffffffffffffff00000000000000000000000000000000000000001617905583610e1681611931565b94505050508080610e26906116e4565b915050610c0e565b6000815111610ebf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201527f6163657420746f2063757400000000000000000000000000000000000000000060648201526084016100da565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c73ffffffffffffffffffffffffffffffffffffffff831615610f84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260448201527f657373206d75737420626520616464726573732830290000000000000000000060648201526084016100da565b60005b82518110156106b8576000838281518110610fa457610fa4611657565b6020908102919091018101517fffffffff00000000000000000000000000000000000000000000000000000000811660009081529185905260409091205490915073ffffffffffffffffffffffffffffffffffffffff166110068482846110e5565b50508080611013906116e4565b915050610f87565b813b81816106b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100da9190611917565b611078816040518060600160405280602481526020016119cc6024913961101b565b60028201805473ffffffffffffffffffffffffffffffffffffffff90921660008181526001948501602090815260408220860185905594840183559182529290200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b73ffffffffffffffffffffffffffffffffffffffff8216611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360448201527f74696f6e207468617420646f65736e277420657869737400000000000000000060648201526084016100da565b73ffffffffffffffffffffffffffffffffffffffff821630141561122e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560448201527f7461626c652066756e6374696f6e00000000000000000000000000000000000060648201526084016100da565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152602084815260408083205473ffffffffffffffffffffffffffffffffffffffff86168452600180880190935290832054740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff1692916112b89161195d565b90508082146113ff5773ffffffffffffffffffffffffffffffffffffffff8416600090815260018601602052604081208054839081106112fa576112fa611657565b6000918252602080832060088304015473ffffffffffffffffffffffffffffffffffffffff8916845260018a019091526040909220805460079092166004026101000a90920460e01b92508291908590811061135857611358611657565b600091825260208083206008830401805463ffffffff60079094166004026101000a938402191660e09590951c929092029390931790557fffffffff0000000000000000000000000000000000000000000000000000000092909216825286905260409020805473ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000006bffffffffffffffffffffffff8516021790555b73ffffffffffffffffffffffffffffffffffffffff84166000908152600186016020526040902080548061143557611435611974565b6000828152602080822060087fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193840401805463ffffffff600460078716026101000a0219169055919092557fffffffff0000000000000000000000000000000000000000000000000000000085168252869052604081205580610a6a5760028501546000906114ca9060019061195d565b73ffffffffffffffffffffffffffffffffffffffff861660009081526001808901602052604090912001549091508082146115b857600087600201838154811061151657611516611657565b60009182526020909120015460028901805473ffffffffffffffffffffffffffffffffffffffff909216925082918490811061155457611554611657565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055929091168152600189810190925260409020018190555b866002018054806115cb576115cb611974565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff88168252600189810190915260408220015550505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611716576117166116b5565b5060010190565b60005b83811015611738578181015183820152602001611720565b838111156106b85750506000910152565b6000815180845261176181602086016020860161171d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006060808301818452808751808352608092508286019150828160051b8701016020808b0160005b848110156118be577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808a8503018652815188850173ffffffffffffffffffffffffffffffffffffffff82511686528482015160038110611845577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b808310156118a95783517fffffffff00000000000000000000000000000000000000000000000000000000168252928601926001929092019190860190611867565b509785019795505050908201906001016117bc565b505073ffffffffffffffffffffffffffffffffffffffff8a169088015286810360408801526118ed8189611749565b9a9950505050505050505050565b6000825161190d81846020870161171d565b9190910192915050565b60208152600061192a6020830184611749565b9392505050565b60006bffffffffffffffffffffffff80831681811415611953576119536116b5565b6001019392505050565b60008282101561196f5761196f6116b5565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f6465a26469706673582212202b18a533b03703e1326000cf2f36b1c6ec631cff163a752d939e5ee79ad2cde364736f6c634300080a0033c8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204164642066616365742063616e277420624c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f64654c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e2066", + "deployedBytecode": "0x60806040523661000b57005b600080357fffffffff000000000000000000000000000000000000000000000000000000001681527fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c6020819052604090912054819073ffffffffffffffffffffffffffffffffffffffff16806100e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4469616d6f6e643a2046756e6374696f6e20646f6573206e6f7420657869737460448201526064015b60405180910390fd5b3660008037600080366000845af43d6000803e808015610102573d6000f35b3d6000fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c132080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff8481169182179093556040517fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60005b83518110156103ba5760008482815181106101e1576101e1611657565b60200260200101516020015190506000600281111561020257610202611686565b81600281111561021457610214611686565b14156102635761025e85838151811061022f5761022f611657565b60200260200101516000015186848151811061024d5761024d611657565b6020026020010151604001516106be565b6103a7565b600181600281111561027757610277611686565b14156102c15761025e85838151811061029257610292611657565b6020026020010151600001518684815181106102b0576102b0611657565b602002602001015160400151610a71565b60028160028111156102d5576102d5611686565b141561031f5761025e8583815181106102f0576102f0611657565b60200260200101516000015186848151811061030e5761030e611657565b602002602001015160400151610e2e565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4c69624469616d6f6e644375743a20496e636f7272656374204661636574437560448201527f74416374696f6e0000000000000000000000000000000000000000000000000060648201526084016100da565b50806103b2816116e4565b9150506101c4565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6738383836040516103ee93929190611793565b60405180910390a16104008282610405565b505050565b73ffffffffffffffffffffffffffffffffffffffff82166104b3578051156104af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860448201527f3029206275745f63616c6c64617461206973206e6f7420656d7074790000000060648201526084016100da565b5050565b6000815111610544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460448201527f7920627574205f696e6974206973206e6f74206164647265737328302900000060648201526084016100da565b73ffffffffffffffffffffffffffffffffffffffff8216301461058357610583826040518060600160405280602881526020016119a46028913961101b565b6000808373ffffffffffffffffffffffffffffffffffffffff16836040516105ab91906118fb565b600060405180830381855af49150503d80600081146105e6576040519150601f19603f3d011682016040523d82523d6000602084013e6105eb565b606091505b5091509150816106b85780511561063057806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100da9190611917565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e20726560448201527f766572746564000000000000000000000000000000000000000000000000000060648201526084016100da565b50505050565b600081511161074f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201527f6163657420746f2063757400000000000000000000000000000000000000000060648201526084016100da565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c73ffffffffffffffffffffffffffffffffffffffff8316610813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260448201527f652061646472657373283029000000000000000000000000000000000000000060648201526084016100da565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001820160205260409020546bffffffffffffffffffffffff8116610858576108588285611056565b60005b8351811015610a6a57600084828151811061087857610878611657565b6020908102919091018101517fffffffff00000000000000000000000000000000000000000000000000000000811660009081529186905260409091205490915073ffffffffffffffffffffffffffffffffffffffff16801561095d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60448201527f6e207468617420616c726561647920657869737473000000000000000000000060648201526084016100da565b7fffffffff000000000000000000000000000000000000000000000000000000008216600081815260208781526040808320805473ffffffffffffffffffffffffffffffffffffffff908116740100000000000000000000000000000000000000006bffffffffffffffffffffffff8c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281547fffffffffffffffffffffffff00000000000000000000000000000000000000001617905583610a5281611931565b94505050508080610a62906116e4565b91505061085b565b5050505050565b6000815111610b02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201527f6163657420746f2063757400000000000000000000000000000000000000000060648201526084016100da565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c73ffffffffffffffffffffffffffffffffffffffff8316610bc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260448201527f652061646472657373283029000000000000000000000000000000000000000060648201526084016100da565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001820160205260409020546bffffffffffffffffffffffff8116610c0b57610c0b8285611056565b60005b8351811015610a6a576000848281518110610c2b57610c2b611657565b6020908102919091018101517fffffffff00000000000000000000000000000000000000000000000000000000811660009081529186905260409091205490915073ffffffffffffffffffffffffffffffffffffffff908116908716811415610d16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60448201527f6374696f6e20776974682073616d652066756e6374696f6e000000000000000060648201526084016100da565b610d218582846110e5565b7fffffffff000000000000000000000000000000000000000000000000000000008216600081815260208781526040808320805473ffffffffffffffffffffffffffffffffffffffff908116740100000000000000000000000000000000000000006bffffffffffffffffffffffff8c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281547fffffffffffffffffffffffff00000000000000000000000000000000000000001617905583610e1681611931565b94505050508080610e26906116e4565b915050610c0e565b6000815111610ebf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201527f6163657420746f2063757400000000000000000000000000000000000000000060648201526084016100da565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c73ffffffffffffffffffffffffffffffffffffffff831615610f84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260448201527f657373206d75737420626520616464726573732830290000000000000000000060648201526084016100da565b60005b82518110156106b8576000838281518110610fa457610fa4611657565b6020908102919091018101517fffffffff00000000000000000000000000000000000000000000000000000000811660009081529185905260409091205490915073ffffffffffffffffffffffffffffffffffffffff166110068482846110e5565b50508080611013906116e4565b915050610f87565b813b81816106b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100da9190611917565b611078816040518060600160405280602481526020016119cc6024913961101b565b60028201805473ffffffffffffffffffffffffffffffffffffffff90921660008181526001948501602090815260408220860185905594840183559182529290200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b73ffffffffffffffffffffffffffffffffffffffff8216611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360448201527f74696f6e207468617420646f65736e277420657869737400000000000000000060648201526084016100da565b73ffffffffffffffffffffffffffffffffffffffff821630141561122e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560448201527f7461626c652066756e6374696f6e00000000000000000000000000000000000060648201526084016100da565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152602084815260408083205473ffffffffffffffffffffffffffffffffffffffff86168452600180880190935290832054740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff1692916112b89161195d565b90508082146113ff5773ffffffffffffffffffffffffffffffffffffffff8416600090815260018601602052604081208054839081106112fa576112fa611657565b6000918252602080832060088304015473ffffffffffffffffffffffffffffffffffffffff8916845260018a019091526040909220805460079092166004026101000a90920460e01b92508291908590811061135857611358611657565b600091825260208083206008830401805463ffffffff60079094166004026101000a938402191660e09590951c929092029390931790557fffffffff0000000000000000000000000000000000000000000000000000000092909216825286905260409020805473ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000006bffffffffffffffffffffffff8516021790555b73ffffffffffffffffffffffffffffffffffffffff84166000908152600186016020526040902080548061143557611435611974565b6000828152602080822060087fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193840401805463ffffffff600460078716026101000a0219169055919092557fffffffff0000000000000000000000000000000000000000000000000000000085168252869052604081205580610a6a5760028501546000906114ca9060019061195d565b73ffffffffffffffffffffffffffffffffffffffff861660009081526001808901602052604090912001549091508082146115b857600087600201838154811061151657611516611657565b60009182526020909120015460028901805473ffffffffffffffffffffffffffffffffffffffff909216925082918490811061155457611554611657565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055929091168152600189810190925260409020018190555b866002018054806115cb576115cb611974565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff88168252600189810190915260408220015550505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611716576117166116b5565b5060010190565b60005b83811015611738578181015183820152602001611720565b838111156106b85750506000910152565b6000815180845261176181602086016020860161171d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006060808301818452808751808352608092508286019150828160051b8701016020808b0160005b848110156118be577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808a8503018652815188850173ffffffffffffffffffffffffffffffffffffffff82511686528482015160038110611845577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b808310156118a95783517fffffffff00000000000000000000000000000000000000000000000000000000168252928601926001929092019190860190611867565b509785019795505050908201906001016117bc565b505073ffffffffffffffffffffffffffffffffffffffff8a169088015286810360408801526118ed8189611749565b9a9950505050505050505050565b6000825161190d81846020870161171d565b9190910192915050565b60208152600061192a6020830184611749565b9392505050565b60006bffffffffffffffffffffffff80831681811415611953576119536116b5565b6001019392505050565b60008282101561196f5761196f6116b5565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f6465a26469706673582212202b18a533b03703e1326000cf2f36b1c6ec631cff163a752d939e5ee79ad2cde364736f6c634300080a0033", + "facets": [ + { + "facetAddress": "0xa6b9c6a2BeEcD86bE8b260b21950FC324D5e7456", + "functionSelectors": [ + "0x5c5e3db1", + "0xb90b41cf", + "0xdf463a66", + "0xbbdaa3c9", + "0xf9c002f7", + "0xd0e30db0", + "0xb039a88f", + "0x7bdf2ec7", + "0xce1b815f", + "0x76fa01c3", + "0x00be5dd4", + "0x7bb05264", + "0xda742228", + "0x4f33b4dd", + "0x921276ea", + "0x2d14c4b7" + ] + }, + { + "facetAddress": "0xc9f56F2D03682dfeFf086e0863Fa286bcEcD135E", + "functionSelectors": [ + "0x1f931c1c" + ] + }, + { + "facetAddress": "0x826a7b5a4Ca07dEcaD923EEF9493876d158ae795", + "functionSelectors": [ + "0x8da5cb5b", + "0xf2fde38b" + ] + }, + { + "facetAddress": "0x76b56a1C775754a6970837FAE291Ca4907B9f1b8", + "functionSelectors": [ + "0xcdffacc6", + "0x52ef6b2c", + "0xadfca15e", + "0x7a0ed627", + "0x01ffc9a7" + ] + } + ], + "execute": { + "contract": "PaymasterInitFacet", + "methodName": "initialize", + "args": [ + { + "marketplace": "0xC3A6CF54e39E49B7D5e927B96F8f5ba200853C41", + "issuer": "0x385D8298eaCdba2002313fEeA062b1C3dd5da4aD" + } + ] + }, + "devdoc": { + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_contractOwner": "the owner of the contract. With default DiamondCutFacet, this is the sole address allowed to make further cuts.", + "_diamondCut": "the list of facet to add", + "_initializations": "the list of initialization pair to execute. This allow to setup a contract with multiple level of independent initialization." + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "constructor": { + "notice": "This construct a diamond contract" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/deployments/amoy/PaymasterInitFacet.json b/deployments/amoy/PaymasterInitFacet.json new file mode 100644 index 00000000..e72dbeef --- /dev/null +++ b/deployments/amoy/PaymasterInitFacet.json @@ -0,0 +1,93 @@ +{ + "address": "0x55BeFe5E916fAcF8ce99356acCa9Bec066f86cD2", + "abi": [ + { + "inputs": [], + "name": "AlreadyInitialized", + "type": "error" + }, + { + "inputs": [], + "name": "InternalMethod", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "marketplace", + "type": "address" + }, + { + "internalType": "address", + "name": "issuer", + "type": "address" + } + ], + "internalType": "struct PaymasterInitFacet.InitializerParams", + "name": "params", + "type": "tuple" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x08ca92b52ca0a180a5c8461485c1acdf9278f168ba8e80a8b036684b09437858", + "receipt": { + "to": "0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7", + "from": "0x717634cfe06FFAB2CEAA7fcf1b9019813f4B25FE", + "contractAddress": null, + "transactionIndex": 1, + "gasUsed": "283934", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000008000000000000000000000400000000000000000000000000040000000800000000000000000000100001000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000400000000008000000000000000000000000000100000", + "blockHash": "0x2be12a59690a3db1b76009a323baf14864bcb802624ef394e78e7ffc7687d368", + "transactionHash": "0x08ca92b52ca0a180a5c8461485c1acdf9278f168ba8e80a8b036684b09437858", + "logs": [ + { + "transactionIndex": 1, + "blockNumber": 5430705, + "transactionHash": "0x08ca92b52ca0a180a5c8461485c1acdf9278f168ba8e80a8b036684b09437858", + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000717634cfe06ffab2ceaa7fcf1b9019813f4b25fe", + "0x0000000000000000000000004ad84f7014b7b44f723f284a85b1662337971439" + ], + "data": "0x0000000000000000000000000000000000000000000000000001835acdbad86a00000000000000000000000000000000000000000000000003902b73953d33b2000000000000000000000000000000000000000000000028ed40f199de908e48000000000000000000000000000000000000000000000000038ea818c7825b48000000000000000000000000000000000000000000000028ed4274f4ac4b66b2", + "logIndex": 2, + "blockHash": "0x2be12a59690a3db1b76009a323baf14864bcb802624ef394e78e7ffc7687d368" + } + ], + "blockNumber": 5430705, + "cumulativeGasUsed": "304934", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "282aebb21cccc251bc099bdf4cf81fc0", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InternalMethod\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"marketplace\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"issuer\",\"type\":\"address\"}],\"internalType\":\"struct PaymasterInitFacet.InitializerParams\",\"name\":\"params\",\"type\":\"tuple\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"The Paymaster initialization facet.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/paymaster/PaymasterInitFacet.sol\":\"PaymasterInitFacet\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"@opengsn/contracts/src/forwarder/IForwarder.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity >=0.7.6;\\npragma abicoder v2;\\n\\nimport \\\"@openzeppelin/contracts/interfaces/IERC165.sol\\\";\\n\\n/**\\n * @title The Forwarder Interface\\n * @notice The contracts implementing this interface take a role of authorization, authentication and replay protection\\n * for contracts that choose to trust a `Forwarder`, instead of relying on a mechanism built into the Ethereum protocol.\\n *\\n * @notice if the `Forwarder` contract decides that an incoming `ForwardRequest` is valid, it must append 20 bytes that\\n * represent the caller to the `data` field of the request and send this new data to the target address (the `to` field)\\n *\\n * :warning: **Warning** :warning: The Forwarder can have a full control over a `Recipient` contract.\\n * Any vulnerability in a `Forwarder` implementation can make all of its `Recipient` contracts susceptible!\\n * Recipient contracts should only trust forwarders that passed through security audit,\\n * otherwise they are susceptible to identity theft.\\n */\\ninterface IForwarder is IERC165 {\\n\\n /**\\n * @notice A representation of a request for a `Forwarder` to send `data` on behalf of a `from` to a target (`to`).\\n */\\n struct ForwardRequest {\\n address from;\\n address to;\\n uint256 value;\\n uint256 gas;\\n uint256 nonce;\\n bytes data;\\n uint256 validUntilTime;\\n }\\n\\n event DomainRegistered(bytes32 indexed domainSeparator, bytes domainValue);\\n\\n event RequestTypeRegistered(bytes32 indexed typeHash, string typeStr);\\n\\n /**\\n * @param from The address of a sender.\\n * @return The nonce for this address.\\n */\\n function getNonce(address from)\\n external view\\n returns(uint256);\\n\\n /**\\n * @notice Verify the transaction is valid and can be executed.\\n * Implementations must validate the signature and the nonce of the request are correct.\\n * Does not revert and returns successfully if the input is valid.\\n * Reverts if any validation has failed. For instance, if either signature or nonce are incorrect.\\n * Reverts if `domainSeparator` or `requestTypeHash` are not registered as well.\\n */\\n function verify(\\n ForwardRequest calldata forwardRequest,\\n bytes32 domainSeparator,\\n bytes32 requestTypeHash,\\n bytes calldata suffixData,\\n bytes calldata signature\\n ) external view;\\n\\n /**\\n * @notice Executes a transaction specified by the `ForwardRequest`.\\n * The transaction is first verified and then executed.\\n * The success flag and returned bytes array of the `CALL` are returned as-is.\\n *\\n * This method would revert only in case of a verification error.\\n *\\n * All the target errors are reported using the returned success flag and returned bytes array.\\n *\\n * @param forwardRequest All requested transaction parameters.\\n * @param domainSeparator The domain used when signing this request.\\n * @param requestTypeHash The request type used when signing this request.\\n * @param suffixData The ABI-encoded extension data for the current `RequestType` used when signing this request.\\n * @param signature The client signature to be validated.\\n *\\n * @return success The success flag of the underlying `CALL` to the target address.\\n * @return ret The byte array returned by the underlying `CALL` to the target address.\\n */\\n function execute(\\n ForwardRequest calldata forwardRequest,\\n bytes32 domainSeparator,\\n bytes32 requestTypeHash,\\n bytes calldata suffixData,\\n bytes calldata signature\\n )\\n external payable\\n returns (bool success, bytes memory ret);\\n\\n /**\\n * @notice Register a new Request typehash.\\n *\\n * @notice This is necessary for the Forwarder to be able to verify the signatures conforming to the ERC-712.\\n *\\n * @param typeName The name of the request type.\\n * @param typeSuffix Any extra data after the generic params. Must contain add at least one param.\\n * The generic ForwardRequest type is always registered by the constructor.\\n */\\n function registerRequestType(string calldata typeName, string calldata typeSuffix) external;\\n\\n /**\\n * @notice Register a new domain separator.\\n *\\n * @notice This is necessary for the Forwarder to be able to verify the signatures conforming to the ERC-712.\\n *\\n * @notice The domain separator must have the following fields: `name`, `version`, `chainId`, `verifyingContract`.\\n * The `chainId` is the current network's `chainId`, and the `verifyingContract` is this Forwarder's address.\\n * This method accepts the domain name and version to create and register the domain separator value.\\n * @param name The domain's display name.\\n * @param version The domain/protocol version.\\n */\\n function registerDomainSeparator(string calldata name, string calldata version) external;\\n}\\n\",\"keccak256\":\"0x28669953bd3dcc98a5f959fa3cac97444584b6fbe59341681b9a59f11a83b171\",\"license\":\"GPL-3.0-only\"},\"@opengsn/contracts/src/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity >=0.7.6;\\npragma abicoder v2;\\n\\nimport \\\"@openzeppelin/contracts/interfaces/IERC165.sol\\\";\\n\\nimport \\\"../utils/GsnTypes.sol\\\";\\n\\n/**\\n * @title The Paymaster Interface\\n * @notice Contracts implementing this interface exist to make decision about paying the transaction fee to the relay.\\n *\\n * @notice There are two callbacks here that are executed by the RelayHub: `preRelayedCall` and `postRelayedCall`.\\n *\\n * @notice It is recommended that your implementation inherits from the abstract BasePaymaster contract.\\n*/\\ninterface IPaymaster is IERC165 {\\n /**\\n * @notice The limits this Paymaster wants to be imposed by the RelayHub on user input. See `getGasAndDataLimits`.\\n */\\n struct GasAndDataLimits {\\n uint256 acceptanceBudget;\\n uint256 preRelayedCallGasLimit;\\n uint256 postRelayedCallGasLimit;\\n uint256 calldataSizeLimit;\\n }\\n\\n /**\\n * @notice Return the Gas Limits for Paymaster's functions and maximum msg.data length values for this Paymaster.\\n * This function allows different paymasters to have different properties without changes to the RelayHub.\\n * @return limits An instance of the `GasAndDataLimits` struct\\n *\\n * ##### `acceptanceBudget`\\n * If the transactions consumes more than `acceptanceBudget` this Paymaster will be charged for gas no matter what.\\n * Transaction that gets rejected after consuming more than `acceptanceBudget` gas is on this Paymaster's expense.\\n *\\n * Should be set to an amount gas this Paymaster expects to spend deciding whether to accept or reject a request.\\n * This includes gas consumed by calculations in the `preRelayedCall`, `Forwarder` and the recipient contract.\\n *\\n * :warning: **Warning** :warning: As long this value is above `preRelayedCallGasLimit`\\n * (see defaults in `BasePaymaster`), the Paymaster is guaranteed it will never pay for rejected transactions.\\n * If this value is below `preRelayedCallGasLimit`, it might might make Paymaster open to a \\\"griefing\\\" attack.\\n *\\n * The relayers should prefer lower `acceptanceBudget`, as it improves their chances of being compensated.\\n * From a Relay's point of view, this is the highest gas value a bad Paymaster may cost the relay,\\n * since the paymaster will pay anything above that value regardless of whether the transaction succeeds or reverts.\\n * Specifying value too high might make the call rejected by relayers (see `maxAcceptanceBudget` in server config).\\n *\\n * ##### `preRelayedCallGasLimit`\\n * The max gas usage of preRelayedCall. Any revert of the `preRelayedCall` is a request rejection by the paymaster.\\n * As long as `acceptanceBudget` is above `preRelayedCallGasLimit`, any such revert is not payed by the paymaster.\\n *\\n * ##### `postRelayedCallGasLimit`\\n * The max gas usage of postRelayedCall. The Paymaster is not charged for the maximum, only for actually used gas.\\n * Note that an OOG will revert the inner transaction, but the paymaster will be charged for it anyway.\\n */\\n function getGasAndDataLimits()\\n external\\n view\\n returns (\\n GasAndDataLimits memory limits\\n );\\n\\n /**\\n * @notice :warning: **Warning** :warning: using incorrect Forwarder may cause the Paymaster to agreeing to pay for invalid transactions.\\n * @return trustedForwarder The address of the `Forwarder` that is trusted by this Paymaster to execute the requests.\\n */\\n function getTrustedForwarder() external view returns (address trustedForwarder);\\n\\n /**\\n * @return relayHub The address of the `RelayHub` that is trusted by this Paymaster to execute the requests.\\n */\\n function getRelayHub() external view returns (address relayHub);\\n\\n /**\\n * @notice Called by the Relay in view mode and later by the `RelayHub` on-chain to validate that\\n * the Paymaster agrees to pay for this call.\\n *\\n * The request is considered to be rejected by the Paymaster in one of the following conditions:\\n * - `preRelayedCall()` method reverts\\n * - the `Forwarder` reverts because of nonce or signature error\\n * - the `Paymaster` returned `rejectOnRecipientRevert: true` and the recipient contract reverted\\n * (and all that did not consume more than `acceptanceBudget` gas).\\n *\\n * In any of the above cases, all Paymaster calls and the recipient call are reverted.\\n * In any other case the Paymaster will pay for the gas cost of the transaction.\\n * Note that even if `postRelayedCall` is reverted the Paymaster will be charged.\\n *\\n\\n * @param relayRequest - the full relay request structure\\n * @param signature - user's EIP712-compatible signature of the `relayRequest`.\\n * Note that in most cases the paymaster shouldn't try use it at all. It is always checked\\n * by the forwarder immediately after preRelayedCall returns.\\n * @param approvalData - extra dapp-specific data (e.g. signature from trusted party)\\n * @param maxPossibleGas - based on values returned from `getGasAndDataLimits`\\n * the RelayHub will calculate the maximum possible amount of gas the user may be charged for.\\n * In order to convert this value to wei, the Paymaster has to call \\\"relayHub.calculateCharge()\\\"\\n *\\n * @return context\\n * A byte array to be passed to postRelayedCall.\\n * Can contain any data needed by this Paymaster in any form or be empty if no extra data is needed.\\n * @return rejectOnRecipientRevert\\n * The flag that allows a Paymaster to \\\"delegate\\\" the rejection to the recipient code.\\n * It also means the Paymaster trust the recipient to reject fast: both preRelayedCall,\\n * forwarder check and recipient checks must fit into the GasLimits.acceptanceBudget,\\n * otherwise the TX is paid by the Paymaster.\\n * `true` if the Paymaster wants to reject the TX if the recipient reverts.\\n * `false` if the Paymaster wants rejects by the recipient to be completed on chain and paid by the Paymaster.\\n */\\n function preRelayedCall(\\n GsnTypes.RelayRequest calldata relayRequest,\\n bytes calldata signature,\\n bytes calldata approvalData,\\n uint256 maxPossibleGas\\n )\\n external\\n returns (bytes memory context, bool rejectOnRecipientRevert);\\n\\n /**\\n * @notice This method is called after the actual relayed function call.\\n * It may be used to record the transaction (e.g. charge the caller by some contract logic) for this call.\\n *\\n * Revert in this functions causes a revert of the client's relayed call (and preRelayedCall(), but the Paymaster\\n * is still committed to pay the relay for the entire transaction.\\n *\\n * @param context The call context, as returned by the preRelayedCall\\n * @param success `true` if the relayed call succeeded, false if it reverted\\n * @param gasUseWithoutPost The actual amount of gas used by the entire transaction, EXCEPT\\n * the gas used by the postRelayedCall itself.\\n * @param relayData The relay params of the request. can be used by relayHub.calculateCharge()\\n *\\n */\\n function postRelayedCall(\\n bytes calldata context,\\n bool success,\\n uint256 gasUseWithoutPost,\\n GsnTypes.RelayData calldata relayData\\n ) external;\\n\\n /**\\n * @return version The SemVer string of this Paymaster's version.\\n */\\n function versionPaymaster() external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xeedb6d83ce600a97a4abbb614d24c65cb2ebc06a1784cc6a81afa9233d1331b6\",\"license\":\"GPL-3.0-only\"},\"@opengsn/contracts/src/utils/GsnTypes.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.0;\\n\\nimport \\\"../forwarder/IForwarder.sol\\\";\\n\\ninterface GsnTypes {\\n /// @notice maxFeePerGas, maxPriorityFeePerGas, pctRelayFee and baseRelayFee must be validated inside of the paymaster's preRelayedCall in order not to overpay\\n struct RelayData {\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n uint256 transactionCalldataGasUsed;\\n address relayWorker;\\n address paymaster;\\n address forwarder;\\n bytes paymasterData;\\n uint256 clientId;\\n }\\n\\n //note: must start with the ForwardRequest to be an extension of the generic forwarder\\n struct RelayRequest {\\n IForwarder.ForwardRequest request;\\n RelayData relayData;\\n }\\n}\\n\",\"keccak256\":\"0x9fb51c540f32939f1ee291e3fa709be64f7c73485bd7b87c6624c3567dd42a1b\",\"license\":\"GPL-3.0-only\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0xd04b0f06e0666f29cf7cccc82894de541e19bb30a765b107b1e40bb7fe5f7d7a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/interfaces/ICustomErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\ninterface ICustomErrors {\\n error AlreadyInitialized();\\n error CannotSelfRemove(address who);\\n error DuplicateEntry();\\n error InconsistentParameter(string param);\\n error InsufficientFunds(uint256 amount);\\n error InterfaceNotSupported(string);\\n error InternalMethod();\\n error InvalidCrowdfundBasisPointsFee(uint32 fee);\\n error InvalidPhase();\\n error NonExistentEntry();\\n error OutOfBounds();\\n error Overfunded(uint256 amount);\\n error ReentrancyError();\\n error RequiresAutomatonsManager(address who);\\n error RequiresContinuousSupply();\\n error RequiresDiamondOwnership(address who);\\n error RequiresDifferentSenderAndRecipient(address a);\\n error RequiresFastCaller();\\n error RequiresFastContractCaller();\\n error RequiresFastGovernorship(address who);\\n error RequiresFastMemberCaller();\\n error RequiresFastMembership(address who);\\n error RequiresGovernorsManager(address who);\\n error RequiresIssuerMemberCaller();\\n error RequiresIssuerMemberOrIssuerCaller();\\n error RequiresIssuerMembership(address who);\\n error RequiresManagerCaller();\\n error RequiresMarketplaceActiveMembership(address who);\\n error RequiresMarketplaceDeactivatedMember(address who);\\n error RequiresMarketplaceMembership(address who);\\n error RequiresMembersManager(address who);\\n error RequiresNoFastMemberships(address who);\\n error RequiresOwner(address who);\\n error RequiresPositiveBalance(address holder);\\n error RequiresTransfersEnabled();\\n error RequiresValidGovernor(address who);\\n error RequiresValidMember(address who);\\n error RequiresValidTokenHolder(address who);\\n error TokenContractError();\\n error UnknownBeneficiary(address who);\\n error UnknownPledger(address who);\\n error UnsupportedOperation();\\n}\\n\",\"keccak256\":\"0xd6da7364331de0a387574a44c5a4e7555b63cfe4baaca4dfef42c5d2345f0683\",\"license\":\"MIT\"},\"contracts/interfaces/IDiamondCut.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\n/******************************************************************************\\\\\\n* Author: Nick Mudge (https://twitter.com/mudgen)\\n* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535\\n/******************************************************************************/\\n\\n/// @title A facet providing diamond cut mechanisms.\\ninterface IDiamondCut {\\n enum FacetCutAction {\\n Add,\\n Replace,\\n Remove\\n }\\n // Add=0, Replace=1, Remove=2\\n\\n struct FacetCut {\\n address facetAddress;\\n FacetCutAction action;\\n bytes4[] functionSelectors;\\n }\\n\\n /// @notice Add/replace/remove any number of functions and optionally execute\\n /// a method with `delegatecall`.\\n /// @param _diamondCut Contains the facet addresses and function selectors\\n /// @param _init The address of the contract or facet to execute _calldata\\n /// @param _calldata A function call, including function selector and arguments\\n /// _calldata is executed with delegatecall on _init\\n function diamondCut(FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata) external;\\n\\n event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);\\n}\\n\",\"keccak256\":\"0xf548f40da69f2c54f4e03f92dc31094f6825669314b87266cce22e0a8f1a4c47\",\"license\":\"MIT\"},\"contracts/interfaces/IDiamondLoupe.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\n/******************************************************************************\\\\\\n* Author: Nick Mudge (https://twitter.com/mudgen)\\n* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535\\n/******************************************************************************/\\n\\n/// @title A loupe facet is a small magnifying glass used to look at diamonds. These functions look at diamonds\\ninterface IDiamondLoupe {\\n /// These functions are expected to be called frequently\\n /// by tools.\\n\\n struct Facet {\\n address facetAddress;\\n bytes4[] functionSelectors;\\n }\\n\\n /// @notice Gets all facet addresses and their four byte function selectors.\\n /// @return facets_ All facets and their registered selectors.\\n function facets() external view returns (Facet[] memory facets_);\\n\\n /// @notice Gets all the function selectors supported by a specific facet.\\n /// @param _facet The facet address.\\n /// @return facetFunctionSelectors_ is the list of selectors for the given function.\\n function facetFunctionSelectors(address _facet) external view returns (bytes4[] memory facetFunctionSelectors_);\\n\\n /// @notice Get all the facet addresses used by a diamond.\\n /// @return facetAddresses_ are all facet addresses registered with this diamond.\\n function facetAddresses() external view returns (address[] memory facetAddresses_);\\n\\n /// @notice Gets the facet that supports the given selector.\\n /// @notice If facet is not found return address(0).\\n /// @param _functionSelector The function selector.\\n /// @return facetAddress_ The facet address.\\n function facetAddress(bytes4 _functionSelector) external view returns (address facetAddress_);\\n}\\n\",\"keccak256\":\"0x6aaced2ec2356b0ea8546a2a6ca4a8ed6ace6b96791b92dccc97a3079bce6217\",\"license\":\"MIT\"},\"contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\n// Directly import IERC165 from OpenZeppelin contracts.\\n// Solves an issue with 2 conflicting definitions of IERC165.\\nimport {IERC165} from \\\"@openzeppelin/contracts/interfaces/IERC165.sol\\\";\\n\",\"keccak256\":\"0x4d40fa89830d0f833aacefdbab507408a29b692e37990192c6b5e4ce581db830\",\"license\":\"MIT\"},\"contracts/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\n/**\\n * @title ERC173 Contract Ownership Standard\\n * @dev The ERC165 identifier for this interface is 0x7f5828d0.\\n */\\ninterface IERC173 {\\n /// @notice This emits when ownership of a contract changes.\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /// @notice Get the address of the owner\\n /// @return owner_ The address of the owner.\\n function owner() external view returns (address owner_);\\n\\n /// @notice Set the address of the new owner of the contract\\n /// @notice Set _newOwner to address(0) to renounce any ownership.\\n /// @param _newOwner The address of the new owner of the contract\\n function transferOwnership(address _newOwner) external;\\n}\\n\",\"keccak256\":\"0x797855e7870ec3c9f32dda93166bd12dc19fec66cc9a8a7a58f03339a31439c0\",\"license\":\"MIT\"},\"contracts/lib/LibDiamond.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\n/******************************************************************************\\\\\\n* Author: Nick Mudge (https://twitter.com/mudgen)\\n* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535\\n/******************************************************************************/\\nimport {IDiamondCut} from \\\"../interfaces/IDiamondCut.sol\\\";\\n\\nlibrary LibDiamond {\\n bytes32 constant DIAMOND_STORAGE_POSITION = keccak256(\\\"diamond.standard.diamond.storage\\\");\\n\\n struct FacetAddressAndPosition {\\n address facetAddress;\\n uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array\\n }\\n\\n struct FacetFunctionSelectors {\\n bytes4[] functionSelectors;\\n uint256 facetAddressPosition; // position of facetAddress in facetAddresses array\\n }\\n\\n struct DiamondStorage {\\n // maps function selector to the facet address and\\n // the position of the selector in the facetFunctionSelectors.selectors array\\n mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition;\\n // maps facet addresses to function selectors\\n mapping(address => FacetFunctionSelectors) facetFunctionSelectors;\\n // facet addresses\\n address[] facetAddresses;\\n // Used to query if a contract implements an interface.\\n // Used to implement ERC-165.\\n mapping(bytes4 => bool) supportedInterfaces;\\n // owner of the contract\\n address contractOwner;\\n }\\n\\n function diamondStorage() internal pure returns (DiamondStorage storage ds) {\\n bytes32 position = DIAMOND_STORAGE_POSITION;\\n assembly {\\n ds.slot := position\\n }\\n }\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n function setContractOwner(address _newOwner) internal {\\n DiamondStorage storage ds = diamondStorage();\\n address previousOwner = ds.contractOwner;\\n ds.contractOwner = _newOwner;\\n emit OwnershipTransferred(previousOwner, _newOwner);\\n }\\n\\n function contractOwner() internal view returns (address contractOwner_) {\\n contractOwner_ = diamondStorage().contractOwner;\\n }\\n\\n function enforceIsContractOwner() internal view {\\n require(msg.sender == diamondStorage().contractOwner, \\\"LibDiamond: Must be contract owner\\\");\\n }\\n\\n event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata);\\n\\n // Internal function version of diamondCut\\n function diamondCut(IDiamondCut.FacetCut[] memory _diamondCut, address _init, bytes memory _calldata) internal {\\n for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) {\\n IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action;\\n if (action == IDiamondCut.FacetCutAction.Add) {\\n addFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);\\n } else if (action == IDiamondCut.FacetCutAction.Replace) {\\n replaceFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);\\n } else if (action == IDiamondCut.FacetCutAction.Remove) {\\n removeFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);\\n } else {\\n revert(\\\"LibDiamondCut: Incorrect FacetCutAction\\\");\\n }\\n }\\n emit DiamondCut(_diamondCut, _init, _calldata);\\n initializeDiamondCut(_init, _calldata);\\n }\\n\\n function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {\\n require(_functionSelectors.length > 0, \\\"LibDiamondCut: No selectors in facet to cut\\\");\\n DiamondStorage storage ds = diamondStorage();\\n require(_facetAddress != address(0), \\\"LibDiamondCut: Add facet can't be address(0)\\\");\\n uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length);\\n // add new facet address if it does not exist\\n if (selectorPosition == 0) {\\n addFacet(ds, _facetAddress);\\n }\\n for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {\\n bytes4 selector = _functionSelectors[selectorIndex];\\n address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;\\n require(oldFacetAddress == address(0), \\\"LibDiamondCut: Can't add function that already exists\\\");\\n addFunction(ds, selector, selectorPosition, _facetAddress);\\n selectorPosition++;\\n }\\n }\\n\\n function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {\\n require(_functionSelectors.length > 0, \\\"LibDiamondCut: No selectors in facet to cut\\\");\\n DiamondStorage storage ds = diamondStorage();\\n require(_facetAddress != address(0), \\\"LibDiamondCut: Add facet can't be address(0)\\\");\\n uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length);\\n // add new facet address if it does not exist\\n if (selectorPosition == 0) {\\n addFacet(ds, _facetAddress);\\n }\\n for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {\\n bytes4 selector = _functionSelectors[selectorIndex];\\n address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;\\n require(oldFacetAddress != _facetAddress, \\\"LibDiamondCut: Can't replace function with same function\\\");\\n removeFunction(ds, oldFacetAddress, selector);\\n addFunction(ds, selector, selectorPosition, _facetAddress);\\n selectorPosition++;\\n }\\n }\\n\\n function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {\\n require(_functionSelectors.length > 0, \\\"LibDiamondCut: No selectors in facet to cut\\\");\\n DiamondStorage storage ds = diamondStorage();\\n // if function does not exist then do nothing and return\\n require(_facetAddress == address(0), \\\"LibDiamondCut: Remove facet address must be address(0)\\\");\\n for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {\\n bytes4 selector = _functionSelectors[selectorIndex];\\n address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;\\n removeFunction(ds, oldFacetAddress, selector);\\n }\\n }\\n\\n function addFacet(DiamondStorage storage ds, address _facetAddress) internal {\\n enforceHasContractCode(_facetAddress, \\\"LibDiamondCut: New facet has no code\\\");\\n ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds.facetAddresses.length;\\n ds.facetAddresses.push(_facetAddress);\\n }\\n\\n function addFunction(\\n DiamondStorage storage ds,\\n bytes4 _selector,\\n uint96 _selectorPosition,\\n address _facetAddress\\n ) internal {\\n ds.selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition;\\n ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector);\\n ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress;\\n }\\n\\n function removeFunction(DiamondStorage storage ds, address _facetAddress, bytes4 _selector) internal {\\n require(_facetAddress != address(0), \\\"LibDiamondCut: Can't remove function that doesn't exist\\\");\\n // an immutable function is a function defined directly in a diamond\\n require(_facetAddress != address(this), \\\"LibDiamondCut: Can't remove immutable function\\\");\\n // replace selector with last selector, then delete last selector\\n uint256 selectorPosition = ds.selectorToFacetAndPosition[_selector].functionSelectorPosition;\\n uint256 lastSelectorPosition = ds.facetFunctionSelectors[_facetAddress].functionSelectors.length - 1;\\n // if not the same then replace _selector with lastSelector\\n if (selectorPosition != lastSelectorPosition) {\\n bytes4 lastSelector = ds.facetFunctionSelectors[_facetAddress].functionSelectors[lastSelectorPosition];\\n ds.facetFunctionSelectors[_facetAddress].functionSelectors[selectorPosition] = lastSelector;\\n ds.selectorToFacetAndPosition[lastSelector].functionSelectorPosition = uint96(selectorPosition);\\n }\\n // delete the last selector\\n ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop();\\n delete ds.selectorToFacetAndPosition[_selector];\\n\\n // if no more selectors for facet address then delete the facet address\\n if (lastSelectorPosition == 0) {\\n // replace facet address with last facet address and delete last facet address\\n uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1;\\n uint256 facetAddressPosition = ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;\\n if (facetAddressPosition != lastFacetAddressPosition) {\\n address lastFacetAddress = ds.facetAddresses[lastFacetAddressPosition];\\n ds.facetAddresses[facetAddressPosition] = lastFacetAddress;\\n ds.facetFunctionSelectors[lastFacetAddress].facetAddressPosition = facetAddressPosition;\\n }\\n ds.facetAddresses.pop();\\n delete ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;\\n }\\n }\\n\\n function initializeDiamondCut(address _init, bytes memory _calldata) internal {\\n if (_init == address(0)) {\\n require(_calldata.length == 0, \\\"LibDiamondCut: _init is address(0) but_calldata is not empty\\\");\\n } else {\\n require(_calldata.length > 0, \\\"LibDiamondCut: _calldata is empty but _init is not address(0)\\\");\\n if (_init != address(this)) {\\n enforceHasContractCode(_init, \\\"LibDiamondCut: _init address has no code\\\");\\n }\\n (bool success, bytes memory error) = _init.delegatecall(_calldata);\\n if (!success) {\\n if (error.length > 0) {\\n // bubble up the error\\n revert(string(error));\\n } else {\\n revert(\\\"LibDiamondCut: _init function reverted\\\");\\n }\\n }\\n }\\n }\\n\\n function enforceHasContractCode(address _contract, string memory _errorMessage) internal view {\\n uint256 contractSize;\\n assembly {\\n contractSize := extcodesize(_contract)\\n }\\n require(contractSize > 0, _errorMessage);\\n }\\n}\\n\",\"keccak256\":\"0x0e12d54c3afccb656312e8bc7c31d16feb3718a421d2ea732024f608ccb6aab4\",\"license\":\"MIT\"},\"contracts/lib/LibHelpers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\nimport \\\"./LibHelpers.sol\\\";\\nimport \\\"../interfaces/IERC173.sol\\\";\\n\\nlibrary LibHelpers {\\n address internal constant ZERO_ADDRESS = address(0);\\n address internal constant DEPLOYER_CONTRACT = 0x6DF2D25d8C6FD680730ee658b530A05a99BB769a;\\n address internal constant DEPLOYER_CONTRACT_AMOY = 0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7;\\n\\n function _isDiamondFacet(address who) internal view returns (bool) {\\n return who == address(this);\\n }\\n\\n function _isDiamondOwner(address who) internal view returns (bool) {\\n return who == IERC173(address(this)).owner();\\n }\\n\\n function _isDeployer(address who) internal pure returns (bool) {\\n return (who == LibHelpers.DEPLOYER_CONTRACT) || (who == LibHelpers.DEPLOYER_CONTRACT_AMOY);\\n }\\n}\\n\",\"keccak256\":\"0x69c31186e77cd225421751d6e2df801371ff1247250d6f0bbdbd05fb498b9ec7\",\"license\":\"MIT\"},\"contracts/paymaster/PaymasterInitFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\nimport \\\"../interfaces/IERC165.sol\\\"; // Interface Support.\\nimport \\\"../interfaces/IERC173.sol\\\"; // Ownership.\\nimport \\\"../interfaces/IDiamondCut.sol\\\"; // Facet management.\\nimport \\\"../interfaces/IDiamondLoupe.sol\\\"; // Facet introspection.\\nimport \\\"../interfaces/ICustomErrors.sol\\\";\\nimport \\\"../lib/LibDiamond.sol\\\";\\nimport \\\"./lib/APaymasterFacet.sol\\\";\\nimport \\\"./lib/LibPaymaster.sol\\\";\\n\\nimport \\\"@opengsn/contracts/src/interfaces/IPaymaster.sol\\\";\\n\\n/// @notice The Paymaster initialization facet.\\ncontract PaymasterInitFacet is APaymasterFacet {\\n /// Initializers.\\n\\n struct InitializerParams {\\n address marketplace;\\n address issuer;\\n }\\n\\n function initialize(InitializerParams calldata params) external onlyDeployer {\\n // Make sure we haven't initialized yet.\\n if (LibPaymaster.data().version >= LibPaymaster.STORAGE_VERSION) revert ICustomErrors.AlreadyInitialized();\\n\\n // Register interfaces.\\n LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage();\\n ds.supportedInterfaces[type(IPaymaster).interfaceId] = true;\\n ds.supportedInterfaces[type(IERC165).interfaceId] = true;\\n ds.supportedInterfaces[type(IERC173).interfaceId] = true;\\n ds.supportedInterfaces[type(IDiamondCut).interfaceId] = true;\\n ds.supportedInterfaces[type(IDiamondLoupe).interfaceId] = true;\\n\\n // ------------------------------------- //\\n\\n // Initialize top-level storage.\\n LibPaymaster.Data storage topData = LibPaymaster.data();\\n topData.version = LibPaymaster.STORAGE_VERSION;\\n topData.marketplace = params.marketplace;\\n topData.issuer = params.issuer;\\n }\\n}\\n\",\"keccak256\":\"0xf804474e43d4f6b4f43d643f498e7a4c8a60e9df6ce17a9630a5378cd7f3bf73\",\"license\":\"MIT\"},\"contracts/paymaster/lib/APaymasterFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\nimport \\\"./LibPaymaster.sol\\\";\\nimport \\\"../../lib/LibHelpers.sol\\\";\\nimport \\\"../../interfaces/ICustomErrors.sol\\\";\\n\\n/**\\n * @notice This contract is a group of modifiers that can be used by any Paymaster facets to guard against\\n * certain permissions.\\n */\\nabstract contract APaymasterFacet {\\n /// Internal ACL functions.\\n\\n /// ...\\n\\n // Modifiers.\\n\\n /// @notice Ensures that a method can only be called by the singleton deployer contract factory.\\n modifier onlyDeployer() virtual {\\n if (!LibHelpers._isDeployer(msg.sender)) revert ICustomErrors.InternalMethod();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0xc0998d4c82f2b1b02a88e18de89ae308eb19a0a68f244ff958cbbcedc5cf93c8\",\"license\":\"MIT\"},\"contracts/paymaster/lib/LibPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\nlibrary LibPaymaster {\\n // The current version of the storage.\\n uint16 internal constant STORAGE_VERSION = 1;\\n // This is keccak256('Paymaster.storage'):\\n bytes32 internal constant STORAGE_SLOT = 0x8f0e66ee30211ca069424cd4b533ee66f04c45421216c1a6601cf23359c1f7f8;\\n\\n struct Data {\\n /// @notice The latest intializer version that was called.\\n uint16 version;\\n /// @notice The internal pointer to the Marketplace contract.\\n address marketplace;\\n /// @notice The internal pointer to the Issuer contract.\\n address issuer;\\n }\\n\\n function data() internal pure returns (Data storage s) {\\n assembly {\\n s.slot := STORAGE_SLOT\\n }\\n }\\n}\\n\",\"keccak256\":\"0x871aa0b3fd94c5e3564c9568a20984d2976df4e353d2574cac684c2a3e9373dc\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5061042f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b6a597dd14610030575b600080fd5b61004361003e3660046103a4565b610045565b005b61004e3361033b565b610084576040517f12e9ad3300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60017f8f0e66ee30211ca069424cd4b533ee66f04c45421216c1a6601cf23359c1f7f85461ffff16106100e3576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131f60209081527f1af2095987fa74d362155b14d3aa5019945195b866333c8fa5477b0f0d03e78a805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f699d9daa71b280d05a152715774afa0a81a312594b2d731d6b0b2552b7d6f69f80548216831790557f5622121b47b8cd0120c4efe45dd5483242f54a3d49bd7679be565d47694918c380548216831790557ff97e938d8af42f52387bb74b8b526fda8f184cc2aa534340a8d75a88fbecc77580548216831790557f48e2b093000000000000000000000000000000000000000000000000000000006000527f65d510a5d8f7ef134ec444f7f34ee808c8eeb5177cdfd16be0c40fe1ab4336958054909116821790557f8f0e66ee30211ca069424cd4b533ee66f04c45421216c1a6601cf23359c1f7f880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690911781557fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c91610298908401846103bc565b815473ffffffffffffffffffffffffffffffffffffffff9190911662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff9091161781556102ef60408401602085016103bc565b60019190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790555050565b600073ffffffffffffffffffffffffffffffffffffffff8216736df2d25d8c6fd680730ee658b530a05a99bb769a148061039e575073ffffffffffffffffffffffffffffffffffffffff821673914d7fec6aac8cd542e72bca78b30650d45643d7145b92915050565b6000604082840312156103b657600080fd5b50919050565b6000602082840312156103ce57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146103f257600080fd5b939250505056fea2646970667358221220cb721c0841eb41775d264fe8cf7d01787492e0c13cd1b3c95bbad48b2f93229c64736f6c634300080a0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b6a597dd14610030575b600080fd5b61004361003e3660046103a4565b610045565b005b61004e3361033b565b610084576040517f12e9ad3300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60017f8f0e66ee30211ca069424cd4b533ee66f04c45421216c1a6601cf23359c1f7f85461ffff16106100e3576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131f60209081527f1af2095987fa74d362155b14d3aa5019945195b866333c8fa5477b0f0d03e78a805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f699d9daa71b280d05a152715774afa0a81a312594b2d731d6b0b2552b7d6f69f80548216831790557f5622121b47b8cd0120c4efe45dd5483242f54a3d49bd7679be565d47694918c380548216831790557ff97e938d8af42f52387bb74b8b526fda8f184cc2aa534340a8d75a88fbecc77580548216831790557f48e2b093000000000000000000000000000000000000000000000000000000006000527f65d510a5d8f7ef134ec444f7f34ee808c8eeb5177cdfd16be0c40fe1ab4336958054909116821790557f8f0e66ee30211ca069424cd4b533ee66f04c45421216c1a6601cf23359c1f7f880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690911781557fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c91610298908401846103bc565b815473ffffffffffffffffffffffffffffffffffffffff9190911662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff9091161781556102ef60408401602085016103bc565b60019190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790555050565b600073ffffffffffffffffffffffffffffffffffffffff8216736df2d25d8c6fd680730ee658b530a05a99bb769a148061039e575073ffffffffffffffffffffffffffffffffffffffff821673914d7fec6aac8cd542e72bca78b30650d45643d7145b92915050565b6000604082840312156103b657600080fd5b50919050565b6000602082840312156103ce57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146103f257600080fd5b939250505056fea2646970667358221220cb721c0841eb41775d264fe8cf7d01787492e0c13cd1b3c95bbad48b2f93229c64736f6c634300080a0033", + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "The Paymaster initialization facet.", + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/deployments/amoy/PaymasterTopFacet.json b/deployments/amoy/PaymasterTopFacet.json new file mode 100644 index 00000000..55abab28 --- /dev/null +++ b/deployments/amoy/PaymasterTopFacet.json @@ -0,0 +1,669 @@ +{ + "address": "0xa6b9c6a2BeEcD86bE8b260b21950FC324D5e7456", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "ForwarderNotTrusted", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "InterfaceNotSupported", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidApprovalDataLength", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidPaymasterDataLength", + "type": "error" + }, + { + "inputs": [], + "name": "RelayHubAddressNotSet", + "type": "error" + }, + { + "inputs": [], + "name": "RequiresIssuerMemberCaller", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "who", + "type": "address" + } + ], + "name": "RequiresMarketplaceMembership", + "type": "error" + }, + { + "inputs": [], + "name": "RequiresRelayHubCaller", + "type": "error" + }, + { + "inputs": [], + "name": "ValueTransferNotSupported", + "type": "error" + }, + { + "inputs": [], + "name": "CALLDATA_SIZE_LIMIT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "FORWARDER_HUB_OVERHEAD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAYMASTER_ACCEPTANCE_BUDGET", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "POST_RELAYED_CALL_GAS_LIMIT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PRE_RELAYED_CALL_GAS_LIMIT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getGasAndDataLimits", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "acceptanceBudget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "preRelayedCallGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "postRelayedCallGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "calldataSizeLimit", + "type": "uint256" + } + ], + "internalType": "struct IPaymaster.GasAndDataLimits", + "name": "limits", + "type": "tuple" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getRelayHub", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTrustedForwarder", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "context", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "gasUseWithoutPost", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "maxFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPriorityFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "transactionCalldataGasUsed", + "type": "uint256" + }, + { + "internalType": "address", + "name": "relayWorker", + "type": "address" + }, + { + "internalType": "address", + "name": "paymaster", + "type": "address" + }, + { + "internalType": "address", + "name": "forwarder", + "type": "address" + }, + { + "internalType": "bytes", + "name": "paymasterData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "clientId", + "type": "uint256" + } + ], + "internalType": "struct GsnTypes.RelayData", + "name": "relayData", + "type": "tuple" + } + ], + "name": "postRelayedCall", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "gas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "validUntilTime", + "type": "uint256" + } + ], + "internalType": "struct IForwarder.ForwardRequest", + "name": "request", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "maxFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPriorityFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "transactionCalldataGasUsed", + "type": "uint256" + }, + { + "internalType": "address", + "name": "relayWorker", + "type": "address" + }, + { + "internalType": "address", + "name": "paymaster", + "type": "address" + }, + { + "internalType": "address", + "name": "forwarder", + "type": "address" + }, + { + "internalType": "bytes", + "name": "paymasterData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "clientId", + "type": "uint256" + } + ], + "internalType": "struct GsnTypes.RelayData", + "name": "relayData", + "type": "tuple" + } + ], + "internalType": "struct GsnTypes.RelayRequest", + "name": "relayRequest", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "approvalData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "preRelayedCall", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRelayHub", + "name": "hub", + "type": "address" + } + ], + "name": "setRelayHub", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "forwarder", + "type": "address" + } + ], + "name": "setTrustedForwarder", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "useRejectOnRecipientRevert", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "versionPaymaster", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "target", + "type": "address" + } + ], + "name": "withdrawRelayHubDepositTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x978670eb89ebe5148c5396c27dac0b1bce82e995c845b863ac95ebd1f7398719", + "receipt": { + "to": "0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7", + "from": "0x717634cfe06FFAB2CEAA7fcf1b9019813f4B25FE", + "contractAddress": null, + "transactionIndex": 0, + "gasUsed": "1309223", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000008000000000000000000000000000000000000000000000000040000000800000000000000000000100080000000000000000000000000000000000000000000000000000000080000000000000020000000000000000000000000040000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000400000000000000000000000000000000000000100000", + "blockHash": "0x52cf9efe1ab14fcaf747de225a8de73b19e08b6882e33ae7260d5a721dccc1b1", + "transactionHash": "0x978670eb89ebe5148c5396c27dac0b1bce82e995c845b863ac95ebd1f7398719", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 5430703, + "transactionHash": "0x978670eb89ebe5148c5396c27dac0b1bce82e995c845b863ac95ebd1f7398719", + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000717634cfe06ffab2ceaa7fcf1b9019813f4b25fe", + "0x0000000000000000000000006dc2dd54f24979ec26212794c71afefed722280c" + ], + "data": "0x0000000000000000000000000000000000000000000000000006fa18d961463d0000000000000000000000000000000000000000000000000397258c6fca22380000000000000000000000000000000000000000000000a647ba0ec9abc7b1ff00000000000000000000000000000000000000000000000003902b739668dbfb0000000000000000000000000000000000000000000000a647c108e28528f83c", + "logIndex": 0, + "blockHash": "0x52cf9efe1ab14fcaf747de225a8de73b19e08b6882e33ae7260d5a721dccc1b1" + } + ], + "blockNumber": 5430703, + "cumulativeGasUsed": "1309223", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "282aebb21cccc251bc099bdf4cf81fc0", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"ForwarderNotTrusted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"InterfaceNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidApprovalDataLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPaymasterDataLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RelayHubAddressNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RequiresIssuerMemberCaller\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"who\",\"type\":\"address\"}],\"name\":\"RequiresMarketplaceMembership\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RequiresRelayHubCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValueTransferNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CALLDATA_SIZE_LIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FORWARDER_HUB_OVERHEAD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PAYMASTER_ACCEPTANCE_BUDGET\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"POST_RELAYED_CALL_GAS_LIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PRE_RELAYED_CALL_GAS_LIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGasAndDataLimits\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"acceptanceBudget\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preRelayedCallGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"postRelayedCallGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"calldataSizeLimit\",\"type\":\"uint256\"}],\"internalType\":\"struct IPaymaster.GasAndDataLimits\",\"name\":\"limits\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRelayHub\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTrustedForwarder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"gasUseWithoutPost\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"transactionCalldataGasUsed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"relayWorker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"clientId\",\"type\":\"uint256\"}],\"internalType\":\"struct GsnTypes.RelayData\",\"name\":\"relayData\",\"type\":\"tuple\"}],\"name\":\"postRelayedCall\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validUntilTime\",\"type\":\"uint256\"}],\"internalType\":\"struct IForwarder.ForwardRequest\",\"name\":\"request\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"transactionCalldataGasUsed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"relayWorker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"clientId\",\"type\":\"uint256\"}],\"internalType\":\"struct GsnTypes.RelayData\",\"name\":\"relayData\",\"type\":\"tuple\"}],\"internalType\":\"struct GsnTypes.RelayRequest\",\"name\":\"relayRequest\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"approvalData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"preRelayedCall\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRelayHub\",\"name\":\"hub\",\"type\":\"address\"}],\"name\":\"setRelayHub\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"setTrustedForwarder\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"_interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"useRejectOnRecipientRevert\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"versionPaymaster\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"withdrawRelayHubDepositTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getGasAndDataLimits()\":{\"returns\":{\"limits\":\"An instance of the `GasAndDataLimits` struct ##### `acceptanceBudget` If the transactions consumes more than `acceptanceBudget` this Paymaster will be charged for gas no matter what. Transaction that gets rejected after consuming more than `acceptanceBudget` gas is on this Paymaster's expense. Should be set to an amount gas this Paymaster expects to spend deciding whether to accept or reject a request. This includes gas consumed by calculations in the `preRelayedCall`, `Forwarder` and the recipient contract. :warning: **Warning** :warning: As long this value is above `preRelayedCallGasLimit` (see defaults in `BasePaymaster`), the Paymaster is guaranteed it will never pay for rejected transactions. If this value is below `preRelayedCallGasLimit`, it might might make Paymaster open to a \\\"griefing\\\" attack. The relayers should prefer lower `acceptanceBudget`, as it improves their chances of being compensated. From a Relay's point of view, this is the highest gas value a bad Paymaster may cost the relay, since the paymaster will pay anything above that value regardless of whether the transaction succeeds or reverts. Specifying value too high might make the call rejected by relayers (see `maxAcceptanceBudget` in server config). ##### `preRelayedCallGasLimit` The max gas usage of preRelayedCall. Any revert of the `preRelayedCall` is a request rejection by the paymaster. As long as `acceptanceBudget` is above `preRelayedCallGasLimit`, any such revert is not payed by the paymaster. ##### `postRelayedCallGasLimit` The max gas usage of postRelayedCall. The Paymaster is not charged for the maximum, only for actually used gas. Note that an OOG will revert the inner transaction, but the paymaster will be charged for it anyway.\"}},\"getRelayHub()\":{\"returns\":{\"_0\":\"The address of the `RelayHub` that is trusted by this Paymaster to execute the requests.\"}},\"getTrustedForwarder()\":{\"returns\":{\"_0\":\"The address of the `Forwarder` that is trusted by this Paymaster to execute the requests.\"}},\"postRelayedCall(bytes,bool,uint256,(uint256,uint256,uint256,address,address,address,bytes,uint256))\":{\"params\":{\"context\":\"The call context, as returned by the preRelayedCall\",\"gasUseWithoutPost\":\"The actual amount of gas used by the entire transaction, EXCEPT the gas used by the postRelayedCall itself.\",\"relayData\":\"The relay params of the request. can be used by relayHub.calculateCharge()\",\"success\":\"`true` if the relayed call succeeded, false if it reverted\"}},\"preRelayedCall(((address,address,uint256,uint256,uint256,bytes,uint256),(uint256,uint256,uint256,address,address,address,bytes,uint256)),bytes,bytes,uint256)\":{\"params\":{\"approvalData\":\"- extra dapp-specific data (e.g. signature from trusted party)\",\"maxPossibleGas\":\"- based on values returned from `getGasAndDataLimits` the RelayHub will calculate the maximum possible amount of gas the user may be charged for. In order to convert this value to wei, the Paymaster has to call \\\"relayHub.calculateCharge()\\\"\",\"relayRequest\":\"- the full relay request structure\",\"signature\":\"- user's EIP712-compatible signature of the `relayRequest`. Note that in most cases the paymaster shouldn't try use it at all. It is always checked by the forwarder immediately after preRelayedCall returns.\"},\"returns\":{\"_0\":\"A byte array to be passed to postRelayedCall. Can contain any data needed by this Paymaster in any form or be empty if no extra data is needed.\",\"_1\":\"The flag that allows a Paymaster to \\\"delegate\\\" the rejection to the recipient code. It also means the Paymaster trust the recipient to reject fast: both preRelayedCall, forwarder check and recipient checks must fit into the GasLimits.acceptanceBudget, otherwise the TX is paid by the Paymaster. `true` if the Paymaster wants to reject the TX if the recipient reverts. `false` if the Paymaster wants rejects by the recipient to be completed on chain and paid by the Paymaster.\"}},\"setRelayHub(address)\":{\"params\":{\"hub\":\"The address of the new RelayHub.\"}},\"setTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The address of the new Forwarder.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"versionPaymaster()\":{\"returns\":{\"_0\":\"version The SemVer string of this Paymaster's version.\"}},\"withdrawRelayHubDepositTo(uint256,address)\":{\"params\":{\"amount\":\"The amount to be subtracted from the sender.\",\"target\":\"The target to which the amount will be transferred.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deposit()\":{\"notice\":\"Deposit Ether/MATIC on behalf of the Paymaster to the RelayHub.\"},\"getGasAndDataLimits()\":{\"notice\":\"Return the Gas Limits for Paymaster's functions and maximum msg.data length values for this Paymaster. This function allows different paymasters to have different properties without changes to the RelayHub.\"},\"getTrustedForwarder()\":{\"notice\":\":warning: **Warning** :warning: using incorrect Forwarder may cause the Paymaster to agreeing to pay for invalid transactions.\"},\"postRelayedCall(bytes,bool,uint256,(uint256,uint256,uint256,address,address,address,bytes,uint256))\":{\"notice\":\"This method is called after the actual relayed function call. It may be used to record the transaction (e.g. charge the caller by some contract logic) for this call. Revert in this functions causes a revert of the client's relayed call (and preRelayedCall(), but the Paymaster is still committed to pay the relay for the entire transaction.\"},\"preRelayedCall(((address,address,uint256,uint256,uint256,bytes,uint256),(uint256,uint256,uint256,address,address,address,bytes,uint256)),bytes,bytes,uint256)\":{\"notice\":\"Called by the Relay in view mode and later by the `RelayHub` on-chain to validate that the Paymaster agrees to pay for this call. The request is considered to be rejected by the Paymaster in one of the following conditions: - `preRelayedCall()` method reverts - the `Forwarder` reverts because of nonce or signature error - the `Paymaster` returned `rejectOnRecipientRevert: true` and the recipient contract reverted (and all that did not consume more than `acceptanceBudget` gas). In any of the above cases, all Paymaster calls and the recipient call are reverted. In any other case the Paymaster will pay for the gas cost of the transaction. Note that even if `postRelayedCall` is reverted the Paymaster will be charged.\"},\"setRelayHub(address)\":{\"notice\":\"The owner of the Paymaster can change the instance of the RelayHub this Paymaster works with. **Warning** The deposit on the previous RelayHub must be withdrawn first.\"},\"setTrustedForwarder(address)\":{\"notice\":\"The owner of the Paymaster can change the instance of the Forwarder this Paymaster works with. the Recipients must trust this Forwarder as well in order for the configuration to remain functional.\"},\"withdrawRelayHubDepositTo(uint256,address)\":{\"notice\":\"Withdraw deposit from the RelayHub.\"}},\"notice\":\"The top-level Paymaster contract. Note this is an \\\"unwrapped\\\" version of `BasePaymaster.sol` from the OpenGSN repo. Original license: GPL-3.0-only.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/paymaster/PaymasterTopFacet.sol\":\"PaymasterTopFacet\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"@opengsn/contracts/src/forwarder/IForwarder.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity >=0.7.6;\\npragma abicoder v2;\\n\\nimport \\\"@openzeppelin/contracts/interfaces/IERC165.sol\\\";\\n\\n/**\\n * @title The Forwarder Interface\\n * @notice The contracts implementing this interface take a role of authorization, authentication and replay protection\\n * for contracts that choose to trust a `Forwarder`, instead of relying on a mechanism built into the Ethereum protocol.\\n *\\n * @notice if the `Forwarder` contract decides that an incoming `ForwardRequest` is valid, it must append 20 bytes that\\n * represent the caller to the `data` field of the request and send this new data to the target address (the `to` field)\\n *\\n * :warning: **Warning** :warning: The Forwarder can have a full control over a `Recipient` contract.\\n * Any vulnerability in a `Forwarder` implementation can make all of its `Recipient` contracts susceptible!\\n * Recipient contracts should only trust forwarders that passed through security audit,\\n * otherwise they are susceptible to identity theft.\\n */\\ninterface IForwarder is IERC165 {\\n\\n /**\\n * @notice A representation of a request for a `Forwarder` to send `data` on behalf of a `from` to a target (`to`).\\n */\\n struct ForwardRequest {\\n address from;\\n address to;\\n uint256 value;\\n uint256 gas;\\n uint256 nonce;\\n bytes data;\\n uint256 validUntilTime;\\n }\\n\\n event DomainRegistered(bytes32 indexed domainSeparator, bytes domainValue);\\n\\n event RequestTypeRegistered(bytes32 indexed typeHash, string typeStr);\\n\\n /**\\n * @param from The address of a sender.\\n * @return The nonce for this address.\\n */\\n function getNonce(address from)\\n external view\\n returns(uint256);\\n\\n /**\\n * @notice Verify the transaction is valid and can be executed.\\n * Implementations must validate the signature and the nonce of the request are correct.\\n * Does not revert and returns successfully if the input is valid.\\n * Reverts if any validation has failed. For instance, if either signature or nonce are incorrect.\\n * Reverts if `domainSeparator` or `requestTypeHash` are not registered as well.\\n */\\n function verify(\\n ForwardRequest calldata forwardRequest,\\n bytes32 domainSeparator,\\n bytes32 requestTypeHash,\\n bytes calldata suffixData,\\n bytes calldata signature\\n ) external view;\\n\\n /**\\n * @notice Executes a transaction specified by the `ForwardRequest`.\\n * The transaction is first verified and then executed.\\n * The success flag and returned bytes array of the `CALL` are returned as-is.\\n *\\n * This method would revert only in case of a verification error.\\n *\\n * All the target errors are reported using the returned success flag and returned bytes array.\\n *\\n * @param forwardRequest All requested transaction parameters.\\n * @param domainSeparator The domain used when signing this request.\\n * @param requestTypeHash The request type used when signing this request.\\n * @param suffixData The ABI-encoded extension data for the current `RequestType` used when signing this request.\\n * @param signature The client signature to be validated.\\n *\\n * @return success The success flag of the underlying `CALL` to the target address.\\n * @return ret The byte array returned by the underlying `CALL` to the target address.\\n */\\n function execute(\\n ForwardRequest calldata forwardRequest,\\n bytes32 domainSeparator,\\n bytes32 requestTypeHash,\\n bytes calldata suffixData,\\n bytes calldata signature\\n )\\n external payable\\n returns (bool success, bytes memory ret);\\n\\n /**\\n * @notice Register a new Request typehash.\\n *\\n * @notice This is necessary for the Forwarder to be able to verify the signatures conforming to the ERC-712.\\n *\\n * @param typeName The name of the request type.\\n * @param typeSuffix Any extra data after the generic params. Must contain add at least one param.\\n * The generic ForwardRequest type is always registered by the constructor.\\n */\\n function registerRequestType(string calldata typeName, string calldata typeSuffix) external;\\n\\n /**\\n * @notice Register a new domain separator.\\n *\\n * @notice This is necessary for the Forwarder to be able to verify the signatures conforming to the ERC-712.\\n *\\n * @notice The domain separator must have the following fields: `name`, `version`, `chainId`, `verifyingContract`.\\n * The `chainId` is the current network's `chainId`, and the `verifyingContract` is this Forwarder's address.\\n * This method accepts the domain name and version to create and register the domain separator value.\\n * @param name The domain's display name.\\n * @param version The domain/protocol version.\\n */\\n function registerDomainSeparator(string calldata name, string calldata version) external;\\n}\\n\",\"keccak256\":\"0x28669953bd3dcc98a5f959fa3cac97444584b6fbe59341681b9a59f11a83b171\",\"license\":\"GPL-3.0-only\"},\"@opengsn/contracts/src/interfaces/IERC2771Recipient.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.6.0;\\n\\n/**\\n * @title The ERC-2771 Recipient Base Abstract Class - Declarations\\n *\\n * @notice A contract must implement this interface in order to support relayed transaction.\\n *\\n * @notice It is recommended that your contract inherits from the ERC2771Recipient contract.\\n */\\nabstract contract IERC2771Recipient {\\n\\n /**\\n * :warning: **Warning** :warning: The Forwarder can have a full control over your Recipient. Only trust verified Forwarder.\\n * @param forwarder The address of the Forwarder contract that is being used.\\n * @return isTrustedForwarder `true` if the Forwarder is trusted to forward relayed transactions by this Recipient.\\n */\\n function isTrustedForwarder(address forwarder) public virtual view returns(bool);\\n\\n /**\\n * @notice Use this method the contract anywhere instead of msg.sender to support relayed transactions.\\n * @return sender The real sender of this call.\\n * For a call that came through the Forwarder the real sender is extracted from the last 20 bytes of the `msg.data`.\\n * Otherwise simply returns `msg.sender`.\\n */\\n function _msgSender() internal virtual view returns (address);\\n\\n /**\\n * @notice Use this method in the contract instead of `msg.data` when difference matters (hashing, signature, etc.)\\n * @return data The real `msg.data` of this call.\\n * For a call that came through the Forwarder, the real sender address was appended as the last 20 bytes\\n * of the `msg.data` - so this method will strip those 20 bytes off.\\n * Otherwise (if the call was made directly and not through the forwarder) simply returns `msg.data`.\\n */\\n function _msgData() internal virtual view returns (bytes calldata);\\n}\\n\",\"keccak256\":\"0xc762358681e3494519a5fff2f7e3f0f74f9c9f395f23b00cdfb45e0fb9ef8170\",\"license\":\"MIT\"},\"@opengsn/contracts/src/interfaces/IPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity >=0.7.6;\\npragma abicoder v2;\\n\\nimport \\\"@openzeppelin/contracts/interfaces/IERC165.sol\\\";\\n\\nimport \\\"../utils/GsnTypes.sol\\\";\\n\\n/**\\n * @title The Paymaster Interface\\n * @notice Contracts implementing this interface exist to make decision about paying the transaction fee to the relay.\\n *\\n * @notice There are two callbacks here that are executed by the RelayHub: `preRelayedCall` and `postRelayedCall`.\\n *\\n * @notice It is recommended that your implementation inherits from the abstract BasePaymaster contract.\\n*/\\ninterface IPaymaster is IERC165 {\\n /**\\n * @notice The limits this Paymaster wants to be imposed by the RelayHub on user input. See `getGasAndDataLimits`.\\n */\\n struct GasAndDataLimits {\\n uint256 acceptanceBudget;\\n uint256 preRelayedCallGasLimit;\\n uint256 postRelayedCallGasLimit;\\n uint256 calldataSizeLimit;\\n }\\n\\n /**\\n * @notice Return the Gas Limits for Paymaster's functions and maximum msg.data length values for this Paymaster.\\n * This function allows different paymasters to have different properties without changes to the RelayHub.\\n * @return limits An instance of the `GasAndDataLimits` struct\\n *\\n * ##### `acceptanceBudget`\\n * If the transactions consumes more than `acceptanceBudget` this Paymaster will be charged for gas no matter what.\\n * Transaction that gets rejected after consuming more than `acceptanceBudget` gas is on this Paymaster's expense.\\n *\\n * Should be set to an amount gas this Paymaster expects to spend deciding whether to accept or reject a request.\\n * This includes gas consumed by calculations in the `preRelayedCall`, `Forwarder` and the recipient contract.\\n *\\n * :warning: **Warning** :warning: As long this value is above `preRelayedCallGasLimit`\\n * (see defaults in `BasePaymaster`), the Paymaster is guaranteed it will never pay for rejected transactions.\\n * If this value is below `preRelayedCallGasLimit`, it might might make Paymaster open to a \\\"griefing\\\" attack.\\n *\\n * The relayers should prefer lower `acceptanceBudget`, as it improves their chances of being compensated.\\n * From a Relay's point of view, this is the highest gas value a bad Paymaster may cost the relay,\\n * since the paymaster will pay anything above that value regardless of whether the transaction succeeds or reverts.\\n * Specifying value too high might make the call rejected by relayers (see `maxAcceptanceBudget` in server config).\\n *\\n * ##### `preRelayedCallGasLimit`\\n * The max gas usage of preRelayedCall. Any revert of the `preRelayedCall` is a request rejection by the paymaster.\\n * As long as `acceptanceBudget` is above `preRelayedCallGasLimit`, any such revert is not payed by the paymaster.\\n *\\n * ##### `postRelayedCallGasLimit`\\n * The max gas usage of postRelayedCall. The Paymaster is not charged for the maximum, only for actually used gas.\\n * Note that an OOG will revert the inner transaction, but the paymaster will be charged for it anyway.\\n */\\n function getGasAndDataLimits()\\n external\\n view\\n returns (\\n GasAndDataLimits memory limits\\n );\\n\\n /**\\n * @notice :warning: **Warning** :warning: using incorrect Forwarder may cause the Paymaster to agreeing to pay for invalid transactions.\\n * @return trustedForwarder The address of the `Forwarder` that is trusted by this Paymaster to execute the requests.\\n */\\n function getTrustedForwarder() external view returns (address trustedForwarder);\\n\\n /**\\n * @return relayHub The address of the `RelayHub` that is trusted by this Paymaster to execute the requests.\\n */\\n function getRelayHub() external view returns (address relayHub);\\n\\n /**\\n * @notice Called by the Relay in view mode and later by the `RelayHub` on-chain to validate that\\n * the Paymaster agrees to pay for this call.\\n *\\n * The request is considered to be rejected by the Paymaster in one of the following conditions:\\n * - `preRelayedCall()` method reverts\\n * - the `Forwarder` reverts because of nonce or signature error\\n * - the `Paymaster` returned `rejectOnRecipientRevert: true` and the recipient contract reverted\\n * (and all that did not consume more than `acceptanceBudget` gas).\\n *\\n * In any of the above cases, all Paymaster calls and the recipient call are reverted.\\n * In any other case the Paymaster will pay for the gas cost of the transaction.\\n * Note that even if `postRelayedCall` is reverted the Paymaster will be charged.\\n *\\n\\n * @param relayRequest - the full relay request structure\\n * @param signature - user's EIP712-compatible signature of the `relayRequest`.\\n * Note that in most cases the paymaster shouldn't try use it at all. It is always checked\\n * by the forwarder immediately after preRelayedCall returns.\\n * @param approvalData - extra dapp-specific data (e.g. signature from trusted party)\\n * @param maxPossibleGas - based on values returned from `getGasAndDataLimits`\\n * the RelayHub will calculate the maximum possible amount of gas the user may be charged for.\\n * In order to convert this value to wei, the Paymaster has to call \\\"relayHub.calculateCharge()\\\"\\n *\\n * @return context\\n * A byte array to be passed to postRelayedCall.\\n * Can contain any data needed by this Paymaster in any form or be empty if no extra data is needed.\\n * @return rejectOnRecipientRevert\\n * The flag that allows a Paymaster to \\\"delegate\\\" the rejection to the recipient code.\\n * It also means the Paymaster trust the recipient to reject fast: both preRelayedCall,\\n * forwarder check and recipient checks must fit into the GasLimits.acceptanceBudget,\\n * otherwise the TX is paid by the Paymaster.\\n * `true` if the Paymaster wants to reject the TX if the recipient reverts.\\n * `false` if the Paymaster wants rejects by the recipient to be completed on chain and paid by the Paymaster.\\n */\\n function preRelayedCall(\\n GsnTypes.RelayRequest calldata relayRequest,\\n bytes calldata signature,\\n bytes calldata approvalData,\\n uint256 maxPossibleGas\\n )\\n external\\n returns (bytes memory context, bool rejectOnRecipientRevert);\\n\\n /**\\n * @notice This method is called after the actual relayed function call.\\n * It may be used to record the transaction (e.g. charge the caller by some contract logic) for this call.\\n *\\n * Revert in this functions causes a revert of the client's relayed call (and preRelayedCall(), but the Paymaster\\n * is still committed to pay the relay for the entire transaction.\\n *\\n * @param context The call context, as returned by the preRelayedCall\\n * @param success `true` if the relayed call succeeded, false if it reverted\\n * @param gasUseWithoutPost The actual amount of gas used by the entire transaction, EXCEPT\\n * the gas used by the postRelayedCall itself.\\n * @param relayData The relay params of the request. can be used by relayHub.calculateCharge()\\n *\\n */\\n function postRelayedCall(\\n bytes calldata context,\\n bool success,\\n uint256 gasUseWithoutPost,\\n GsnTypes.RelayData calldata relayData\\n ) external;\\n\\n /**\\n * @return version The SemVer string of this Paymaster's version.\\n */\\n function versionPaymaster() external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xeedb6d83ce600a97a4abbb614d24c65cb2ebc06a1784cc6a81afa9233d1331b6\",\"license\":\"GPL-3.0-only\"},\"@opengsn/contracts/src/interfaces/IRelayHub.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity >=0.7.6;\\npragma abicoder v2;\\n\\nimport \\\"@openzeppelin/contracts/interfaces/IERC165.sol\\\";\\n\\nimport \\\"../utils/GsnTypes.sol\\\";\\nimport \\\"./IStakeManager.sol\\\";\\n\\n/**\\n * @title The RelayHub interface\\n * @notice The implementation of this interface provides all the information the GSN client needs to\\n * create a valid `RelayRequest` and also serves as an entry point for such requests.\\n *\\n * @notice The RelayHub also handles all the related financial records and hold the balances of participants.\\n * The Paymasters keep their Ether deposited in the `RelayHub` in order to pay for the `RelayRequest`s that thay choose\\n * to pay for, and Relay Servers keep their earned Ether in the `RelayHub` until they choose to `withdraw()`\\n *\\n * @notice The RelayHub on each supported network only needs a single instance and there is usually no need for dApp\\n * developers or Relay Server operators to redeploy, reimplement, modify or override the `RelayHub`.\\n */\\ninterface IRelayHub is IERC165 {\\n /**\\n * @notice A struct that contains all the parameters of the `RelayHub` that can be modified after the deployment.\\n */\\n struct RelayHubConfig {\\n // maximum number of worker accounts allowed per manager\\n uint256 maxWorkerCount;\\n // Gas set aside for all relayCall() instructions to prevent unexpected out-of-gas exceptions\\n uint256 gasReserve;\\n // Gas overhead to calculate gasUseWithoutPost\\n uint256 postOverhead;\\n // Gas cost of all relayCall() instructions after actual 'calculateCharge()'\\n // Assume that relay has non-zero balance (costs 15'000 more otherwise).\\n uint256 gasOverhead;\\n // Minimum unstake delay seconds of a relay manager's stake on the StakeManager\\n uint256 minimumUnstakeDelay;\\n // Developers address\\n address devAddress;\\n // 0 < fee < 100, as percentage of total charge from paymaster to relayer\\n uint8 devFee;\\n // baseRelayFee The base fee the Relay Server charges for a single transaction in Ether, in wei.\\n uint80 baseRelayFee;\\n // pctRelayFee The percent of the total charge to add as a Relay Server fee to the total charge.\\n uint16 pctRelayFee;\\n }\\n\\n /// @notice Emitted when a configuration of the `RelayHub` is changed\\n event RelayHubConfigured(RelayHubConfig config);\\n\\n /// @notice Emitted when relays are added by a relayManager\\n event RelayWorkersAdded(\\n address indexed relayManager,\\n address[] newRelayWorkers,\\n uint256 workersCount\\n );\\n\\n /// @notice Emitted when an account withdraws funds from the `RelayHub`.\\n event Withdrawn(\\n address indexed account,\\n address indexed dest,\\n uint256 amount\\n );\\n\\n /// @notice Emitted when `depositFor` is called, including the amount and account that was funded.\\n event Deposited(\\n address indexed paymaster,\\n address indexed from,\\n uint256 amount\\n );\\n\\n /// @notice Emitted for each token configured for staking in setMinimumStakes\\n event StakingTokenDataChanged(\\n address token,\\n uint256 minimumStake\\n );\\n\\n /**\\n * @notice Emitted when an attempt to relay a call fails and the `Paymaster` does not accept the transaction.\\n * The actual relayed call was not executed, and the recipient not charged.\\n * @param reason contains a revert reason returned from preRelayedCall or forwarder.\\n */\\n event TransactionRejectedByPaymaster(\\n address indexed relayManager,\\n address indexed paymaster,\\n bytes32 indexed relayRequestID,\\n address from,\\n address to,\\n address relayWorker,\\n bytes4 selector,\\n uint256 innerGasUsed,\\n bytes reason\\n );\\n\\n /**\\n * @notice Emitted when a transaction is relayed. Note that the actual internal function call might be reverted.\\n * The reason for a revert will be indicated in the `status` field of a corresponding `RelayCallStatus` value.\\n * @notice `charge` is the Ether value deducted from the `Paymaster` balance.\\n * The amount added to the `relayManager` balance will be lower if there is an activated `devFee` in the `config`.\\n */\\n event TransactionRelayed(\\n address indexed relayManager,\\n address indexed relayWorker,\\n bytes32 indexed relayRequestID,\\n address from,\\n address to,\\n address paymaster,\\n bytes4 selector,\\n RelayCallStatus status,\\n uint256 charge\\n );\\n\\n /// @notice This event is emitted in case the internal function returns a value or reverts with a revert string.\\n event TransactionResult(\\n RelayCallStatus status,\\n bytes returnValue\\n );\\n\\n /// @notice This event is emitted in case this `RelayHub` is deprecated and will stop serving transactions soon.\\n event HubDeprecated(uint256 deprecationTime);\\n\\n /**\\n * @notice This event is emitted in case a `relayManager` has been deemed \\\"abandoned\\\" for being\\n * unresponsive for a prolonged period of time.\\n * @notice This event means the entire balance of the relay has been transferred to the `devAddress`.\\n */\\n event AbandonedRelayManagerBalanceEscheated(\\n address indexed relayManager,\\n uint256 balance\\n );\\n\\n /**\\n * Error codes that describe all possible failure reasons reported in the `TransactionRelayed` event `status` field.\\n * @param OK The transaction was successfully relayed and execution successful - never included in the event.\\n * @param RelayedCallFailed The transaction was relayed, but the relayed call failed.\\n * @param RejectedByPreRelayed The transaction was not relayed due to preRelatedCall reverting.\\n * @param RejectedByForwarder The transaction was not relayed due to forwarder check (signature,nonce).\\n * @param PostRelayedFailed The transaction was relayed and reverted due to postRelatedCall reverting.\\n * @param PaymasterBalanceChanged The transaction was relayed and reverted due to the paymaster balance change.\\n */\\n enum RelayCallStatus {\\n OK,\\n RelayedCallFailed,\\n RejectedByPreRelayed,\\n RejectedByForwarder,\\n RejectedByRecipientRevert,\\n PostRelayedFailed,\\n PaymasterBalanceChanged\\n }\\n\\n /**\\n * @notice Add new worker addresses controlled by the sender who must be a staked Relay Manager address.\\n * Emits a `RelayWorkersAdded` event.\\n * This function can be called multiple times, emitting new events.\\n */\\n function addRelayWorkers(address[] calldata newRelayWorkers) external;\\n\\n /**\\n * @notice The `RelayRegistrar` callback to notify the `RelayHub` that this `relayManager` has updated registration.\\n */\\n function onRelayServerRegistered(address relayManager) external;\\n\\n // Balance management\\n\\n /**\\n * @notice Deposits ether for a `Paymaster`, so that it can and pay for relayed transactions.\\n * :warning: **Warning** :warning: Unused balance can only be withdrawn by the holder itself, by calling `withdraw`.\\n * Emits a `Deposited` event.\\n */\\n function depositFor(address target) external payable;\\n\\n /**\\n * @notice Withdraws from an account's balance, sending it back to the caller.\\n * Relay Managers call this to retrieve their revenue, and `Paymasters` can also use it to reduce their funding.\\n * Emits a `Withdrawn` event.\\n */\\n function withdraw(address payable dest, uint256 amount) external;\\n\\n /**\\n * @notice Withdraws from an account's balance, sending funds to multiple provided addresses.\\n * Relay Managers call this to retrieve their revenue, and `Paymasters` can also use it to reduce their funding.\\n * Emits a `Withdrawn` event for each destination.\\n */\\n function withdrawMultiple(address payable[] memory dest, uint256[] memory amount) external;\\n\\n // Relaying\\n\\n\\n /**\\n * @notice Relays a transaction. For this to succeed, multiple conditions must be met:\\n * - `Paymaster`'s `preRelayCall` method must succeed and not revert.\\n * - the `msg.sender` must be a registered Relay Worker that the user signed to use.\\n * - the transaction's gas fees must be equal or larger than the ones that were signed by the sender.\\n * - the transaction must have enough gas to run all internal transactions if they use all gas available to them.\\n * - the `Paymaster` must have enough balance to pay the Relay Worker if all gas is spent.\\n *\\n * @notice If all conditions are met, the call will be relayed and the `Paymaster` charged.\\n *\\n * @param domainSeparatorName The name of the Domain Separator used to verify the EIP-712 signature\\n * @param maxAcceptanceBudget The maximum valid value for `paymaster.getGasLimits().acceptanceBudget` to return.\\n * @param relayRequest All details of the requested relayed call.\\n * @param signature The client's EIP-712 signature over the `relayRequest` struct.\\n * @param approvalData The dapp-specific data forwarded to the `Paymaster`'s `preRelayedCall` method.\\n * This value is **not** verified by the `RelayHub` in any way.\\n * As an example, it can be used to pass some kind of a third-party signature to the `Paymaster` for verification.\\n *\\n * Emits a `TransactionRelayed` event regardless of whether the transaction succeeded or failed.\\n */\\n function relayCall(\\n string calldata domainSeparatorName,\\n uint256 maxAcceptanceBudget,\\n GsnTypes.RelayRequest calldata relayRequest,\\n bytes calldata signature,\\n bytes calldata approvalData\\n )\\n external\\n returns (\\n bool paymasterAccepted,\\n uint256 charge,\\n IRelayHub.RelayCallStatus status,\\n bytes memory returnValue\\n );\\n\\n /**\\n * @notice In case the Relay Worker has been found to be in violation of some rules by the `Penalizer` contract,\\n * the `Penalizer` will call this method to execute a penalization.\\n * The `RelayHub` will look up the Relay Manager of the given Relay Worker and will forward the call to\\n * the `StakeManager` contract. The `RelayHub` does not perform the actual penalization either.\\n * @param relayWorker The address of the Relay Worker that committed a penalizable offense.\\n * @param beneficiary The address that called the `Penalizer` and will receive a reward for it.\\n */\\n function penalize(address relayWorker, address payable beneficiary) external;\\n\\n /**\\n * @notice Sets or changes the configuration of this `RelayHub`.\\n * @param _config The new configuration.\\n */\\n function setConfiguration(RelayHubConfig memory _config) external;\\n\\n /**\\n * @notice Sets or changes the minimum amount of a given `token` that needs to be staked so that the Relay Manager\\n * is considered to be 'staked' by this `RelayHub`. Zero value means this token is not allowed for staking.\\n * @param token An array of addresses of ERC-20 compatible tokens.\\n * @param minimumStake An array of minimal amounts necessary for a corresponding token, in wei.\\n */\\n function setMinimumStakes(IERC20[] memory token, uint256[] memory minimumStake) external;\\n\\n /**\\n * @notice Deprecate hub by reverting all incoming `relayCall()` calls starting from a given timestamp\\n * @param _deprecationTime The timestamp in seconds after which the `RelayHub` stops serving transactions.\\n */\\n function deprecateHub(uint256 _deprecationTime) external;\\n\\n /**\\n * @notice\\n * @param relayManager\\n */\\n function escheatAbandonedRelayBalance(address relayManager) external;\\n\\n /**\\n * @notice The fee is expressed as a base fee in wei plus percentage of the actual charge.\\n * For example, a value '40' stands for a 40% fee, so the recipient will be charged for 1.4 times the spent amount.\\n * @param gasUsed An amount of gas used by the transaction.\\n * @param relayData The details of a transaction signed by the sender.\\n * @return The calculated charge, in wei.\\n */\\n function calculateCharge(uint256 gasUsed, GsnTypes.RelayData calldata relayData) external view returns (uint256);\\n\\n /**\\n * @notice The fee is expressed as a percentage of the actual charge.\\n * For example, a value '40' stands for a 40% fee, so the Relay Manager will only get 60% of the `charge`.\\n * @param charge The amount of Ether in wei the Paymaster will be charged for this transaction.\\n * @return The calculated devFee, in wei.\\n */\\n function calculateDevCharge(uint256 charge) external view returns (uint256);\\n /* getters */\\n\\n /// @return config The configuration of the `RelayHub`.\\n function getConfiguration() external view returns (RelayHubConfig memory config);\\n\\n /**\\n * @param token An address of an ERC-20 compatible tokens.\\n * @return The minimum amount of a given `token` that needs to be staked so that the Relay Manager\\n * is considered to be 'staked' by this `RelayHub`. Zero value means this token is not allowed for staking.\\n */\\n function getMinimumStakePerToken(IERC20 token) external view returns (uint256);\\n\\n /**\\n * @param worker An address of the Relay Worker.\\n * @return The address of its Relay Manager.\\n */\\n function getWorkerManager(address worker) external view returns (address);\\n\\n /**\\n * @param manager An address of the Relay Manager.\\n * @return The count of Relay Workers associated with this Relay Manager.\\n */\\n function getWorkerCount(address manager) external view returns (uint256);\\n\\n /// @return An account's balance. It can be either a deposit of a `Paymaster`, or a revenue of a Relay Manager.\\n function balanceOf(address target) external view returns (uint256);\\n\\n /// @return The `StakeManager` address for this `RelayHub`.\\n function getStakeManager() external view returns (IStakeManager);\\n\\n /// @return The `Penalizer` address for this `RelayHub`.\\n function getPenalizer() external view returns (address);\\n\\n /// @return The `RelayRegistrar` address for this `RelayHub`.\\n function getRelayRegistrar() external view returns (address);\\n\\n /// @return The `BatchGateway` address for this `RelayHub`.\\n function getBatchGateway() external view returns (address);\\n\\n /**\\n * @notice Uses `StakeManager` to decide if the Relay Manager can be considered staked or not.\\n * Returns if the stake's token, amount and delay satisfy all requirements, reverts otherwise.\\n */\\n function verifyRelayManagerStaked(address relayManager) external view;\\n\\n /**\\n * @notice Uses `StakeManager` to check if the Relay Manager can be considered abandoned or not.\\n * Returns true if the stake's abandonment time is in the past including the escheatment delay, false otherwise.\\n */\\n function isRelayEscheatable(address relayManager) external view returns (bool);\\n\\n /// @return `true` if the `RelayHub` is deprecated, `false` it it is not deprecated and can serve transactions.\\n function isDeprecated() external view returns (bool);\\n\\n /// @return The timestamp from which the hub no longer allows relaying calls.\\n function getDeprecationTime() external view returns (uint256);\\n\\n /// @return The block number in which the contract has been deployed.\\n function getCreationBlock() external view returns (uint256);\\n\\n /// @return a SemVer-compliant version of the `RelayHub` contract.\\n function versionHub() external view returns (string memory);\\n\\n /// @return A total measurable amount of gas left to current execution. Same as 'gasleft()' for pure EVMs.\\n function aggregateGasleft() external view returns (uint256);\\n}\\n\\n\",\"keccak256\":\"0x0ab29ca5985c98f530e5985e3d9dd14f00d34527410ce980b51b26e57bb0121c\",\"license\":\"GPL-3.0-only\"},\"@opengsn/contracts/src/interfaces/IStakeManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity >=0.7.6;\\npragma abicoder v2;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @title The StakeManager Interface\\n * @notice In order to prevent an attacker from registering a large number of unresponsive relays, the GSN requires\\n * the Relay Server to maintain a permanently locked stake in the system before being able to register.\\n *\\n * @notice Also, in some cases the behavior of a Relay Server may be found to be illegal by a `Penalizer` contract.\\n * In such case, the stake will never be returned to the Relay Server operator and will be slashed.\\n *\\n * @notice An implementation of this interface is tasked with keeping Relay Servers' stakes, made in any ERC-20 token.\\n * Note that the `RelayHub` chooses which ERC-20 tokens to support and how much stake is needed.\\n */\\ninterface IStakeManager is IERC165 {\\n\\n /// @notice Emitted when a `stake` or `unstakeDelay` are initialized or increased.\\n event StakeAdded(\\n address indexed relayManager,\\n address indexed owner,\\n IERC20 token,\\n uint256 stake,\\n uint256 unstakeDelay\\n );\\n\\n /// @notice Emitted once a stake is scheduled for withdrawal.\\n event StakeUnlocked(\\n address indexed relayManager,\\n address indexed owner,\\n uint256 withdrawTime\\n );\\n\\n /// @notice Emitted when owner withdraws `relayManager` funds.\\n event StakeWithdrawn(\\n address indexed relayManager,\\n address indexed owner,\\n IERC20 token,\\n uint256 amount\\n );\\n\\n /// @notice Emitted when an authorized `RelayHub` penalizes a `relayManager`.\\n event StakePenalized(\\n address indexed relayManager,\\n address indexed beneficiary,\\n IERC20 token,\\n uint256 reward\\n );\\n\\n /// @notice Emitted when a `relayManager` adds a new `RelayHub` to a list of authorized.\\n event HubAuthorized(\\n address indexed relayManager,\\n address indexed relayHub\\n );\\n\\n /// @notice Emitted when a `relayManager` removes a `RelayHub` from a list of authorized.\\n event HubUnauthorized(\\n address indexed relayManager,\\n address indexed relayHub,\\n uint256 removalTime\\n );\\n\\n /// @notice Emitted when a `relayManager` sets its `owner`. This is necessary to prevent stake hijacking.\\n event OwnerSet(\\n address indexed relayManager,\\n address indexed owner\\n );\\n\\n /// @notice Emitted when a `burnAddress` is changed.\\n event BurnAddressSet(\\n address indexed burnAddress\\n );\\n\\n /// @notice Emitted when a `devAddress` is changed.\\n event DevAddressSet(\\n address indexed devAddress\\n );\\n\\n /// @notice Emitted if Relay Server is inactive for an `abandonmentDelay` and contract owner initiates its removal.\\n event RelayServerAbandoned(\\n address indexed relayManager,\\n uint256 abandonedTime\\n );\\n\\n /// @notice Emitted to indicate an action performed by a relay server to prevent it from being marked as abandoned.\\n event RelayServerKeepalive(\\n address indexed relayManager,\\n uint256 keepaliveTime\\n );\\n\\n /// @notice Emitted when the stake of an abandoned relayer has been confiscated and transferred to the `devAddress`.\\n event AbandonedRelayManagerStakeEscheated(\\n address indexed relayManager,\\n address indexed owner,\\n IERC20 token,\\n uint256 amount\\n );\\n\\n /**\\n * @param stake - amount of ether staked for this relay\\n * @param unstakeDelay - number of seconds to elapse before the owner can retrieve the stake after calling 'unlock'\\n * @param withdrawTime - timestamp in seconds when 'withdraw' will be callable, or zero if the unlock has not been called\\n * @param owner - address that receives revenue and manages relayManager's stake\\n */\\n struct StakeInfo {\\n uint256 stake;\\n uint256 unstakeDelay;\\n uint256 withdrawTime;\\n uint256 abandonedTime;\\n uint256 keepaliveTime;\\n IERC20 token;\\n address owner;\\n }\\n\\n struct RelayHubInfo {\\n uint256 removalTime;\\n }\\n\\n /**\\n * @param devAddress - the address that will receive the 'abandoned' stake\\n * @param abandonmentDelay - the amount of time after which the relay can be marked as 'abandoned'\\n * @param escheatmentDelay - the amount of time after which the abandoned relay's stake and balance may be withdrawn to the `devAddress`\\n */\\n struct AbandonedRelayServerConfig {\\n address devAddress;\\n uint256 abandonmentDelay;\\n uint256 escheatmentDelay;\\n }\\n\\n /**\\n * @notice Set the owner of a Relay Manager. Called only by the RelayManager itself.\\n * Note that owners cannot transfer ownership - if the entry already exists, reverts.\\n * @param owner - owner of the relay (as configured off-chain)\\n */\\n function setRelayManagerOwner(address owner) external;\\n\\n /**\\n * @notice Put a stake for a relayManager and set its unstake delay.\\n * Only the owner can call this function. If the entry does not exist, reverts.\\n * The owner must give allowance of the ERC-20 token to the StakeManager before calling this method.\\n * It is the RelayHub who has a configurable list of minimum stakes per token. StakeManager accepts all tokens.\\n * @param token The address of an ERC-20 token that is used by the relayManager as a stake\\n * @param relayManager The address that represents a stake entry and controls relay registrations on relay hubs\\n * @param unstakeDelay The number of seconds to elapse before an owner can retrieve the stake after calling `unlock`\\n * @param amount The amount of tokens to be taken from the relayOwner and locked in the StakeManager as a stake\\n */\\n function stakeForRelayManager(IERC20 token, address relayManager, uint256 unstakeDelay, uint256 amount) external;\\n\\n /**\\n * @notice Schedule the unlocking of the stake. The `unstakeDelay` must pass before owner can call `withdrawStake`.\\n * @param relayManager The address of a Relay Manager whose stake is to be unlocked.\\n */\\n function unlockStake(address relayManager) external;\\n /**\\n * @notice Withdraw the unlocked stake.\\n * @param relayManager The address of a Relay Manager whose stake is to be withdrawn.\\n */\\n function withdrawStake(address relayManager) external;\\n\\n /**\\n * @notice Add the `RelayHub` to a list of authorized by this Relay Manager.\\n * This allows the RelayHub to penalize this Relay Manager. The `RelayHub` cannot trust a Relay it cannot penalize.\\n * @param relayManager The address of a Relay Manager whose stake is to be authorized for the new `RelayHub`.\\n * @param relayHub The address of a `RelayHub` to be authorized.\\n */\\n function authorizeHubByOwner(address relayManager, address relayHub) external;\\n\\n /**\\n * @notice Same as `authorizeHubByOwner` but can be called by the RelayManager itself.\\n */\\n function authorizeHubByManager(address relayHub) external;\\n\\n /**\\n * @notice Remove the `RelayHub` from a list of authorized by this Relay Manager.\\n * @param relayManager The address of a Relay Manager.\\n * @param relayHub The address of a `RelayHub` to be unauthorized.\\n */\\n function unauthorizeHubByOwner(address relayManager, address relayHub) external;\\n\\n /**\\n * @notice Same as `unauthorizeHubByOwner` but can be called by the RelayManager itself.\\n */\\n function unauthorizeHubByManager(address relayHub) external;\\n\\n /**\\n * Slash the stake of the relay relayManager. In order to prevent stake kidnapping, burns part of stake on the way.\\n * @param relayManager The address of a Relay Manager to be penalized.\\n * @param beneficiary The address that receives part of the penalty amount.\\n * @param amount A total amount of penalty to be withdrawn from stake.\\n */\\n function penalizeRelayManager(address relayManager, address beneficiary, uint256 amount) external;\\n\\n /**\\n * @notice Allows the contract owner to set the given `relayManager` as abandoned after a configurable delay.\\n * Its entire stake and balance will be taken from a relay if it does not respond to being marked as abandoned.\\n */\\n function markRelayAbandoned(address relayManager) external;\\n\\n /**\\n * @notice If more than `abandonmentDelay` has passed since the last Keepalive transaction, and relay manager\\n * has been marked as abandoned, and after that more that `escheatmentDelay` have passed, entire stake and\\n * balance will be taken from this relay.\\n */\\n function escheatAbandonedRelayStake(address relayManager) external;\\n\\n /**\\n * @notice Sets a new `keepaliveTime` for the given `relayManager`, preventing it from being marked as abandoned.\\n * Can be called by an authorized `RelayHub` or by the `relayOwner` address.\\n */\\n function updateRelayKeepaliveTime(address relayManager) external;\\n\\n /**\\n * @notice Check if the Relay Manager can be considered abandoned or not.\\n * Returns true if the stake's abandonment time is in the past including the escheatment delay, false otherwise.\\n */\\n function isRelayEscheatable(address relayManager) external view returns(bool);\\n\\n /**\\n * @notice Get the stake details information for the given Relay Manager.\\n * @param relayManager The address of a Relay Manager.\\n * @return stakeInfo The `StakeInfo` structure.\\n * @return isSenderAuthorizedHub `true` if the `msg.sender` for this call was a `RelayHub` that is authorized now.\\n * `false` if the `msg.sender` for this call is not authorized.\\n */\\n function getStakeInfo(address relayManager) external view returns (StakeInfo memory stakeInfo, bool isSenderAuthorizedHub);\\n\\n /**\\n * @return The maximum unstake delay this `StakeManger` allows. This is to prevent locking money forever by mistake.\\n */\\n function getMaxUnstakeDelay() external view returns (uint256);\\n\\n /**\\n * @notice Change the address that will receive the 'burned' part of the penalized stake.\\n * This is done to prevent malicious Relay Server from penalizing itself and breaking even.\\n */\\n function setBurnAddress(address _burnAddress) external;\\n\\n /**\\n * @return The address that will receive the 'burned' part of the penalized stake.\\n */\\n function getBurnAddress() external view returns (address);\\n\\n /**\\n * @notice Change the address that will receive the 'abandoned' stake.\\n * This is done to prevent Relay Servers that lost their keys from losing access to funds.\\n */\\n function setDevAddress(address _burnAddress) external;\\n\\n /**\\n * @return The structure that contains all configuration values for the 'abandoned' stake.\\n */\\n function getAbandonedRelayServerConfig() external view returns (AbandonedRelayServerConfig memory);\\n\\n /**\\n * @return the block number in which the contract has been deployed.\\n */\\n function getCreationBlock() external view returns (uint256);\\n\\n /**\\n * @return a SemVer-compliant version of the `StakeManager` contract.\\n */\\n function versionSM() external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x77035b55ca4c09cb499bc0cab3f9e791d77597b148dbfee8bf94ca6c0039c3e0\",\"license\":\"GPL-3.0-only\"},\"@opengsn/contracts/src/utils/GsnEip712Library.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.0;\\npragma abicoder v2;\\n\\nimport \\\"../utils/GsnTypes.sol\\\";\\nimport \\\"../interfaces/IERC2771Recipient.sol\\\";\\nimport \\\"../forwarder/IForwarder.sol\\\";\\n\\nimport \\\"./GsnUtils.sol\\\";\\n\\n/**\\n * @title The ERC-712 Library for GSN\\n * @notice Bridge Library to convert a GSN RelayRequest into a valid `ForwardRequest` for a `Forwarder`.\\n */\\nlibrary GsnEip712Library {\\n // maximum length of return value/revert reason for 'execute' method. Will truncate result if exceeded.\\n uint256 private constant MAX_RETURN_SIZE = 1024;\\n\\n //copied from Forwarder (can't reference string constants even from another library)\\n string public constant GENERIC_PARAMS = \\\"address from,address to,uint256 value,uint256 gas,uint256 nonce,bytes data,uint256 validUntilTime\\\";\\n\\n bytes public constant RELAYDATA_TYPE = \\\"RelayData(uint256 maxFeePerGas,uint256 maxPriorityFeePerGas,uint256 transactionCalldataGasUsed,address relayWorker,address paymaster,address forwarder,bytes paymasterData,uint256 clientId)\\\";\\n\\n string public constant RELAY_REQUEST_NAME = \\\"RelayRequest\\\";\\n string public constant RELAY_REQUEST_SUFFIX = string(abi.encodePacked(\\\"RelayData relayData)\\\", RELAYDATA_TYPE));\\n\\n bytes public constant RELAY_REQUEST_TYPE = abi.encodePacked(\\n RELAY_REQUEST_NAME,\\\"(\\\",GENERIC_PARAMS,\\\",\\\", RELAY_REQUEST_SUFFIX);\\n\\n bytes32 public constant RELAYDATA_TYPEHASH = keccak256(RELAYDATA_TYPE);\\n bytes32 public constant RELAY_REQUEST_TYPEHASH = keccak256(RELAY_REQUEST_TYPE);\\n\\n\\n struct EIP712Domain {\\n string name;\\n string version;\\n uint256 chainId;\\n address verifyingContract;\\n }\\n\\n bytes32 public constant EIP712DOMAIN_TYPEHASH = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n\\n function splitRequest(\\n GsnTypes.RelayRequest calldata req\\n )\\n internal\\n pure\\n returns (\\n bytes memory suffixData\\n ) {\\n suffixData = abi.encode(\\n hashRelayData(req.relayData));\\n }\\n\\n //verify that the recipient trusts the given forwarder\\n // MUST be called by paymaster\\n function verifyForwarderTrusted(GsnTypes.RelayRequest calldata relayRequest) internal view {\\n (bool success, bytes memory ret) = relayRequest.request.to.staticcall(\\n abi.encodeWithSelector(\\n IERC2771Recipient.isTrustedForwarder.selector, relayRequest.relayData.forwarder\\n )\\n );\\n require(success, \\\"isTrustedForwarder: reverted\\\");\\n require(ret.length == 32, \\\"isTrustedForwarder: bad response\\\");\\n require(abi.decode(ret, (bool)), \\\"invalid forwarder for recipient\\\");\\n }\\n\\n function verifySignature(\\n string memory domainSeparatorName,\\n GsnTypes.RelayRequest calldata relayRequest,\\n bytes calldata signature\\n ) internal view {\\n (bytes memory suffixData) = splitRequest(relayRequest);\\n bytes32 _domainSeparator = domainSeparator(domainSeparatorName, relayRequest.relayData.forwarder);\\n IForwarder forwarder = IForwarder(payable(relayRequest.relayData.forwarder));\\n forwarder.verify(relayRequest.request, _domainSeparator, RELAY_REQUEST_TYPEHASH, suffixData, signature);\\n }\\n\\n function verify(\\n string memory domainSeparatorName,\\n GsnTypes.RelayRequest calldata relayRequest,\\n bytes calldata signature\\n ) internal view {\\n verifyForwarderTrusted(relayRequest);\\n verifySignature(domainSeparatorName, relayRequest, signature);\\n }\\n\\n function execute(\\n string memory domainSeparatorName,\\n GsnTypes.RelayRequest calldata relayRequest,\\n bytes calldata signature\\n ) internal returns (\\n bool forwarderSuccess,\\n bool callSuccess,\\n bytes memory ret\\n ) {\\n (bytes memory suffixData) = splitRequest(relayRequest);\\n bytes32 _domainSeparator = domainSeparator(domainSeparatorName, relayRequest.relayData.forwarder);\\n /* solhint-disable-next-line avoid-low-level-calls */\\n (forwarderSuccess, ret) = relayRequest.relayData.forwarder.call(\\n abi.encodeWithSelector(IForwarder.execute.selector,\\n relayRequest.request, _domainSeparator, RELAY_REQUEST_TYPEHASH, suffixData, signature\\n ));\\n if ( forwarderSuccess ) {\\n\\n //decode return value of execute:\\n (callSuccess, ret) = abi.decode(ret, (bool, bytes));\\n }\\n truncateInPlace(ret);\\n }\\n\\n //truncate the given parameter (in-place) if its length is above the given maximum length\\n // do nothing otherwise.\\n //NOTE: solidity warns unless the method is marked \\\"pure\\\", but it DOES modify its parameter.\\n function truncateInPlace(bytes memory data) internal pure {\\n MinLibBytes.truncateInPlace(data, MAX_RETURN_SIZE);\\n }\\n\\n function domainSeparator(string memory name, address forwarder) internal view returns (bytes32) {\\n return hashDomain(EIP712Domain({\\n name : name,\\n version : \\\"3\\\",\\n chainId : getChainID(),\\n verifyingContract : forwarder\\n }));\\n }\\n\\n function getChainID() internal view returns (uint256 id) {\\n /* solhint-disable no-inline-assembly */\\n assembly {\\n id := chainid()\\n }\\n }\\n\\n function hashDomain(EIP712Domain memory req) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n EIP712DOMAIN_TYPEHASH,\\n keccak256(bytes(req.name)),\\n keccak256(bytes(req.version)),\\n req.chainId,\\n req.verifyingContract));\\n }\\n\\n function hashRelayData(GsnTypes.RelayData calldata req) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n RELAYDATA_TYPEHASH,\\n req.maxFeePerGas,\\n req.maxPriorityFeePerGas,\\n req.transactionCalldataGasUsed,\\n req.relayWorker,\\n req.paymaster,\\n req.forwarder,\\n keccak256(req.paymasterData),\\n req.clientId\\n ));\\n }\\n}\\n\",\"keccak256\":\"0x73b5828c2578aea26dbd21cea00f1a245c94f9720ffd95932777ee6121e31972\",\"license\":\"GPL-3.0-only\"},\"@opengsn/contracts/src/utils/GsnTypes.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.0;\\n\\nimport \\\"../forwarder/IForwarder.sol\\\";\\n\\ninterface GsnTypes {\\n /// @notice maxFeePerGas, maxPriorityFeePerGas, pctRelayFee and baseRelayFee must be validated inside of the paymaster's preRelayedCall in order not to overpay\\n struct RelayData {\\n uint256 maxFeePerGas;\\n uint256 maxPriorityFeePerGas;\\n uint256 transactionCalldataGasUsed;\\n address relayWorker;\\n address paymaster;\\n address forwarder;\\n bytes paymasterData;\\n uint256 clientId;\\n }\\n\\n //note: must start with the ForwardRequest to be an extension of the generic forwarder\\n struct RelayRequest {\\n IForwarder.ForwardRequest request;\\n RelayData relayData;\\n }\\n}\\n\",\"keccak256\":\"0x9fb51c540f32939f1ee291e3fa709be64f7c73485bd7b87c6624c3567dd42a1b\",\"license\":\"GPL-3.0-only\"},\"@opengsn/contracts/src/utils/GsnUtils.sol\":{\"content\":\"/* solhint-disable no-inline-assembly */\\n// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/MinLibBytes.sol\\\";\\nimport \\\"./GsnTypes.sol\\\";\\n\\n/**\\n * @title The GSN Solidity Utils Library\\n * @notice Some library functions used throughout the GSN Solidity codebase.\\n */\\nlibrary GsnUtils {\\n\\n bytes32 constant private RELAY_REQUEST_ID_MASK = 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * @notice Calculate an identifier for the meta-transaction in a format similar to a transaction hash.\\n * Note that uniqueness relies on signature and may not be enforced if meta-transactions are verified\\n * with a different algorithm, e.g. when batching.\\n * @param relayRequest The `RelayRequest` for which an ID is being calculated.\\n * @param signature The signature for the `RelayRequest`. It is not validated here and may even remain empty.\\n */\\n function getRelayRequestID(GsnTypes.RelayRequest calldata relayRequest, bytes calldata signature)\\n internal\\n pure\\n returns (bytes32) {\\n return keccak256(abi.encode(relayRequest.request.from, relayRequest.request.nonce, signature)) & RELAY_REQUEST_ID_MASK;\\n }\\n\\n /**\\n * @notice Extract the method identifier signature from the encoded function call.\\n */\\n function getMethodSig(bytes memory msgData) internal pure returns (bytes4) {\\n return MinLibBytes.readBytes4(msgData, 0);\\n }\\n\\n /**\\n * @notice Extract a parameter from encoded-function block.\\n * see: https://solidity.readthedocs.io/en/develop/abi-spec.html#formal-specification-of-the-encoding\\n * The return value should be casted to the right type (`uintXXX`/`bytesXXX`/`address`/`bool`/`enum`).\\n * @param msgData Byte array containing a uint256 value.\\n * @param index Index in byte array of uint256 value.\\n * @return result uint256 value from byte array.\\n */\\n function getParam(bytes memory msgData, uint256 index) internal pure returns (uint256 result) {\\n return MinLibBytes.readUint256(msgData, 4 + index * 32);\\n }\\n\\n /// @notice Re-throw revert with the same revert data.\\n function revertWithData(bytes memory data) internal pure {\\n assembly {\\n revert(add(data,32), mload(data))\\n }\\n }\\n\\n}\\n\",\"keccak256\":\"0x7ea79bac2508612eba2c9372a7a4af953218b4ee2721e273f6d368e76b1ae7bb\",\"license\":\"GPL-3.0-only\"},\"@opengsn/contracts/src/utils/MinLibBytes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// minimal bytes manipulation required by GSN\\n// a minimal subset from 0x/LibBytes\\n/* solhint-disable no-inline-assembly */\\npragma solidity ^0.8.0;\\n\\nlibrary MinLibBytes {\\n\\n //truncate the given parameter (in-place) if its length is above the given maximum length\\n // do nothing otherwise.\\n //NOTE: solidity warns unless the method is marked \\\"pure\\\", but it DOES modify its parameter.\\n function truncateInPlace(bytes memory data, uint256 maxlen) internal pure {\\n if (data.length > maxlen) {\\n assembly { mstore(data, maxlen) }\\n }\\n }\\n\\n /// @dev Reads an address from a position in a byte array.\\n /// @param b Byte array containing an address.\\n /// @param index Index in byte array of address.\\n /// @return result address from byte array.\\n function readAddress(\\n bytes memory b,\\n uint256 index\\n )\\n internal\\n pure\\n returns (address result)\\n {\\n require (b.length >= index + 20, \\\"readAddress: data too short\\\");\\n\\n // Add offset to index:\\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\\n index += 20;\\n\\n // Read address from array memory\\n assembly {\\n // 1. Add index to address of bytes array\\n // 2. Load 32-byte word from memory\\n // 3. Apply 20-byte mask to obtain address\\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\\n }\\n return result;\\n }\\n\\n function readBytes32(\\n bytes memory b,\\n uint256 index\\n )\\n internal\\n pure\\n returns (bytes32 result)\\n {\\n require(b.length >= index + 32, \\\"readBytes32: data too short\\\" );\\n\\n // Read the bytes32 from array memory\\n assembly {\\n result := mload(add(b, add(index,32)))\\n }\\n return result;\\n }\\n\\n /// @dev Reads a uint256 value from a position in a byte array.\\n /// @param b Byte array containing a uint256 value.\\n /// @param index Index in byte array of uint256 value.\\n /// @return result uint256 value from byte array.\\n function readUint256(\\n bytes memory b,\\n uint256 index\\n )\\n internal\\n pure\\n returns (uint256 result)\\n {\\n result = uint256(readBytes32(b, index));\\n return result;\\n }\\n\\n function readBytes4(\\n bytes memory b,\\n uint256 index\\n )\\n internal\\n pure\\n returns (bytes4 result)\\n {\\n require(b.length >= index + 4, \\\"readBytes4: data too short\\\");\\n\\n // Read the bytes4 from array memory\\n assembly {\\n result := mload(add(b, add(index,32)))\\n // Solidity does not require us to clean the trailing bytes.\\n // We do it anyway\\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x8063af8e0f134be3d794ad39bdc0041f33a16c91a4ee7abb968d4c15c8d10c54\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0xd04b0f06e0666f29cf7cccc82894de541e19bb30a765b107b1e40bb7fe5f7d7a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.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 IERC20 {\\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(address from, address to, uint256 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/common/AHasMembers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\nimport \\\"../lib/LibAddressSet.sol\\\";\\nimport \\\"../lib/LibPaginate.sol\\\";\\nimport \\\"../interfaces/ICustomErrors.sol\\\";\\nimport \\\"./lib/LibHasMembers.sol\\\";\\n\\n/**\\n * @title The Members behaviour abstract contract.\\n * @notice The Fast Members abstract contract is in charge of keeping track of automaton accounts.\\n */\\nabstract contract AHasMembers {\\n using LibAddressSet for LibAddressSet.Data;\\n\\n /// Errors.\\n\\n /// @notice Happens when a function is called by an address that is not a members manager.\\n error RequiresMembersManager(address who);\\n /// @notice Happens when an address is used as a member but is not valid.\\n error RequiresValidMember(address who);\\n\\n /// Events.\\n\\n /**\\n * @notice Emited when a member is added to the implementing contract.\\n * @param member is the address of the added member.\\n */\\n event MemberAdded(address indexed member);\\n /**\\n * @notice Emited when a member is removed to the implementing contract.\\n * @param member is the address of the removed member.\\n */\\n event MemberRemoved(address indexed member);\\n\\n /**\\n * @notice Default implementation - points to `msg.sender`.\\n * @dev May be overriden by the inheriting contract.\\n */\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n /**\\n * @notice Checks whether the given address is a members manager or not.\\n * @dev Must be implemented by the inheriting contract.\\n * @param who is the address to test.\\n */\\n function isMembersManager(address who) internal view virtual returns (bool);\\n\\n /**\\n * @notice Checks whether the given address can be added as a member or not.\\n * @dev Must be implemented by the inheriting contract.\\n * @param who is the address to test.\\n */\\n function isValidMember(address who) internal view virtual returns (bool);\\n\\n /**\\n * @notice This callback is called when a member is added to the contract.\\n * @dev May be overriden by the inheriting contract.\\n * @param member is the address which was added.\\n */\\n function onMemberAdded(address member) internal virtual {}\\n\\n /**\\n * @notice This callback is called when a member is removed to the contract.\\n * @dev May be overriden by the inheriting contract.\\n * @param member is the address which was removed.\\n */\\n function onMemberRemoved(address member) internal virtual {}\\n\\n // Members management.\\n\\n /**\\n * @notice Queries whether a given address is a member or not.\\n * @param who is the address to test.\\n * @return A `bool` equal to `true` when `candidate` is a member.\\n */\\n function isMember(address who) external view returns (bool) {\\n return LibHasMembers.data().memberSet.contains(who);\\n }\\n\\n /**\\n * @notice Queries the number of members.\\n * @return An `uint256`.\\n */\\n function memberCount() external view returns (uint256) {\\n return LibHasMembers.data().memberSet.values.length;\\n }\\n\\n /**\\n * @notice Queries pages of members based on a start index and a page size.\\n * @param index is the offset at which the pagination operation should start.\\n * @param perPage is how many items should be returned.\\n * @return A `(address[], uint256)` tuple, which first item is the list of addresses and the second item a cursor to the next page.\\n */\\n function paginateMembers(uint256 index, uint256 perPage) external view returns (address[] memory, uint256) {\\n return LibPaginate.addresses(LibHasMembers.data().memberSet.values, index, perPage);\\n }\\n\\n /**\\n * @notice Adds a member to the list of known members.\\n * @param who is the address to be added.\\n */\\n function addMember(address who) external onlyMemberManager(_msgSender()) onlyValidMember(who) {\\n // Add the member.\\n LibHasMembers.data().memberSet.add(who, false);\\n // Notify via callback.\\n onMemberAdded(who);\\n // Emit!\\n emit MemberAdded(who);\\n }\\n\\n /**\\n * @notice Removes a member from this contract.\\n * @param member The address of the member to be removed.\\n * @notice Requires that the caller is a member of this Issuer.\\n * @notice Emits a `AHasMembers.MemberRemoved` event.\\n */\\n function removeMember(address member) external onlyMemberManager(_msgSender()) {\\n // Notify via callback.\\n onMemberRemoved(member);\\n // Remove member.\\n LibHasMembers.data().memberSet.remove(member, false);\\n // Emit!\\n emit MemberRemoved(member);\\n }\\n\\n /// Modifiers.\\n\\n modifier onlyMemberManager(address who) {\\n if (!isMembersManager(who)) revert RequiresMembersManager(who);\\n _;\\n }\\n\\n modifier onlyValidMember(address who) {\\n if (!isValidMember(who)) revert RequiresValidMember(who);\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x92011882d076ba62aac90c181c8f374566ca5c683441570a7239fd89851e97ff\",\"license\":\"MIT\"},\"contracts/common/lib/LibHasMembers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\nimport \\\"../../lib/LibAddressSet.sol\\\";\\n\\nlibrary LibHasMembers {\\n // The current version of the storage.\\n uint16 internal constant STORAGE_VERSION = 1;\\n // This is `keccak256('HasMembers.storage.Main')`.\\n bytes32 internal constant STORAGE_SLOT = 0xd56529bfa3ed57257eed4751494e1d0c0f212cfe38768380e006e3bee06ffb91;\\n\\n struct Data {\\n /// @notice The latest intializer version that was called.\\n uint16 version;\\n /// @notice This is where we hold our automatons data.\\n LibAddressSet.Data memberSet;\\n }\\n\\n function data() internal pure returns (Data storage s) {\\n assembly {\\n s.slot := STORAGE_SLOT\\n }\\n }\\n}\\n\",\"keccak256\":\"0x03ea8d9c47249e9456deba85130e859afd6eba800e330527bcb9bc3438adb6a4\",\"license\":\"MIT\"},\"contracts/fast/lib/LibFastHistory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\n/**\\n * @notice This library centralises shared functionality between FAST diamonds facets that have to do with transfer\\n * history tracking.\\n * @dev Note that if you feel like a method should be created inside this library, you might want to really consider\\n * whether or not it is the right place for it. Any facet using a method from internal libraries see their bytecode\\n * size increase, kind of defeating the benefits of using facets in the first place. So please keep it reasonable.\\n */\\nlibrary LibFastHistory {\\n /// @notice The current version of the storage.\\n uint16 internal constant STORAGE_VERSION = 1;\\n /// @notice This is keccak256('Fast.storage.History'):\\n bytes32 internal constant STORAGE_SLOT = 0x6bc8b61a9dd5fc049ea98027492a801d74e35fdf4d80d7fecd551a16e88fdbb4;\\n\\n // Storage structures.\\n\\n /**\\n * @notice The history data structure required for operating any given FAST diamond.\\n * @dev The `version` field is used to ensure that storage is at a known version during upgrades.\\n */\\n struct Data {\\n /// @notice The latest intializer version that was called.\\n uint16 version;\\n /// @notice All minting proofs are kept here.\\n SupplyProof[] supplyProofs;\\n /// @notice All transfer proofs are kept here.\\n TransferProof[] transferProofs;\\n /// @notice All transfers indices involving a given address are kept here.\\n mapping(address => uint256[]) transferProofInvolvements;\\n }\\n\\n // Other structures.\\n\\n /// @notice A minting operation could either be to mint or burn tokens.\\n enum SupplyOp {\\n Mint,\\n Burn\\n }\\n\\n /// @notice Minting operations are recorded for papertrail. This is the structure that keeps track of them.\\n struct SupplyProof {\\n /// @notice How...\\n SupplyOp op;\\n /// @notice How much...\\n uint256 amount;\\n /// @notice When...\\n uint256 blockNumber;\\n /// @notice Why...\\n string ref;\\n }\\n\\n /// @notice Every transfer in is recorded. This is the structure that keeps track of them.\\n struct TransferProof {\\n /// @notice Who spent...\\n address spender;\\n /// @notice Who performed the transfer...\\n address from;\\n /// @notice Who received...\\n address to;\\n /// @notice How much...\\n uint256 amount;\\n /// @notice When...\\n uint256 blockNumber;\\n /// @notice Why...\\n string ref;\\n }\\n\\n /**\\n * @notice Returns the history storage for the calling FAST.\\n * @return s a struct pointer for history FAST data storage.\\n */\\n function data() internal pure returns (Data storage s) {\\n assembly {\\n s.slot := STORAGE_SLOT\\n }\\n }\\n}\\n\",\"keccak256\":\"0x21e2cb01ca5bc6109080cd9695296e4ae346a2936c8cae3b3c0b68cef9a90a5e\",\"license\":\"MIT\"},\"contracts/interfaces/ICustomErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\ninterface ICustomErrors {\\n error AlreadyInitialized();\\n error CannotSelfRemove(address who);\\n error DuplicateEntry();\\n error InconsistentParameter(string param);\\n error InsufficientFunds(uint256 amount);\\n error InterfaceNotSupported(string);\\n error InternalMethod();\\n error InvalidCrowdfundBasisPointsFee(uint32 fee);\\n error InvalidPhase();\\n error NonExistentEntry();\\n error OutOfBounds();\\n error Overfunded(uint256 amount);\\n error ReentrancyError();\\n error RequiresAutomatonsManager(address who);\\n error RequiresContinuousSupply();\\n error RequiresDiamondOwnership(address who);\\n error RequiresDifferentSenderAndRecipient(address a);\\n error RequiresFastCaller();\\n error RequiresFastContractCaller();\\n error RequiresFastGovernorship(address who);\\n error RequiresFastMemberCaller();\\n error RequiresFastMembership(address who);\\n error RequiresGovernorsManager(address who);\\n error RequiresIssuerMemberCaller();\\n error RequiresIssuerMemberOrIssuerCaller();\\n error RequiresIssuerMembership(address who);\\n error RequiresManagerCaller();\\n error RequiresMarketplaceActiveMembership(address who);\\n error RequiresMarketplaceDeactivatedMember(address who);\\n error RequiresMarketplaceMembership(address who);\\n error RequiresMembersManager(address who);\\n error RequiresNoFastMemberships(address who);\\n error RequiresOwner(address who);\\n error RequiresPositiveBalance(address holder);\\n error RequiresTransfersEnabled();\\n error RequiresValidGovernor(address who);\\n error RequiresValidMember(address who);\\n error RequiresValidTokenHolder(address who);\\n error TokenContractError();\\n error UnknownBeneficiary(address who);\\n error UnknownPledger(address who);\\n error UnsupportedOperation();\\n}\\n\",\"keccak256\":\"0xd6da7364331de0a387574a44c5a4e7555b63cfe4baaca4dfef42c5d2345f0683\",\"license\":\"MIT\"},\"contracts/interfaces/IDiamondCut.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\n/******************************************************************************\\\\\\n* Author: Nick Mudge (https://twitter.com/mudgen)\\n* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535\\n/******************************************************************************/\\n\\n/// @title A facet providing diamond cut mechanisms.\\ninterface IDiamondCut {\\n enum FacetCutAction {\\n Add,\\n Replace,\\n Remove\\n }\\n // Add=0, Replace=1, Remove=2\\n\\n struct FacetCut {\\n address facetAddress;\\n FacetCutAction action;\\n bytes4[] functionSelectors;\\n }\\n\\n /// @notice Add/replace/remove any number of functions and optionally execute\\n /// a method with `delegatecall`.\\n /// @param _diamondCut Contains the facet addresses and function selectors\\n /// @param _init The address of the contract or facet to execute _calldata\\n /// @param _calldata A function call, including function selector and arguments\\n /// _calldata is executed with delegatecall on _init\\n function diamondCut(FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata) external;\\n\\n event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);\\n}\\n\",\"keccak256\":\"0xf548f40da69f2c54f4e03f92dc31094f6825669314b87266cce22e0a8f1a4c47\",\"license\":\"MIT\"},\"contracts/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\n/**\\n * @title ERC173 Contract Ownership Standard\\n * @dev The ERC165 identifier for this interface is 0x7f5828d0.\\n */\\ninterface IERC173 {\\n /// @notice This emits when ownership of a contract changes.\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /// @notice Get the address of the owner\\n /// @return owner_ The address of the owner.\\n function owner() external view returns (address owner_);\\n\\n /// @notice Set the address of the new owner of the contract\\n /// @notice Set _newOwner to address(0) to renounce any ownership.\\n /// @param _newOwner The address of the new owner of the contract\\n function transferOwnership(address _newOwner) external;\\n}\\n\",\"keccak256\":\"0x797855e7870ec3c9f32dda93166bd12dc19fec66cc9a8a7a58f03339a31439c0\",\"license\":\"MIT\"},\"contracts/lib/LibAddressSet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\nlibrary LibAddressSet {\\n /// @notice Represents a list of addresses.\\n struct Data {\\n mapping(address => uint256) indices;\\n address[] values;\\n }\\n\\n /**\\n * @notice Adds an item into the storage set. If the address already exists in the set, the method reverts.\\n * @param d is the internal data storage to use.\\n * @param key is the address to be added.\\n */\\n function add(Data storage d, address key, bool noThrow) internal {\\n bool exists = contains(d, key);\\n if (noThrow && exists) {\\n return;\\n }\\n require(!exists, \\\"Address already in set\\\");\\n d.indices[key] = d.values.length;\\n d.values.push(key);\\n }\\n\\n /**\\n * @notice Removes an item from the storage set. If the address does not exist in the set, the method reverts.\\n * @param d is the internal data storage to use.\\n * @param key is the address to be removed.\\n */\\n function remove(Data storage d, address key, bool noThrow) internal {\\n bool exists = contains(d, key);\\n if (noThrow && !exists) {\\n return;\\n }\\n require(exists, \\\"Address does not exist in set\\\");\\n address keyToMove = d.values[d.values.length - 1];\\n uint256 idxToReplace = d.indices[key];\\n d.indices[keyToMove] = idxToReplace;\\n d.values[idxToReplace] = keyToMove;\\n\\n delete d.indices[key];\\n d.values.pop();\\n }\\n\\n /**\\n * @notice Tests whether or not a given item already exists in the set.\\n * @param d is the internal data storage to use.\\n * @param key is the address to test.\\n * @return a boolean.\\n */\\n function contains(Data storage d, address key) internal view returns (bool) {\\n return d.values.length == 0 ? false : d.values[d.indices[key]] == key;\\n }\\n}\\n\",\"keccak256\":\"0x47c911c8b83ffd42c9d6088104f3c2c5eac2899fdf200b3683d1de10ca96b1a8\",\"license\":\"MIT\"},\"contracts/lib/LibDiamond.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\n/******************************************************************************\\\\\\n* Author: Nick Mudge (https://twitter.com/mudgen)\\n* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535\\n/******************************************************************************/\\nimport {IDiamondCut} from \\\"../interfaces/IDiamondCut.sol\\\";\\n\\nlibrary LibDiamond {\\n bytes32 constant DIAMOND_STORAGE_POSITION = keccak256(\\\"diamond.standard.diamond.storage\\\");\\n\\n struct FacetAddressAndPosition {\\n address facetAddress;\\n uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array\\n }\\n\\n struct FacetFunctionSelectors {\\n bytes4[] functionSelectors;\\n uint256 facetAddressPosition; // position of facetAddress in facetAddresses array\\n }\\n\\n struct DiamondStorage {\\n // maps function selector to the facet address and\\n // the position of the selector in the facetFunctionSelectors.selectors array\\n mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition;\\n // maps facet addresses to function selectors\\n mapping(address => FacetFunctionSelectors) facetFunctionSelectors;\\n // facet addresses\\n address[] facetAddresses;\\n // Used to query if a contract implements an interface.\\n // Used to implement ERC-165.\\n mapping(bytes4 => bool) supportedInterfaces;\\n // owner of the contract\\n address contractOwner;\\n }\\n\\n function diamondStorage() internal pure returns (DiamondStorage storage ds) {\\n bytes32 position = DIAMOND_STORAGE_POSITION;\\n assembly {\\n ds.slot := position\\n }\\n }\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n function setContractOwner(address _newOwner) internal {\\n DiamondStorage storage ds = diamondStorage();\\n address previousOwner = ds.contractOwner;\\n ds.contractOwner = _newOwner;\\n emit OwnershipTransferred(previousOwner, _newOwner);\\n }\\n\\n function contractOwner() internal view returns (address contractOwner_) {\\n contractOwner_ = diamondStorage().contractOwner;\\n }\\n\\n function enforceIsContractOwner() internal view {\\n require(msg.sender == diamondStorage().contractOwner, \\\"LibDiamond: Must be contract owner\\\");\\n }\\n\\n event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata);\\n\\n // Internal function version of diamondCut\\n function diamondCut(IDiamondCut.FacetCut[] memory _diamondCut, address _init, bytes memory _calldata) internal {\\n for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) {\\n IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action;\\n if (action == IDiamondCut.FacetCutAction.Add) {\\n addFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);\\n } else if (action == IDiamondCut.FacetCutAction.Replace) {\\n replaceFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);\\n } else if (action == IDiamondCut.FacetCutAction.Remove) {\\n removeFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);\\n } else {\\n revert(\\\"LibDiamondCut: Incorrect FacetCutAction\\\");\\n }\\n }\\n emit DiamondCut(_diamondCut, _init, _calldata);\\n initializeDiamondCut(_init, _calldata);\\n }\\n\\n function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {\\n require(_functionSelectors.length > 0, \\\"LibDiamondCut: No selectors in facet to cut\\\");\\n DiamondStorage storage ds = diamondStorage();\\n require(_facetAddress != address(0), \\\"LibDiamondCut: Add facet can't be address(0)\\\");\\n uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length);\\n // add new facet address if it does not exist\\n if (selectorPosition == 0) {\\n addFacet(ds, _facetAddress);\\n }\\n for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {\\n bytes4 selector = _functionSelectors[selectorIndex];\\n address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;\\n require(oldFacetAddress == address(0), \\\"LibDiamondCut: Can't add function that already exists\\\");\\n addFunction(ds, selector, selectorPosition, _facetAddress);\\n selectorPosition++;\\n }\\n }\\n\\n function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {\\n require(_functionSelectors.length > 0, \\\"LibDiamondCut: No selectors in facet to cut\\\");\\n DiamondStorage storage ds = diamondStorage();\\n require(_facetAddress != address(0), \\\"LibDiamondCut: Add facet can't be address(0)\\\");\\n uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length);\\n // add new facet address if it does not exist\\n if (selectorPosition == 0) {\\n addFacet(ds, _facetAddress);\\n }\\n for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {\\n bytes4 selector = _functionSelectors[selectorIndex];\\n address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;\\n require(oldFacetAddress != _facetAddress, \\\"LibDiamondCut: Can't replace function with same function\\\");\\n removeFunction(ds, oldFacetAddress, selector);\\n addFunction(ds, selector, selectorPosition, _facetAddress);\\n selectorPosition++;\\n }\\n }\\n\\n function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {\\n require(_functionSelectors.length > 0, \\\"LibDiamondCut: No selectors in facet to cut\\\");\\n DiamondStorage storage ds = diamondStorage();\\n // if function does not exist then do nothing and return\\n require(_facetAddress == address(0), \\\"LibDiamondCut: Remove facet address must be address(0)\\\");\\n for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {\\n bytes4 selector = _functionSelectors[selectorIndex];\\n address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;\\n removeFunction(ds, oldFacetAddress, selector);\\n }\\n }\\n\\n function addFacet(DiamondStorage storage ds, address _facetAddress) internal {\\n enforceHasContractCode(_facetAddress, \\\"LibDiamondCut: New facet has no code\\\");\\n ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds.facetAddresses.length;\\n ds.facetAddresses.push(_facetAddress);\\n }\\n\\n function addFunction(\\n DiamondStorage storage ds,\\n bytes4 _selector,\\n uint96 _selectorPosition,\\n address _facetAddress\\n ) internal {\\n ds.selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition;\\n ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector);\\n ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress;\\n }\\n\\n function removeFunction(DiamondStorage storage ds, address _facetAddress, bytes4 _selector) internal {\\n require(_facetAddress != address(0), \\\"LibDiamondCut: Can't remove function that doesn't exist\\\");\\n // an immutable function is a function defined directly in a diamond\\n require(_facetAddress != address(this), \\\"LibDiamondCut: Can't remove immutable function\\\");\\n // replace selector with last selector, then delete last selector\\n uint256 selectorPosition = ds.selectorToFacetAndPosition[_selector].functionSelectorPosition;\\n uint256 lastSelectorPosition = ds.facetFunctionSelectors[_facetAddress].functionSelectors.length - 1;\\n // if not the same then replace _selector with lastSelector\\n if (selectorPosition != lastSelectorPosition) {\\n bytes4 lastSelector = ds.facetFunctionSelectors[_facetAddress].functionSelectors[lastSelectorPosition];\\n ds.facetFunctionSelectors[_facetAddress].functionSelectors[selectorPosition] = lastSelector;\\n ds.selectorToFacetAndPosition[lastSelector].functionSelectorPosition = uint96(selectorPosition);\\n }\\n // delete the last selector\\n ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop();\\n delete ds.selectorToFacetAndPosition[_selector];\\n\\n // if no more selectors for facet address then delete the facet address\\n if (lastSelectorPosition == 0) {\\n // replace facet address with last facet address and delete last facet address\\n uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1;\\n uint256 facetAddressPosition = ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;\\n if (facetAddressPosition != lastFacetAddressPosition) {\\n address lastFacetAddress = ds.facetAddresses[lastFacetAddressPosition];\\n ds.facetAddresses[facetAddressPosition] = lastFacetAddress;\\n ds.facetFunctionSelectors[lastFacetAddress].facetAddressPosition = facetAddressPosition;\\n }\\n ds.facetAddresses.pop();\\n delete ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;\\n }\\n }\\n\\n function initializeDiamondCut(address _init, bytes memory _calldata) internal {\\n if (_init == address(0)) {\\n require(_calldata.length == 0, \\\"LibDiamondCut: _init is address(0) but_calldata is not empty\\\");\\n } else {\\n require(_calldata.length > 0, \\\"LibDiamondCut: _calldata is empty but _init is not address(0)\\\");\\n if (_init != address(this)) {\\n enforceHasContractCode(_init, \\\"LibDiamondCut: _init address has no code\\\");\\n }\\n (bool success, bytes memory error) = _init.delegatecall(_calldata);\\n if (!success) {\\n if (error.length > 0) {\\n // bubble up the error\\n revert(string(error));\\n } else {\\n revert(\\\"LibDiamondCut: _init function reverted\\\");\\n }\\n }\\n }\\n }\\n\\n function enforceHasContractCode(address _contract, string memory _errorMessage) internal view {\\n uint256 contractSize;\\n assembly {\\n contractSize := extcodesize(_contract)\\n }\\n require(contractSize > 0, _errorMessage);\\n }\\n}\\n\",\"keccak256\":\"0x0e12d54c3afccb656312e8bc7c31d16feb3718a421d2ea732024f608ccb6aab4\",\"license\":\"MIT\"},\"contracts/lib/LibHelpers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\nimport \\\"./LibHelpers.sol\\\";\\nimport \\\"../interfaces/IERC173.sol\\\";\\n\\nlibrary LibHelpers {\\n address internal constant ZERO_ADDRESS = address(0);\\n address internal constant DEPLOYER_CONTRACT = 0x6DF2D25d8C6FD680730ee658b530A05a99BB769a;\\n address internal constant DEPLOYER_CONTRACT_AMOY = 0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7;\\n\\n function _isDiamondFacet(address who) internal view returns (bool) {\\n return who == address(this);\\n }\\n\\n function _isDiamondOwner(address who) internal view returns (bool) {\\n return who == IERC173(address(this)).owner();\\n }\\n\\n function _isDeployer(address who) internal pure returns (bool) {\\n return (who == LibHelpers.DEPLOYER_CONTRACT) || (who == LibHelpers.DEPLOYER_CONTRACT_AMOY);\\n }\\n}\\n\",\"keccak256\":\"0x69c31186e77cd225421751d6e2df801371ff1247250d6f0bbdbd05fb498b9ec7\",\"license\":\"MIT\"},\"contracts/lib/LibPaginate.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\nimport \\\"../fast/lib/LibFastHistory.sol\\\";\\n\\nlibrary LibPaginate {\\n function addresses(\\n address[] storage collection,\\n uint256 cursor,\\n uint256 perPage\\n ) internal view returns (address[] memory, uint256) {\\n uint256 length = (perPage > collection.length - cursor) ? collection.length - cursor : perPage;\\n address[] memory values = new address[](length);\\n for (uint256 i = 0; i < length; ) {\\n values[i] = collection[cursor + i];\\n unchecked {\\n ++i;\\n }\\n }\\n return (values, cursor + length);\\n }\\n\\n function uint256s(\\n uint256[] storage collection,\\n uint256 cursor,\\n uint256 perPage\\n ) internal view returns (uint256[] memory, uint256) {\\n uint256 length = (perPage > collection.length - cursor) ? collection.length - cursor : perPage;\\n uint256[] memory values = new uint256[](length);\\n for (uint256 i = 0; i < length; ) {\\n values[i] = collection[cursor + i];\\n unchecked {\\n ++i;\\n }\\n }\\n return (values, cursor + length);\\n }\\n\\n function supplyProofs(\\n LibFastHistory.SupplyProof[] storage collection,\\n uint256 cursor,\\n uint256 perPage\\n ) internal view returns (LibFastHistory.SupplyProof[] memory, uint256) {\\n uint256 length = (perPage > collection.length - cursor) ? collection.length - cursor : perPage;\\n LibFastHistory.SupplyProof[] memory values = new LibFastHistory.SupplyProof[](length);\\n for (uint256 i = 0; i < length; ) {\\n values[i] = collection[cursor + i];\\n unchecked {\\n ++i;\\n }\\n }\\n return (values, cursor + length);\\n }\\n\\n function transferProofs(\\n LibFastHistory.TransferProof[] storage collection,\\n uint256 cursor,\\n uint256 perPage\\n ) internal view returns (LibFastHistory.TransferProof[] memory, uint256) {\\n uint256 length = (perPage > collection.length - cursor) ? collection.length - cursor : perPage;\\n LibFastHistory.TransferProof[] memory values = new LibFastHistory.TransferProof[](length);\\n for (uint256 i = 0; i < length; ) {\\n values[i] = collection[cursor + i];\\n unchecked {\\n ++i;\\n }\\n }\\n return (values, cursor + length);\\n }\\n}\\n\",\"keccak256\":\"0xf2f7e33b965e27fa953f0b95922856f42b2563f9a037a17e1973af5a496899ca\",\"license\":\"MIT\"},\"contracts/paymaster/PaymasterTopFacet.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\npragma solidity 0.8.10;\\n\\nimport \\\"../common/AHasMembers.sol\\\";\\nimport \\\"../interfaces/ICustomErrors.sol\\\";\\nimport \\\"../lib/LibDiamond.sol\\\";\\nimport \\\"./lib/APaymasterFacet.sol\\\";\\nimport \\\"./lib/IPaymasterErrors.sol\\\";\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\n\\nimport \\\"@opengsn/contracts/src/utils/GsnTypes.sol\\\";\\nimport \\\"@opengsn/contracts/src/interfaces/IPaymaster.sol\\\";\\nimport \\\"@opengsn/contracts/src/interfaces/IRelayHub.sol\\\";\\nimport \\\"@opengsn/contracts/src/utils/GsnEip712Library.sol\\\";\\nimport \\\"@opengsn/contracts/src/forwarder/IForwarder.sol\\\";\\n\\n/**\\n * @notice The top-level Paymaster contract.\\n * Note this is an \\\"unwrapped\\\" version of `BasePaymaster.sol` from the OpenGSN repo.\\n * Original license: GPL-3.0-only.\\n */\\ncontract PaymasterTopFacet is APaymasterFacet, IPaymaster {\\n /// Top level state variables.\\n\\n IRelayHub internal relayHub;\\n address private trustedForwarder;\\n\\n // SEE: https://docs.opengsn.org/contracts/#delegating-the-prerelayedcall-logic-to-recipient-via-the-rejectonrecipientrevert-flag\\n bool public useRejectOnRecipientRevert = false;\\n\\n // These parameters are documented in IPaymaster.GasAndDataLimits.\\n // SEE: https://github.com/opengsn/gsn/blob/v3.0.0-beta.10/packages/contracts/src/interfaces/IPaymaster.sol#L29\\n\\n // Overhead of forwarder verify+signature, plus hub overhead.\\n uint256 public constant FORWARDER_HUB_OVERHEAD = 50000;\\n uint256 public constant PRE_RELAYED_CALL_GAS_LIMIT = 100000;\\n uint256 public constant POST_RELAYED_CALL_GAS_LIMIT = 110000;\\n uint256 public constant PAYMASTER_ACCEPTANCE_BUDGET = PRE_RELAYED_CALL_GAS_LIMIT + FORWARDER_HUB_OVERHEAD;\\n uint256 public constant CALLDATA_SIZE_LIMIT = 10500;\\n\\n // This is being pulled in to to satisfy the IPaymaster interface.\\n // TODO: I'd like to remove this and depend on the Diamond's implementation.\\n /// @inheritdoc IERC165\\n function supportsInterface(bytes4 _interfaceId) public view override(IERC165) returns (bool) {\\n LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage();\\n return ds.supportedInterfaces[_interfaceId];\\n }\\n\\n /// @inheritdoc IPaymaster\\n function getRelayHub() public view override(IPaymaster) returns (address) {\\n return address(relayHub);\\n }\\n\\n /// @inheritdoc IPaymaster\\n function getTrustedForwarder() public view override(IPaymaster) returns (address) {\\n return trustedForwarder;\\n }\\n\\n /// @inheritdoc IPaymaster\\n function getGasAndDataLimits() public pure override(IPaymaster) returns (IPaymaster.GasAndDataLimits memory limits) {\\n return\\n IPaymaster.GasAndDataLimits(\\n PAYMASTER_ACCEPTANCE_BUDGET,\\n PRE_RELAYED_CALL_GAS_LIMIT,\\n POST_RELAYED_CALL_GAS_LIMIT,\\n CALLDATA_SIZE_LIMIT\\n );\\n }\\n\\n /// @inheritdoc IPaymaster\\n function preRelayedCall(\\n GsnTypes.RelayRequest calldata relayRequest,\\n bytes calldata /* signature */,\\n bytes calldata approvalData,\\n uint256 /* maxPossibleGas */\\n ) external view override(IPaymaster) onlyRelayHub returns (bytes memory, bool) {\\n if (getTrustedForwarder() != relayRequest.relayData.forwarder)\\n revert IPaymasterErrors.ForwarderNotTrusted(relayRequest.relayData.forwarder);\\n\\n // SEE: https://github.com/opengsn/gsn/blob/v3.0.0-beta.10/packages/contracts/src/utils/GsnEip712Library.sol#L59\\n GsnEip712Library.verifyForwarderTrusted(relayRequest);\\n\\n if (relayRequest.request.value != 0) revert IPaymasterErrors.ValueTransferNotSupported();\\n if (relayRequest.relayData.paymasterData.length != 0) revert IPaymasterErrors.InvalidPaymasterDataLength();\\n if (approvalData.length != 0) revert IPaymasterErrors.InvalidApprovalDataLength();\\n\\n // /=-@=-@=-@=-@=-@=-@=-@=-@=-@=-@=-@=-@=-@=-@/\\n\\n // Check for marketplace membership.\\n LibPaymaster.Data storage s = LibPaymaster.data();\\n if (!AHasMembers(s.marketplace).isMember(relayRequest.request.from))\\n revert ICustomErrors.RequiresMarketplaceMembership(relayRequest.request.from);\\n\\n // /~@^~@^~@^~@^~@^~@^~@^~@^~@^~@^~@^~@^~@^~@^/\\n\\n // See the documentation for `IPaymaster::preRelayedCall` for details.\\n return (\\\"\\\", useRejectOnRecipientRevert);\\n }\\n\\n /// @inheritdoc IPaymaster\\n function postRelayedCall(\\n bytes calldata context,\\n bool success,\\n uint256 gasUseWithoutPost,\\n GsnTypes.RelayData calldata relayData\\n ) external view override(IPaymaster) onlyRelayHub {\\n // See the documentation for `IPaymaster::postRelayedCall` for details.\\n (context, success, gasUseWithoutPost, relayData);\\n }\\n\\n /// @inheritdoc IPaymaster\\n function versionPaymaster() external pure override(IPaymaster) returns (string memory) {\\n return \\\"3.0.0-beta.10+opengsn.tokensphere.ipaymaster\\\";\\n }\\n\\n /// Setters and utility methods.\\n\\n /**\\n * @notice The owner of the Paymaster can change the instance of the RelayHub this Paymaster works with.\\n * **Warning** The deposit on the previous RelayHub must be withdrawn first.\\n * @param hub The address of the new RelayHub.\\n */\\n function setRelayHub(IRelayHub hub) public onlyIssuerMember {\\n if (!IERC165(address(hub)).supportsInterface(type(IRelayHub).interfaceId))\\n revert ICustomErrors.InterfaceNotSupported(\\\"IRelayHub\\\");\\n relayHub = hub;\\n }\\n\\n /**\\n * @notice The owner of the Paymaster can change the instance of the Forwarder this Paymaster works with.\\n * the Recipients must trust this Forwarder as well in order for the configuration to remain functional.\\n * @param forwarder The address of the new Forwarder.\\n */\\n function setTrustedForwarder(address forwarder) public onlyIssuerMember {\\n if (!IERC165(forwarder).supportsInterface(type(IForwarder).interfaceId))\\n revert ICustomErrors.InterfaceNotSupported(\\\"IForwarder\\\");\\n trustedForwarder = forwarder;\\n }\\n\\n /**\\n * @notice Deposit Ether/MATIC on behalf of the Paymaster to the RelayHub.\\n */\\n function deposit() external payable {\\n if (address(relayHub) == address(0)) revert IPaymasterErrors.RelayHubAddressNotSet();\\n relayHub.depositFor{value: msg.value}(address(this));\\n }\\n\\n /**\\n * @notice Withdraw deposit from the RelayHub.\\n * @param amount The amount to be subtracted from the sender.\\n * @param target The target to which the amount will be transferred.\\n */\\n function withdrawRelayHubDepositTo(uint256 amount, address payable target) public onlyIssuerMember {\\n relayHub.withdraw(target, amount);\\n }\\n\\n /// Modifiers.\\n\\n /// @notice Ensures that a method can only be called by the RelayHub.\\n modifier onlyRelayHub() {\\n if (msg.sender != getRelayHub()) revert IPaymasterErrors.RequiresRelayHubCaller();\\n _;\\n }\\n\\n // TODO: Check this.\\n /// @notice Ensures that a method can only be called by an Issuer.\\n modifier onlyIssuerMember() {\\n LibPaymaster.Data storage s = LibPaymaster.data();\\n if (!AHasMembers(s.issuer).isMember(msg.sender)) revert ICustomErrors.RequiresIssuerMemberCaller();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0xeb07f16b396ab2fe311cea203bf733b2949f384871295c9ae517d708a4366ec9\",\"license\":\"GPL-3.0-only\"},\"contracts/paymaster/lib/APaymasterFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\nimport \\\"./LibPaymaster.sol\\\";\\nimport \\\"../../lib/LibHelpers.sol\\\";\\nimport \\\"../../interfaces/ICustomErrors.sol\\\";\\n\\n/**\\n * @notice This contract is a group of modifiers that can be used by any Paymaster facets to guard against\\n * certain permissions.\\n */\\nabstract contract APaymasterFacet {\\n /// Internal ACL functions.\\n\\n /// ...\\n\\n // Modifiers.\\n\\n /// @notice Ensures that a method can only be called by the singleton deployer contract factory.\\n modifier onlyDeployer() virtual {\\n if (!LibHelpers._isDeployer(msg.sender)) revert ICustomErrors.InternalMethod();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0xc0998d4c82f2b1b02a88e18de89ae308eb19a0a68f244ff958cbbcedc5cf93c8\",\"license\":\"MIT\"},\"contracts/paymaster/lib/IPaymasterErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\n/**\\n * @notice Errors that can occur within the paymaster.\\n */\\ninterface IPaymasterErrors {\\n error ForwarderNotTrusted(address);\\n error InvalidPaymasterDataLength();\\n error InvalidApprovalDataLength();\\n error RelayHubAddressNotSet();\\n error RequiresRelayHubCaller();\\n error ValueTransferNotSupported();\\n}\\n\",\"keccak256\":\"0x2d7ffc6f96581309f403b0dd263453145659f3332a407f3d07f4ad2d9fc15140\",\"license\":\"MIT\"},\"contracts/paymaster/lib/LibPaymaster.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.10;\\n\\nlibrary LibPaymaster {\\n // The current version of the storage.\\n uint16 internal constant STORAGE_VERSION = 1;\\n // This is keccak256('Paymaster.storage'):\\n bytes32 internal constant STORAGE_SLOT = 0x8f0e66ee30211ca069424cd4b533ee66f04c45421216c1a6601cf23359c1f7f8;\\n\\n struct Data {\\n /// @notice The latest intializer version that was called.\\n uint16 version;\\n /// @notice The internal pointer to the Marketplace contract.\\n address marketplace;\\n /// @notice The internal pointer to the Issuer contract.\\n address issuer;\\n }\\n\\n function data() internal pure returns (Data storage s) {\\n assembly {\\n s.slot := STORAGE_SLOT\\n }\\n }\\n}\\n\",\"keccak256\":\"0x871aa0b3fd94c5e3564c9568a20984d2976df4e353d2574cac684c2a3e9373dc\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040526001805460ff60a01b1916905534801561001d57600080fd5b506116d68061002d6000396000f3fe60806040526004361061010d5760003560e01c8063921276ea116100a5578063ce1b815f11610074578063da74222811610059578063da74222814610398578063df463a66146103b8578063f9c002f7146103cd57600080fd5b8063ce1b815f14610365578063d0e30db01461039057600080fd5b8063921276ea146102ce578063b039a88f146102f0578063b90b41cf14610338578063bbdaa3c91461034e57600080fd5b80635c5e3db1116100e15780635c5e3db11461021e57806376fa01c3146102425780637bb05264146102625780637bdf2ec71461028257600080fd5b8062be5dd41461011257806301ffc9a7146101495780632d14c4b7146101ca5780634f33b4dd146101ec575b600080fd5b34801561011e57600080fd5b5061013261012d366004611280565b6103e4565b60405161014092919061139f565b60405180910390f35b34801561015557600080fd5b506101ba6101643660046113c3565b7fffffffff000000000000000000000000000000000000000000000000000000001660009081527fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131f602052604090205460ff1690565b6040519015158152602001610140565b3480156101d657600080fd5b506101ea6101e5366004611431565b6107ad565b005b3480156101f857600080fd5b506001546101ba9074010000000000000000000000000000000000000000900460ff1681565b34801561022a57600080fd5b5061023461290481565b604051908152602001610140565b34801561024e57600080fd5b506101ea61025d36600461146f565b61092c565b34801561026e57600080fd5b506101ea61027d3660046114ff565b610984565b34801561028e57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610140565b3480156102da57600080fd5b506102e3610bce565b604051610140919061151c565b3480156102fc57600080fd5b50610305610bee565b60405161014091908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b34801561034457600080fd5b5061023461c35081565b34801561035a57600080fd5b506102346201adb081565b34801561037157600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff166102a9565b6101ea610c57565b3480156103a457600080fd5b506101ea6103b33660046114ff565b610d26565b3480156103c457600080fd5b50610234610f70565b3480156103d957600080fd5b50610234620186a081565b6060600061040760005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461046b576040517f1cb1a41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610478602089018961152f565b6104899060c081019060a0016114ff565b73ffffffffffffffffffffffffffffffffffffffff166104be60015473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610547576104e6602089018961152f565b6104f79060c081019060a0016114ff565b6040517fb445991100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024015b60405180910390fd5b61055088610f82565b61055a888061156d565b6040013515610595576040517f035695ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105a2602089018961152f565b6105b09060c08101906115a1565b1590506105e9576040517f131c145700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8315610621576040517f8fca7ef400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f8f0e66ee30211ca069424cd4b533ee66f04c45421216c1a6601cf23359c1f7f8805462010000900473ffffffffffffffffffffffffffffffffffffffff1663a230c52461066f8b8061156d565b61067d9060208101906114ff565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa1580156106e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070a9190611606565b61077157610718898061156d565b6107269060208101906114ff565b6040517f9ac2720600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240161053e565b5050600154604080516020810190915260008152987401000000000000000000000000000000000000000090910460ff16975095505050505050565b60007f8f0e66ee30211ca069424cd4b533ee66f04c45421216c1a6601cf23359c1f7f860018101546040517fa230c52400000000000000000000000000000000000000000000000000000000815233600482015291925073ffffffffffffffffffffffffffffffffffffffff169063a230c52490602401602060405180830381865afa158015610841573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108659190611606565b61089b576040517f5353280000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018690529091169063f3fef3a390604401600060405180830381600087803b15801561090f57600080fd5b505af1158015610923573d6000803e3d6000fd5b50505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461097d576040517f1cb1a41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60007f8f0e66ee30211ca069424cd4b533ee66f04c45421216c1a6601cf23359c1f7f860018101546040517fa230c52400000000000000000000000000000000000000000000000000000000815233600482015291925073ffffffffffffffffffffffffffffffffffffffff169063a230c52490602401602060405180830381865afa158015610a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3c9190611606565b610a72576040517f5353280000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fe9fb30f700000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8316906301ffc9a790602401602060405180830381865afa158015610afc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b209190611606565b610b86576040517f216bf93000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4952656c61794875620000000000000000000000000000000000000000000000604482015260640161053e565b50600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60606040518060600160405280602c8152602001611675602c9139905090565b610c196040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806080016040528061c350620186a0610c359190611623565b8152602001620186a081526020016201adb08152602001612904815250905090565b60005473ffffffffffffffffffffffffffffffffffffffff16610ca6576040517f643f8b1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546040517faa67c91900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff9091169063aa67c9199034906024016000604051808303818588803b158015610d1257600080fd5b505af115801561097d573d6000803e3d6000fd5b60007f8f0e66ee30211ca069424cd4b533ee66f04c45421216c1a6601cf23359c1f7f860018101546040517fa230c52400000000000000000000000000000000000000000000000000000000815233600482015291925073ffffffffffffffffffffffffffffffffffffffff169063a230c52490602401602060405180830381865afa158015610dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dde9190611606565b610e14576040517f5353280000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f25e23e6400000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8316906301ffc9a790602401602060405180830381865afa158015610e9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec29190611606565b610f28576040517f216bf93000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f49466f7277617264657200000000000000000000000000000000000000000000604482015260640161053e565b50600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610f7f61c350620186a0611623565b81565b600080610f8f838061156d565b610fa09060408101906020016114ff565b73ffffffffffffffffffffffffffffffffffffffff167f572b6c0500000000000000000000000000000000000000000000000000000000610fe4602086018661152f565b610ff59060c081019060a0016114ff565b60405173ffffffffffffffffffffffffffffffffffffffff9091166024820152604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516110a19190611662565b600060405180830381855afa9150503d80600081146110dc576040519150601f19603f3d011682016040523d82523d6000602084013e6110e1565b606091505b50915091508161114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f697354727573746564466f727761726465723a20726576657274656400000000604482015260640161053e565b80516020146111b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f697354727573746564466f727761726465723a2062616420726573706f6e7365604482015260640161053e565b808060200190518101906111cc9190611606565b611232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c696420666f7277617264657220666f7220726563697069656e7400604482015260640161053e565b505050565b60008083601f84011261124957600080fd5b50813567ffffffffffffffff81111561126157600080fd5b60208301915083602082850101111561127957600080fd5b9250929050565b6000806000806000806080878903121561129957600080fd5b863567ffffffffffffffff808211156112b157600080fd5b908801906040828b0312156112c557600080fd5b909650602088013590808211156112db57600080fd5b6112e78a838b01611237565b9097509550604089013591508082111561130057600080fd5b5061130d89828a01611237565b979a9699509497949695606090950135949350505050565b60005b83811015611340578181015183820152602001611328565b8381111561134f576000848401525b50505050565b6000815180845261136d816020860160208601611325565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6040815260006113b26040830185611355565b905082151560208301529392505050565b6000602082840312156113d557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461140557600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461142e57600080fd5b50565b6000806040838503121561144457600080fd5b8235915060208301356114568161140c565b809150509250929050565b801515811461142e57600080fd5b60008060008060006080868803121561148757600080fd5b853567ffffffffffffffff8082111561149f57600080fd5b6114ab89838a01611237565b9097509550602088013591506114c082611461565b90935060408701359250606087013590808211156114dd57600080fd5b50860161010081890312156114f157600080fd5b809150509295509295909350565b60006020828403121561151157600080fd5b81356114058161140c565b6020815260006114056020830184611355565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183360301811261156357600080fd5b9190910192915050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2183360301811261156357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126115d657600080fd5b83018035915067ffffffffffffffff8211156115f157600080fd5b60200191503681900382131561127957600080fd5b60006020828403121561161857600080fd5b815161140581611461565b6000821982111561165d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b6000825161156381846020870161132556fe332e302e302d626574612e31302b6f70656e67736e2e746f6b656e7370686572652e697061796d6173746572a2646970667358221220eb2e1e8c47412b71c7da55aa182c8d58943ffb96d3e92f0d0b6fe7d67908c5c264736f6c634300080a0033", + "deployedBytecode": "0x60806040526004361061010d5760003560e01c8063921276ea116100a5578063ce1b815f11610074578063da74222811610059578063da74222814610398578063df463a66146103b8578063f9c002f7146103cd57600080fd5b8063ce1b815f14610365578063d0e30db01461039057600080fd5b8063921276ea146102ce578063b039a88f146102f0578063b90b41cf14610338578063bbdaa3c91461034e57600080fd5b80635c5e3db1116100e15780635c5e3db11461021e57806376fa01c3146102425780637bb05264146102625780637bdf2ec71461028257600080fd5b8062be5dd41461011257806301ffc9a7146101495780632d14c4b7146101ca5780634f33b4dd146101ec575b600080fd5b34801561011e57600080fd5b5061013261012d366004611280565b6103e4565b60405161014092919061139f565b60405180910390f35b34801561015557600080fd5b506101ba6101643660046113c3565b7fffffffff000000000000000000000000000000000000000000000000000000001660009081527fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131f602052604090205460ff1690565b6040519015158152602001610140565b3480156101d657600080fd5b506101ea6101e5366004611431565b6107ad565b005b3480156101f857600080fd5b506001546101ba9074010000000000000000000000000000000000000000900460ff1681565b34801561022a57600080fd5b5061023461290481565b604051908152602001610140565b34801561024e57600080fd5b506101ea61025d36600461146f565b61092c565b34801561026e57600080fd5b506101ea61027d3660046114ff565b610984565b34801561028e57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610140565b3480156102da57600080fd5b506102e3610bce565b604051610140919061151c565b3480156102fc57600080fd5b50610305610bee565b60405161014091908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b34801561034457600080fd5b5061023461c35081565b34801561035a57600080fd5b506102346201adb081565b34801561037157600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff166102a9565b6101ea610c57565b3480156103a457600080fd5b506101ea6103b33660046114ff565b610d26565b3480156103c457600080fd5b50610234610f70565b3480156103d957600080fd5b50610234620186a081565b6060600061040760005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461046b576040517f1cb1a41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610478602089018961152f565b6104899060c081019060a0016114ff565b73ffffffffffffffffffffffffffffffffffffffff166104be60015473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610547576104e6602089018961152f565b6104f79060c081019060a0016114ff565b6040517fb445991100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024015b60405180910390fd5b61055088610f82565b61055a888061156d565b6040013515610595576040517f035695ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105a2602089018961152f565b6105b09060c08101906115a1565b1590506105e9576040517f131c145700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8315610621576040517f8fca7ef400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f8f0e66ee30211ca069424cd4b533ee66f04c45421216c1a6601cf23359c1f7f8805462010000900473ffffffffffffffffffffffffffffffffffffffff1663a230c52461066f8b8061156d565b61067d9060208101906114ff565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa1580156106e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070a9190611606565b61077157610718898061156d565b6107269060208101906114ff565b6040517f9ac2720600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240161053e565b5050600154604080516020810190915260008152987401000000000000000000000000000000000000000090910460ff16975095505050505050565b60007f8f0e66ee30211ca069424cd4b533ee66f04c45421216c1a6601cf23359c1f7f860018101546040517fa230c52400000000000000000000000000000000000000000000000000000000815233600482015291925073ffffffffffffffffffffffffffffffffffffffff169063a230c52490602401602060405180830381865afa158015610841573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108659190611606565b61089b576040517f5353280000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018690529091169063f3fef3a390604401600060405180830381600087803b15801561090f57600080fd5b505af1158015610923573d6000803e3d6000fd5b50505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461097d576040517f1cb1a41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60007f8f0e66ee30211ca069424cd4b533ee66f04c45421216c1a6601cf23359c1f7f860018101546040517fa230c52400000000000000000000000000000000000000000000000000000000815233600482015291925073ffffffffffffffffffffffffffffffffffffffff169063a230c52490602401602060405180830381865afa158015610a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3c9190611606565b610a72576040517f5353280000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fe9fb30f700000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8316906301ffc9a790602401602060405180830381865afa158015610afc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b209190611606565b610b86576040517f216bf93000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4952656c61794875620000000000000000000000000000000000000000000000604482015260640161053e565b50600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60606040518060600160405280602c8152602001611675602c9139905090565b610c196040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806080016040528061c350620186a0610c359190611623565b8152602001620186a081526020016201adb08152602001612904815250905090565b60005473ffffffffffffffffffffffffffffffffffffffff16610ca6576040517f643f8b1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546040517faa67c91900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff9091169063aa67c9199034906024016000604051808303818588803b158015610d1257600080fd5b505af115801561097d573d6000803e3d6000fd5b60007f8f0e66ee30211ca069424cd4b533ee66f04c45421216c1a6601cf23359c1f7f860018101546040517fa230c52400000000000000000000000000000000000000000000000000000000815233600482015291925073ffffffffffffffffffffffffffffffffffffffff169063a230c52490602401602060405180830381865afa158015610dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dde9190611606565b610e14576040517f5353280000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f25e23e6400000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8316906301ffc9a790602401602060405180830381865afa158015610e9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec29190611606565b610f28576040517f216bf93000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f49466f7277617264657200000000000000000000000000000000000000000000604482015260640161053e565b50600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610f7f61c350620186a0611623565b81565b600080610f8f838061156d565b610fa09060408101906020016114ff565b73ffffffffffffffffffffffffffffffffffffffff167f572b6c0500000000000000000000000000000000000000000000000000000000610fe4602086018661152f565b610ff59060c081019060a0016114ff565b60405173ffffffffffffffffffffffffffffffffffffffff9091166024820152604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516110a19190611662565b600060405180830381855afa9150503d80600081146110dc576040519150601f19603f3d011682016040523d82523d6000602084013e6110e1565b606091505b50915091508161114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f697354727573746564466f727761726465723a20726576657274656400000000604482015260640161053e565b80516020146111b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f697354727573746564466f727761726465723a2062616420726573706f6e7365604482015260640161053e565b808060200190518101906111cc9190611606565b611232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c696420666f7277617264657220666f7220726563697069656e7400604482015260640161053e565b505050565b60008083601f84011261124957600080fd5b50813567ffffffffffffffff81111561126157600080fd5b60208301915083602082850101111561127957600080fd5b9250929050565b6000806000806000806080878903121561129957600080fd5b863567ffffffffffffffff808211156112b157600080fd5b908801906040828b0312156112c557600080fd5b909650602088013590808211156112db57600080fd5b6112e78a838b01611237565b9097509550604089013591508082111561130057600080fd5b5061130d89828a01611237565b979a9699509497949695606090950135949350505050565b60005b83811015611340578181015183820152602001611328565b8381111561134f576000848401525b50505050565b6000815180845261136d816020860160208601611325565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6040815260006113b26040830185611355565b905082151560208301529392505050565b6000602082840312156113d557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461140557600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461142e57600080fd5b50565b6000806040838503121561144457600080fd5b8235915060208301356114568161140c565b809150509250929050565b801515811461142e57600080fd5b60008060008060006080868803121561148757600080fd5b853567ffffffffffffffff8082111561149f57600080fd5b6114ab89838a01611237565b9097509550602088013591506114c082611461565b90935060408701359250606087013590808211156114dd57600080fd5b50860161010081890312156114f157600080fd5b809150509295509295909350565b60006020828403121561151157600080fd5b81356114058161140c565b6020815260006114056020830184611355565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183360301811261156357600080fd5b9190910192915050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2183360301811261156357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126115d657600080fd5b83018035915067ffffffffffffffff8211156115f157600080fd5b60200191503681900382131561127957600080fd5b60006020828403121561161857600080fd5b815161140581611461565b6000821982111561165d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b6000825161156381846020870161132556fe332e302e302d626574612e31302b6f70656e67736e2e746f6b656e7370686572652e697061796d6173746572a2646970667358221220eb2e1e8c47412b71c7da55aa182c8d58943ffb96d3e92f0d0b6fe7d67908c5c264736f6c634300080a0033", + "devdoc": { + "kind": "dev", + "methods": { + "getGasAndDataLimits()": { + "returns": { + "limits": "An instance of the `GasAndDataLimits` struct ##### `acceptanceBudget` If the transactions consumes more than `acceptanceBudget` this Paymaster will be charged for gas no matter what. Transaction that gets rejected after consuming more than `acceptanceBudget` gas is on this Paymaster's expense. Should be set to an amount gas this Paymaster expects to spend deciding whether to accept or reject a request. This includes gas consumed by calculations in the `preRelayedCall`, `Forwarder` and the recipient contract. :warning: **Warning** :warning: As long this value is above `preRelayedCallGasLimit` (see defaults in `BasePaymaster`), the Paymaster is guaranteed it will never pay for rejected transactions. If this value is below `preRelayedCallGasLimit`, it might might make Paymaster open to a \"griefing\" attack. The relayers should prefer lower `acceptanceBudget`, as it improves their chances of being compensated. From a Relay's point of view, this is the highest gas value a bad Paymaster may cost the relay, since the paymaster will pay anything above that value regardless of whether the transaction succeeds or reverts. Specifying value too high might make the call rejected by relayers (see `maxAcceptanceBudget` in server config). ##### `preRelayedCallGasLimit` The max gas usage of preRelayedCall. Any revert of the `preRelayedCall` is a request rejection by the paymaster. As long as `acceptanceBudget` is above `preRelayedCallGasLimit`, any such revert is not payed by the paymaster. ##### `postRelayedCallGasLimit` The max gas usage of postRelayedCall. The Paymaster is not charged for the maximum, only for actually used gas. Note that an OOG will revert the inner transaction, but the paymaster will be charged for it anyway." + } + }, + "getRelayHub()": { + "returns": { + "_0": "The address of the `RelayHub` that is trusted by this Paymaster to execute the requests." + } + }, + "getTrustedForwarder()": { + "returns": { + "_0": "The address of the `Forwarder` that is trusted by this Paymaster to execute the requests." + } + }, + "postRelayedCall(bytes,bool,uint256,(uint256,uint256,uint256,address,address,address,bytes,uint256))": { + "params": { + "context": "The call context, as returned by the preRelayedCall", + "gasUseWithoutPost": "The actual amount of gas used by the entire transaction, EXCEPT the gas used by the postRelayedCall itself.", + "relayData": "The relay params of the request. can be used by relayHub.calculateCharge()", + "success": "`true` if the relayed call succeeded, false if it reverted" + } + }, + "preRelayedCall(((address,address,uint256,uint256,uint256,bytes,uint256),(uint256,uint256,uint256,address,address,address,bytes,uint256)),bytes,bytes,uint256)": { + "params": { + "approvalData": "- extra dapp-specific data (e.g. signature from trusted party)", + "maxPossibleGas": "- based on values returned from `getGasAndDataLimits` the RelayHub will calculate the maximum possible amount of gas the user may be charged for. In order to convert this value to wei, the Paymaster has to call \"relayHub.calculateCharge()\"", + "relayRequest": "- the full relay request structure", + "signature": "- user's EIP712-compatible signature of the `relayRequest`. Note that in most cases the paymaster shouldn't try use it at all. It is always checked by the forwarder immediately after preRelayedCall returns." + }, + "returns": { + "_0": "A byte array to be passed to postRelayedCall. Can contain any data needed by this Paymaster in any form or be empty if no extra data is needed.", + "_1": "The flag that allows a Paymaster to \"delegate\" the rejection to the recipient code. It also means the Paymaster trust the recipient to reject fast: both preRelayedCall, forwarder check and recipient checks must fit into the GasLimits.acceptanceBudget, otherwise the TX is paid by the Paymaster. `true` if the Paymaster wants to reject the TX if the recipient reverts. `false` if the Paymaster wants rejects by the recipient to be completed on chain and paid by the Paymaster." + } + }, + "setRelayHub(address)": { + "params": { + "hub": "The address of the new RelayHub." + } + }, + "setTrustedForwarder(address)": { + "params": { + "forwarder": "The address of the new Forwarder." + } + }, + "supportsInterface(bytes4)": { + "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas." + }, + "versionPaymaster()": { + "returns": { + "_0": "version The SemVer string of this Paymaster's version." + } + }, + "withdrawRelayHubDepositTo(uint256,address)": { + "params": { + "amount": "The amount to be subtracted from the sender.", + "target": "The target to which the amount will be transferred." + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "deposit()": { + "notice": "Deposit Ether/MATIC on behalf of the Paymaster to the RelayHub." + }, + "getGasAndDataLimits()": { + "notice": "Return the Gas Limits for Paymaster's functions and maximum msg.data length values for this Paymaster. This function allows different paymasters to have different properties without changes to the RelayHub." + }, + "getTrustedForwarder()": { + "notice": ":warning: **Warning** :warning: using incorrect Forwarder may cause the Paymaster to agreeing to pay for invalid transactions." + }, + "postRelayedCall(bytes,bool,uint256,(uint256,uint256,uint256,address,address,address,bytes,uint256))": { + "notice": "This method is called after the actual relayed function call. It may be used to record the transaction (e.g. charge the caller by some contract logic) for this call. Revert in this functions causes a revert of the client's relayed call (and preRelayedCall(), but the Paymaster is still committed to pay the relay for the entire transaction." + }, + "preRelayedCall(((address,address,uint256,uint256,uint256,bytes,uint256),(uint256,uint256,uint256,address,address,address,bytes,uint256)),bytes,bytes,uint256)": { + "notice": "Called by the Relay in view mode and later by the `RelayHub` on-chain to validate that the Paymaster agrees to pay for this call. The request is considered to be rejected by the Paymaster in one of the following conditions: - `preRelayedCall()` method reverts - the `Forwarder` reverts because of nonce or signature error - the `Paymaster` returned `rejectOnRecipientRevert: true` and the recipient contract reverted (and all that did not consume more than `acceptanceBudget` gas). In any of the above cases, all Paymaster calls and the recipient call are reverted. In any other case the Paymaster will pay for the gas cost of the transaction. Note that even if `postRelayedCall` is reverted the Paymaster will be charged." + }, + "setRelayHub(address)": { + "notice": "The owner of the Paymaster can change the instance of the RelayHub this Paymaster works with. **Warning** The deposit on the previous RelayHub must be withdrawn first." + }, + "setTrustedForwarder(address)": { + "notice": "The owner of the Paymaster can change the instance of the Forwarder this Paymaster works with. the Recipients must trust this Forwarder as well in order for the configuration to remain functional." + }, + "withdrawRelayHubDepositTo(uint256,address)": { + "notice": "Withdraw deposit from the RelayHub." + } + }, + "notice": "The top-level Paymaster contract. Note this is an \"unwrapped\" version of `BasePaymaster.sol` from the OpenGSN repo. Original license: GPL-3.0-only.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 13131, + "contract": "contracts/paymaster/PaymasterTopFacet.sol:PaymasterTopFacet", + "label": "relayHub", + "offset": 0, + "slot": "0", + "type": "t_contract(IRelayHub)557" + }, + { + "astId": 13133, + "contract": "contracts/paymaster/PaymasterTopFacet.sol:PaymasterTopFacet", + "label": "trustedForwarder", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 13136, + "contract": "contracts/paymaster/PaymasterTopFacet.sol:PaymasterTopFacet", + "label": "useRejectOnRecipientRevert", + "offset": 20, + "slot": "1", + "type": "t_bool" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(IRelayHub)557": { + "encoding": "inplace", + "label": "contract IRelayHub", + "numberOfBytes": "20" + } + } + } +} \ No newline at end of file diff --git a/deployments/amoy/Paymaster_DiamondProxy.json b/deployments/amoy/Paymaster_DiamondProxy.json new file mode 100644 index 00000000..3ea699ca --- /dev/null +++ b/deployments/amoy/Paymaster_DiamondProxy.json @@ -0,0 +1,903 @@ +{ + "address": "0xf7E1464F712d6C1AF5e85ED711d3D3509792b903", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_contractOwner", + "type": "address" + }, + { + "components": [ + { + "internalType": "address", + "name": "facetAddress", + "type": "address" + }, + { + "internalType": "enum IDiamondCut.FacetCutAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "bytes4[]", + "name": "functionSelectors", + "type": "bytes4[]" + } + ], + "internalType": "struct IDiamondCut.FacetCut[]", + "name": "_diamondCut", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "address", + "name": "initContract", + "type": "address" + }, + { + "internalType": "bytes", + "name": "initData", + "type": "bytes" + } + ], + "internalType": "struct Diamond.Initialization[]", + "name": "_initializations", + "type": "tuple[]" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "ForwarderNotTrusted", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "InterfaceNotSupported", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidApprovalDataLength", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidPaymasterDataLength", + "type": "error" + }, + { + "inputs": [], + "name": "RelayHubAddressNotSet", + "type": "error" + }, + { + "inputs": [], + "name": "RequiresIssuerMemberCaller", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "who", + "type": "address" + } + ], + "name": "RequiresMarketplaceMembership", + "type": "error" + }, + { + "inputs": [], + "name": "RequiresRelayHubCaller", + "type": "error" + }, + { + "inputs": [], + "name": "ValueTransferNotSupported", + "type": "error" + }, + { + "inputs": [], + "name": "CALLDATA_SIZE_LIMIT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "FORWARDER_HUB_OVERHEAD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAYMASTER_ACCEPTANCE_BUDGET", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "POST_RELAYED_CALL_GAS_LIMIT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PRE_RELAYED_CALL_GAS_LIMIT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getGasAndDataLimits", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "acceptanceBudget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "preRelayedCallGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "postRelayedCallGasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "calldataSizeLimit", + "type": "uint256" + } + ], + "internalType": "struct IPaymaster.GasAndDataLimits", + "name": "limits", + "type": "tuple" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getRelayHub", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTrustedForwarder", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "context", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "gasUseWithoutPost", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "maxFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPriorityFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "transactionCalldataGasUsed", + "type": "uint256" + }, + { + "internalType": "address", + "name": "relayWorker", + "type": "address" + }, + { + "internalType": "address", + "name": "paymaster", + "type": "address" + }, + { + "internalType": "address", + "name": "forwarder", + "type": "address" + }, + { + "internalType": "bytes", + "name": "paymasterData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "clientId", + "type": "uint256" + } + ], + "internalType": "struct GsnTypes.RelayData", + "name": "relayData", + "type": "tuple" + } + ], + "name": "postRelayedCall", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "gas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "validUntilTime", + "type": "uint256" + } + ], + "internalType": "struct IForwarder.ForwardRequest", + "name": "request", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "maxFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxPriorityFeePerGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "transactionCalldataGasUsed", + "type": "uint256" + }, + { + "internalType": "address", + "name": "relayWorker", + "type": "address" + }, + { + "internalType": "address", + "name": "paymaster", + "type": "address" + }, + { + "internalType": "address", + "name": "forwarder", + "type": "address" + }, + { + "internalType": "bytes", + "name": "paymasterData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "clientId", + "type": "uint256" + } + ], + "internalType": "struct GsnTypes.RelayData", + "name": "relayData", + "type": "tuple" + } + ], + "internalType": "struct GsnTypes.RelayRequest", + "name": "relayRequest", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "approvalData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "preRelayedCall", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRelayHub", + "name": "hub", + "type": "address" + } + ], + "name": "setRelayHub", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "forwarder", + "type": "address" + } + ], + "name": "setTrustedForwarder", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "useRejectOnRecipientRevert", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "versionPaymaster", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "target", + "type": "address" + } + ], + "name": "withdrawRelayHubDepositTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "facetAddress", + "type": "address" + }, + { + "internalType": "enum IDiamondCut.FacetCutAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "bytes4[]", + "name": "functionSelectors", + "type": "bytes4[]" + } + ], + "indexed": false, + "internalType": "struct IDiamondCut.FacetCut[]", + "name": "_diamondCut", + "type": "tuple[]" + }, + { + "indexed": false, + "internalType": "address", + "name": "_init", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_calldata", + "type": "bytes" + } + ], + "name": "DiamondCut", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "facetAddress", + "type": "address" + }, + { + "internalType": "enum IDiamondCut.FacetCutAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "bytes4[]", + "name": "functionSelectors", + "type": "bytes4[]" + } + ], + "internalType": "struct IDiamondCut.FacetCut[]", + "name": "_diamondCut", + "type": "tuple[]" + }, + { + "internalType": "address", + "name": "_init", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_calldata", + "type": "bytes" + } + ], + "name": "diamondCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "owner_", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_functionSelector", + "type": "bytes4" + } + ], + "name": "facetAddress", + "outputs": [ + { + "internalType": "address", + "name": "facetAddress_", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "facetAddresses", + "outputs": [ + { + "internalType": "address[]", + "name": "facetAddresses_", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_facet", + "type": "address" + } + ], + "name": "facetFunctionSelectors", + "outputs": [ + { + "internalType": "bytes4[]", + "name": "facetFunctionSelectors_", + "type": "bytes4[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "facets", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "facetAddress", + "type": "address" + }, + { + "internalType": "bytes4[]", + "name": "functionSelectors", + "type": "bytes4[]" + } + ], + "internalType": "struct IDiamondLoupe.Facet[]", + "name": "facets_", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x73d766fe3e28b3fe8ee211354b1fba8aa5d15eba720e52f7443f9ba8a0a7ee2a", + "receipt": { + "to": "0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7", + "from": "0x717634cfe06FFAB2CEAA7fcf1b9019813f4B25FE", + "contractAddress": null, + "transactionIndex": 0, + "gasUsed": "2774465", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000100000000008000000000000000000000400000000000000000000000000840000000800001000001000000000900001000000000000000020000000000000000000800000000000000000080000000000000400020000000000000000000000000000000000000000000000000000000000000200000004000000000000000000000000000000000000000000000000000004000000000000000000081000000000000000000000000000000100000000020000000000000000000000400000000008000000000000000000000000000100000", + "blockHash": "0x4b2f3e9472a1f05cb7c0b01bb60d1f038aa6cac5f5b1b457d743cc16aafbbe28", + "transactionHash": "0x73d766fe3e28b3fe8ee211354b1fba8aa5d15eba720e52f7443f9ba8a0a7ee2a", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 5430709, + "transactionHash": "0x73d766fe3e28b3fe8ee211354b1fba8aa5d15eba720e52f7443f9ba8a0a7ee2a", + "address": "0xf7E1464F712d6C1AF5e85ED711d3D3509792b903", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000717634cfe06ffab2ceaa7fcf1b9019813f4b25fe" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x4b2f3e9472a1f05cb7c0b01bb60d1f038aa6cac5f5b1b457d743cc16aafbbe28" + }, + { + "transactionIndex": 0, + "blockNumber": 5430709, + "transactionHash": "0x73d766fe3e28b3fe8ee211354b1fba8aa5d15eba720e52f7443f9ba8a0a7ee2a", + "address": "0xf7E1464F712d6C1AF5e85ED711d3D3509792b903", + "topics": [ + "0x8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000460000000000000000000000000a6b9c6a2beecd86be8b260b21950fc324d5e74560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000105c5e3db100000000000000000000000000000000000000000000000000000000b90b41cf00000000000000000000000000000000000000000000000000000000df463a6600000000000000000000000000000000000000000000000000000000bbdaa3c900000000000000000000000000000000000000000000000000000000f9c002f700000000000000000000000000000000000000000000000000000000d0e30db000000000000000000000000000000000000000000000000000000000b039a88f000000000000000000000000000000000000000000000000000000007bdf2ec700000000000000000000000000000000000000000000000000000000ce1b815f0000000000000000000000000000000000000000000000000000000076fa01c30000000000000000000000000000000000000000000000000000000000be5dd4000000000000000000000000000000000000000000000000000000007bb0526400000000000000000000000000000000000000000000000000000000da742228000000000000000000000000000000000000000000000000000000004f33b4dd00000000000000000000000000000000000000000000000000000000921276ea000000000000000000000000000000000000000000000000000000002d14c4b700000000000000000000000000000000000000000000000000000000000000000000000000000000c9f56f2d03682dfeff086e0863fa286bcecd135e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000011f931c1c00000000000000000000000000000000000000000000000000000000000000000000000000000000826a7b5a4ca07decad923eef9493876d158ae7950000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000028da5cb5b00000000000000000000000000000000000000000000000000000000f2fde38b0000000000000000000000000000000000000000000000000000000000000000000000000000000076b56a1c775754a6970837fae291ca4907b9f1b8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000005cdffacc60000000000000000000000000000000000000000000000000000000052ef6b2c00000000000000000000000000000000000000000000000000000000adfca15e000000000000000000000000000000000000000000000000000000007a0ed6270000000000000000000000000000000000000000000000000000000001ffc9a7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "logIndex": 1, + "blockHash": "0x4b2f3e9472a1f05cb7c0b01bb60d1f038aa6cac5f5b1b457d743cc16aafbbe28" + }, + { + "transactionIndex": 0, + "blockNumber": 5430709, + "transactionHash": "0x73d766fe3e28b3fe8ee211354b1fba8aa5d15eba720e52f7443f9ba8a0a7ee2a", + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000717634cfe06ffab2ceaa7fcf1b9019813f4b25fe", + "0x0000000000000000000000004ad84f7014b7b44f723f284a85b1662337971439" + ], + "data": "0x000000000000000000000000000000000000000000000000000ec90ab452c23b000000000000000000000000000000000000000000000000038ea818c7415e86000000000000000000000000000000000000000000000028ed42919ad69adeb2000000000000000000000000000000000000000000000000037fdf0e12ee9c4b000000000000000000000000000000000000000000000028ed515aa58aeda0ed", + "logIndex": 2, + "blockHash": "0x4b2f3e9472a1f05cb7c0b01bb60d1f038aa6cac5f5b1b457d743cc16aafbbe28" + } + ], + "blockNumber": 5430709, + "cumulativeGasUsed": "2774465", + "status": 1, + "byzantium": true + }, + "args": [ + "0x717634cfe06FFAB2CEAA7fcf1b9019813f4B25FE", + [ + { + "facetAddress": "0xa6b9c6a2BeEcD86bE8b260b21950FC324D5e7456", + "functionSelectors": [ + "0x5c5e3db1", + "0xb90b41cf", + "0xdf463a66", + "0xbbdaa3c9", + "0xf9c002f7", + "0xd0e30db0", + "0xb039a88f", + "0x7bdf2ec7", + "0xce1b815f", + "0x76fa01c3", + "0x00be5dd4", + "0x7bb05264", + "0xda742228", + "0x4f33b4dd", + "0x921276ea", + "0x2d14c4b7" + ], + "action": 0 + }, + { + "facetAddress": "0xc9f56F2D03682dfeFf086e0863Fa286bcEcD135E", + "functionSelectors": [ + "0x1f931c1c" + ], + "action": 0 + }, + { + "facetAddress": "0x826a7b5a4Ca07dEcaD923EEF9493876d158ae795", + "functionSelectors": [ + "0x8da5cb5b", + "0xf2fde38b" + ], + "action": 0 + }, + { + "facetAddress": "0x76b56a1C775754a6970837FAE291Ca4907B9f1b8", + "functionSelectors": [ + "0xcdffacc6", + "0x52ef6b2c", + "0xadfca15e", + "0x7a0ed627", + "0x01ffc9a7" + ], + "action": 0 + } + ], + [ + { + "initContract": "0xc89B8d4A22CF47BA10191b41BF99F5F7dBe5F3f1", + "initData": "0x2a84809100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000148e2b093000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "initContract": "0x55BeFe5E916fAcF8ce99356acCa9Bec066f86cD2", + "initData": "0xb6a597dd000000000000000000000000c3a6cf54e39e49b7d5e927b96f8f5ba200853c41000000000000000000000000385d8298eacdba2002313feea062b1c3dd5da4ad" + } + ] + ], + "numDeployments": 2, + "solcInputHash": "3fe12e823553336a8d0f950a5a792ac9", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_contractOwner\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"facetAddress\",\"type\":\"address\"},{\"internalType\":\"enum IDiamondCut.FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"functionSelectors\",\"type\":\"bytes4[]\"}],\"internalType\":\"struct IDiamondCut.FacetCut[]\",\"name\":\"_diamondCut\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"initContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"initData\",\"type\":\"bytes\"}],\"internalType\":\"struct Diamond.Initialization[]\",\"name\":\"_initializations\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_contractOwner\":\"the owner of the contract. With default DiamondCutFacet, this is the sole address allowed to make further cuts.\",\"_diamondCut\":\"the list of facet to add\",\"_initializations\":\"the list of initialization pair to execute. This allow to setup a contract with multiple level of independent initialization.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"This construct a diamond contract\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/diamond/Diamond.sol\":\"Diamond\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/diamond/Diamond.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/******************************************************************************\\\\\\n* Author: Nick Mudge (https://twitter.com/mudgen)\\n* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535\\n*\\n* Implementation of a diamond.\\n/******************************************************************************/\\n\\nimport {LibDiamond} from \\\"./libraries/LibDiamond.sol\\\";\\nimport {IDiamondCut} from \\\"./interfaces/IDiamondCut.sol\\\";\\n\\ncontract Diamond {\\n struct Initialization {\\n address initContract;\\n bytes initData;\\n }\\n\\n /// @notice This construct a diamond contract\\n /// @param _contractOwner the owner of the contract. With default DiamondCutFacet, this is the sole address allowed to make further cuts.\\n /// @param _diamondCut the list of facet to add\\n /// @param _initializations the list of initialization pair to execute. This allow to setup a contract with multiple level of independent initialization.\\n constructor(\\n address _contractOwner,\\n IDiamondCut.FacetCut[] memory _diamondCut,\\n Initialization[] memory _initializations\\n ) payable {\\n if (_contractOwner != address(0)) {\\n LibDiamond.setContractOwner(_contractOwner);\\n }\\n\\n LibDiamond.diamondCut(_diamondCut, address(0), \\\"\\\");\\n\\n for (uint256 i = 0; i < _initializations.length; i++) {\\n LibDiamond.initializeDiamondCut(_initializations[i].initContract, _initializations[i].initData);\\n }\\n }\\n\\n // Find facet for function that is called and execute the\\n // function if a facet is found and return any value.\\n fallback() external payable {\\n LibDiamond.DiamondStorage storage ds;\\n bytes32 position = LibDiamond.DIAMOND_STORAGE_POSITION;\\n // get diamond storage\\n assembly {\\n ds.slot := position\\n }\\n // get facet from function selector\\n address facet = ds.selectorToFacetAndPosition[msg.sig].facetAddress;\\n require(facet != address(0), \\\"Diamond: Function does not exist\\\");\\n // Execute external function from facet using delegatecall and return any value.\\n assembly {\\n // copy function selector and any arguments\\n calldatacopy(0, 0, calldatasize())\\n // execute function call using the facet\\n let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0)\\n // get any return value\\n returndatacopy(0, 0, returndatasize())\\n // return any return value or error back to the caller\\n switch result\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n receive() external payable {}\\n}\\n\",\"keccak256\":\"0x9f459a9f18d5429b0dd40e60b4a67a27d2b94693c4d190ed9dd7034a894c1eb6\",\"license\":\"MIT\"},\"solc_0.8/diamond/interfaces/IDiamondCut.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/******************************************************************************\\\\\\n* Author: Nick Mudge (https://twitter.com/mudgen)\\n* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535\\n/******************************************************************************/\\n\\ninterface IDiamondCut {\\n enum FacetCutAction {Add, Replace, Remove}\\n // Add=0, Replace=1, Remove=2\\n\\n struct FacetCut {\\n address facetAddress;\\n FacetCutAction action;\\n bytes4[] functionSelectors;\\n }\\n\\n /// @notice Add/replace/remove any number of functions and optionally execute\\n /// a function with delegatecall\\n /// @param _diamondCut Contains the facet addresses and function selectors\\n /// @param _init The address of the contract or facet to execute _calldata\\n /// @param _calldata A function call, including function selector and arguments\\n /// _calldata is executed with delegatecall on _init\\n function diamondCut(\\n FacetCut[] calldata _diamondCut,\\n address _init,\\n bytes calldata _calldata\\n ) external;\\n\\n event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);\\n}\\n\",\"keccak256\":\"0xc00c16bfa30a3fa5f3dc684f7f8ba62c259962b25f647d9588739458989717fc\",\"license\":\"MIT\"},\"solc_0.8/diamond/libraries/LibDiamond.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/******************************************************************************\\\\\\n* Author: Nick Mudge (https://twitter.com/mudgen)\\n* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535\\n/******************************************************************************/\\nimport { IDiamondCut } from \\\"../interfaces/IDiamondCut.sol\\\";\\n\\nlibrary LibDiamond {\\n bytes32 constant DIAMOND_STORAGE_POSITION = keccak256(\\\"diamond.standard.diamond.storage\\\");\\n\\n struct FacetAddressAndPosition {\\n address facetAddress;\\n uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array\\n }\\n\\n struct FacetFunctionSelectors {\\n bytes4[] functionSelectors;\\n uint256 facetAddressPosition; // position of facetAddress in facetAddresses array\\n }\\n\\n struct DiamondStorage {\\n // maps function selector to the facet address and\\n // the position of the selector in the facetFunctionSelectors.selectors array\\n mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition;\\n // maps facet addresses to function selectors\\n mapping(address => FacetFunctionSelectors) facetFunctionSelectors;\\n // facet addresses\\n address[] facetAddresses;\\n // Used to query if a contract implements an interface.\\n // Used to implement ERC-165.\\n mapping(bytes4 => bool) supportedInterfaces;\\n // owner of the contract\\n address contractOwner;\\n }\\n\\n function diamondStorage() internal pure returns (DiamondStorage storage ds) {\\n bytes32 position = DIAMOND_STORAGE_POSITION;\\n assembly {\\n ds.slot := position\\n }\\n }\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n function setContractOwner(address _newOwner) internal {\\n DiamondStorage storage ds = diamondStorage();\\n address previousOwner = ds.contractOwner;\\n ds.contractOwner = _newOwner;\\n emit OwnershipTransferred(previousOwner, _newOwner);\\n }\\n\\n function contractOwner() internal view returns (address contractOwner_) {\\n contractOwner_ = diamondStorage().contractOwner;\\n }\\n\\n function enforceIsContractOwner() internal view {\\n require(msg.sender == diamondStorage().contractOwner, \\\"LibDiamond: Must be contract owner\\\");\\n }\\n\\n event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata);\\n\\n // Internal function version of diamondCut\\n function diamondCut(\\n IDiamondCut.FacetCut[] memory _diamondCut,\\n address _init,\\n bytes memory _calldata\\n ) internal {\\n for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) {\\n IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action;\\n if (action == IDiamondCut.FacetCutAction.Add) {\\n addFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);\\n } else if (action == IDiamondCut.FacetCutAction.Replace) {\\n replaceFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);\\n } else if (action == IDiamondCut.FacetCutAction.Remove) {\\n removeFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);\\n } else {\\n revert(\\\"LibDiamondCut: Incorrect FacetCutAction\\\");\\n }\\n }\\n emit DiamondCut(_diamondCut, _init, _calldata);\\n initializeDiamondCut(_init, _calldata);\\n }\\n\\n function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {\\n require(_functionSelectors.length > 0, \\\"LibDiamondCut: No selectors in facet to cut\\\");\\n DiamondStorage storage ds = diamondStorage(); \\n require(_facetAddress != address(0), \\\"LibDiamondCut: Add facet can't be address(0)\\\");\\n uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length);\\n // add new facet address if it does not exist\\n if (selectorPosition == 0) {\\n addFacet(ds, _facetAddress); \\n }\\n for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {\\n bytes4 selector = _functionSelectors[selectorIndex];\\n address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;\\n require(oldFacetAddress == address(0), \\\"LibDiamondCut: Can't add function that already exists\\\");\\n addFunction(ds, selector, selectorPosition, _facetAddress);\\n selectorPosition++;\\n }\\n }\\n\\n function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {\\n require(_functionSelectors.length > 0, \\\"LibDiamondCut: No selectors in facet to cut\\\");\\n DiamondStorage storage ds = diamondStorage();\\n require(_facetAddress != address(0), \\\"LibDiamondCut: Add facet can't be address(0)\\\");\\n uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length);\\n // add new facet address if it does not exist\\n if (selectorPosition == 0) {\\n addFacet(ds, _facetAddress);\\n }\\n for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {\\n bytes4 selector = _functionSelectors[selectorIndex];\\n address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;\\n require(oldFacetAddress != _facetAddress, \\\"LibDiamondCut: Can't replace function with same function\\\");\\n removeFunction(ds, oldFacetAddress, selector);\\n addFunction(ds, selector, selectorPosition, _facetAddress);\\n selectorPosition++;\\n }\\n }\\n\\n function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {\\n require(_functionSelectors.length > 0, \\\"LibDiamondCut: No selectors in facet to cut\\\");\\n DiamondStorage storage ds = diamondStorage();\\n // if function does not exist then do nothing and return\\n require(_facetAddress == address(0), \\\"LibDiamondCut: Remove facet address must be address(0)\\\");\\n for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {\\n bytes4 selector = _functionSelectors[selectorIndex];\\n address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;\\n removeFunction(ds, oldFacetAddress, selector);\\n }\\n }\\n\\n function addFacet(DiamondStorage storage ds, address _facetAddress) internal {\\n enforceHasContractCode(_facetAddress, \\\"LibDiamondCut: New facet has no code\\\");\\n ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds.facetAddresses.length;\\n ds.facetAddresses.push(_facetAddress);\\n } \\n\\n\\n function addFunction(DiamondStorage storage ds, bytes4 _selector, uint96 _selectorPosition, address _facetAddress) internal {\\n ds.selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition;\\n ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector);\\n ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress;\\n }\\n\\n function removeFunction(DiamondStorage storage ds, address _facetAddress, bytes4 _selector) internal { \\n require(_facetAddress != address(0), \\\"LibDiamondCut: Can't remove function that doesn't exist\\\");\\n // an immutable function is a function defined directly in a diamond\\n require(_facetAddress != address(this), \\\"LibDiamondCut: Can't remove immutable function\\\");\\n // replace selector with last selector, then delete last selector\\n uint256 selectorPosition = ds.selectorToFacetAndPosition[_selector].functionSelectorPosition;\\n uint256 lastSelectorPosition = ds.facetFunctionSelectors[_facetAddress].functionSelectors.length - 1;\\n // if not the same then replace _selector with lastSelector\\n if (selectorPosition != lastSelectorPosition) {\\n bytes4 lastSelector = ds.facetFunctionSelectors[_facetAddress].functionSelectors[lastSelectorPosition];\\n ds.facetFunctionSelectors[_facetAddress].functionSelectors[selectorPosition] = lastSelector;\\n ds.selectorToFacetAndPosition[lastSelector].functionSelectorPosition = uint96(selectorPosition);\\n }\\n // delete the last selector\\n ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop();\\n delete ds.selectorToFacetAndPosition[_selector];\\n\\n // if no more selectors for facet address then delete the facet address\\n if (lastSelectorPosition == 0) {\\n // replace facet address with last facet address and delete last facet address\\n uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1;\\n uint256 facetAddressPosition = ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;\\n if (facetAddressPosition != lastFacetAddressPosition) {\\n address lastFacetAddress = ds.facetAddresses[lastFacetAddressPosition];\\n ds.facetAddresses[facetAddressPosition] = lastFacetAddress;\\n ds.facetFunctionSelectors[lastFacetAddress].facetAddressPosition = facetAddressPosition;\\n }\\n ds.facetAddresses.pop();\\n delete ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;\\n }\\n }\\n\\n function initializeDiamondCut(address _init, bytes memory _calldata) internal {\\n if (_init == address(0)) {\\n require(_calldata.length == 0, \\\"LibDiamondCut: _init is address(0) but_calldata is not empty\\\");\\n } else {\\n require(_calldata.length > 0, \\\"LibDiamondCut: _calldata is empty but _init is not address(0)\\\");\\n if (_init != address(this)) {\\n enforceHasContractCode(_init, \\\"LibDiamondCut: _init address has no code\\\");\\n }\\n (bool success, bytes memory error) = _init.delegatecall(_calldata);\\n if (!success) {\\n if (error.length > 0) {\\n // bubble up the error\\n revert(string(error));\\n } else {\\n revert(\\\"LibDiamondCut: _init function reverted\\\");\\n }\\n }\\n }\\n }\\n\\n function enforceHasContractCode(address _contract, string memory _errorMessage) internal view {\\n uint256 contractSize;\\n assembly {\\n contractSize := extcodesize(_contract)\\n }\\n require(contractSize > 0, _errorMessage);\\n }\\n}\\n\",\"keccak256\":\"0x2205345e83eb86f5281f159a9215a096cb6d404782619f9b8e9d7a4a46c32a37\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040526040516200321e3803806200321e833981016040819052620000269162001340565b6001600160a01b038316156200004c576200004c83620000f760201b620001071760201c565b62000074826000604051806020016040528060008152506200017b60201b620001c11760201c565b60005b8151811015620000ed57620000d88282815181106200009a576200009a62001514565b602002602001015160000151838381518110620000bb57620000bb62001514565b602002602001015160200151620003d960201b620004051760201c565b80620000e48162001540565b91505062000077565b505050506200173d565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c132080546001600160a01b031981166001600160a01b0384811691821790935560405160008051602062003172833981519152939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60005b83518110156200038a5760008482815181106200019f576200019f62001514565b602002602001015160200151905060006002811115620001c357620001c36200155e565b816002811115620001d857620001d86200155e565b1415620002375762000231858381518110620001f857620001f862001514565b60200260200101516000015186848151811062000219576200021962001514565b602002602001015160400151620005fe60201b60201c565b62000374565b60018160028111156200024e576200024e6200155e565b1415620002a757620002318583815181106200026e576200026e62001514565b6020026020010151600001518684815181106200028f576200028f62001514565b6020026020010151604001516200088860201b60201c565b6002816002811115620002be57620002be6200155e565b1415620003175762000231858381518110620002de57620002de62001514565b602002602001015160000151868481518110620002ff57620002ff62001514565b60200260200101516040015162000b1e60201b60201c565b60405162461bcd60e51b815260206004820152602760248201527f4c69624469616d6f6e644375743a20496e636f727265637420466163657443756044820152663a20b1ba34b7b760c91b60648201526084015b60405180910390fd5b5080620003818162001540565b9150506200017e565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673838383604051620003c093929190620015a2565b60405180910390a1620003d48282620003d9565b505050565b6001600160a01b03821662000463578051156200045f5760405162461bcd60e51b815260206004820152603c60248201527f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860448201527f3029206275745f63616c6c64617461206973206e6f7420656d7074790000000060648201526084016200036b565b5050565b6000815111620004dc5760405162461bcd60e51b815260206004820152603d60248201527f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460448201527f7920627574205f696e6974206973206e6f74206164647265737328302900000060648201526084016200036b565b6001600160a01b038216301462000512576200051282604051806060016040528060288152602001620031926028913962000c7e565b600080836001600160a01b0316836040516200052f9190620016a9565b600060405180830381855af49150503d80600081146200056c576040519150601f19603f3d011682016040523d82523d6000602084013e62000571565b606091505b509150915081620005f857805115620005a0578060405162461bcd60e51b81526004016200036b9190620016c7565b60405162461bcd60e51b815260206004820152602660248201527f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e2072656044820152651d995c9d195960d21b60648201526084016200036b565b50505050565b6000815111620006545760405162461bcd60e51b815260206004820152602b6024820152600080516020620031fe83398151915260448201526a1858d95d081d1bc818dd5d60aa1b60648201526084016200036b565b600080516020620031728339815191526001600160a01b038316620006c05760405162461bcd60e51b815260206004820152602c6024820152600080516020620031ba83398151915260448201526b65206164647265737328302960a01b60648201526084016200036b565b6001600160a01b03831660009081526001820160205260409020546001600160601b038116620006f657620006f6828562000ca2565b60005b8351811015620008815760008482815181106200071a576200071a62001514565b6020908102919091018101516001600160e01b031981166000908152918690526040909120549091506001600160a01b03168015620007c25760405162461bcd60e51b815260206004820152603560248201527f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60448201527f6e207468617420616c726561647920657869737473000000000000000000000060648201526084016200036b565b6001600160e01b0319821660008181526020878152604080832080546001600160a01b03908116600160a01b6001600160601b038c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281546001600160a01b031916179055836200086681620016e3565b94505050508080620008789062001540565b915050620006f9565b5050505050565b6000815111620008de5760405162461bcd60e51b815260206004820152602b6024820152600080516020620031fe83398151915260448201526a1858d95d081d1bc818dd5d60aa1b60648201526084016200036b565b600080516020620031728339815191526001600160a01b0383166200094a5760405162461bcd60e51b815260206004820152602c6024820152600080516020620031ba83398151915260448201526b65206164647265737328302960a01b60648201526084016200036b565b6001600160a01b03831660009081526001820160205260409020546001600160601b038116620009805762000980828562000ca2565b60005b835181101562000881576000848281518110620009a457620009a462001514565b6020908102919091018101516001600160e01b031981166000908152918690526040909120549091506001600160a01b0390811690871681141562000a525760405162461bcd60e51b815260206004820152603860248201527f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60448201527f6374696f6e20776974682073616d652066756e6374696f6e000000000000000060648201526084016200036b565b62000a5f85828462000d0f565b6001600160e01b0319821660008181526020878152604080832080546001600160a01b03908116600160a01b6001600160601b038c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281546001600160a01b0319161790558362000b0381620016e3565b9450505050808062000b159062001540565b91505062000983565b600081511162000b745760405162461bcd60e51b815260206004820152602b6024820152600080516020620031fe83398151915260448201526a1858d95d081d1bc818dd5d60aa1b60648201526084016200036b565b600080516020620031728339815191526001600160a01b0383161562000c035760405162461bcd60e51b815260206004820152603660248201527f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260448201527f657373206d75737420626520616464726573732830290000000000000000000060648201526084016200036b565b60005b8251811015620005f857600083828151811062000c275762000c2762001514565b6020908102919091018101516001600160e01b031981166000908152918590526040909120549091506001600160a01b031662000c6684828462000d0f565b5050808062000c759062001540565b91505062000c06565b813b8181620005f85760405162461bcd60e51b81526004016200036b9190620016c7565b62000cc781604051806060016040528060248152602001620031da6024913962000c7e565b6002820180546001600160a01b0390921660008181526001948501602090815260408220860185905594840183559182529290200180546001600160a01b0319169091179055565b6001600160a01b03821662000d8d5760405162461bcd60e51b815260206004820152603760248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360448201527f74696f6e207468617420646f65736e277420657869737400000000000000000060648201526084016200036b565b6001600160a01b03821630141562000dff5760405162461bcd60e51b815260206004820152602e60248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560448201526d3a30b1363290333ab731ba34b7b760911b60648201526084016200036b565b6001600160e01b03198116600090815260208481526040808320546001600160a01b0386168452600180880190935290832054600160a01b9091046001600160601b0316929162000e50916200170d565b905080821462000f49576001600160a01b0384166000908152600186016020526040812080548390811062000e895762000e8962001514565b600091825260208083206008830401546001600160a01b038916845260018a019091526040909220805460079092166004026101000a90920460e01b92508291908590811062000edd5762000edd62001514565b600091825260208083206008830401805463ffffffff60079094166004026101000a938402191660e09590951c929092029390931790556001600160e01b03199290921682528690526040902080546001600160a01b0316600160a01b6001600160601b038516021790555b6001600160a01b0384166000908152600186016020526040902080548062000f755762000f7562001727565b60008281526020808220600860001990940193840401805463ffffffff600460078716026101000a0219169055919092556001600160e01b0319851682528690526040812055806200088157600285015460009062000fd7906001906200170d565b6001600160a01b03861660009081526001808901602052604090912001549091508082146200108d5760008760020183815481106200101a576200101a62001514565b6000918252602090912001546002890180546001600160a01b0390921692508291849081106200104e576200104e62001514565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055929091168152600189810190925260409020018190555b86600201805480620010a357620010a362001727565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0388168252600189810190915260408220015550505050505050565b80516001600160a01b03811681146200110457600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171562001144576200114462001109565b60405290565b604051606081016001600160401b038111828210171562001144576200114462001109565b604051601f8201601f191681016001600160401b03811182821017156200119a576200119a62001109565b604052919050565b60006001600160401b03821115620011be57620011be62001109565b5060051b60200190565b60005b83811015620011e5578181015183820152602001620011cb565b83811115620005f85750506000910152565b6000601f83818401126200120a57600080fd5b82516020620012236200121d83620011a2565b6200116f565b82815260059290921b850181019181810190878411156200124357600080fd5b8287015b84811015620013345780516001600160401b0380821115620012695760008081fd5b908901906040601f19838d038101821315620012855760008081fd5b6200128f6200111f565b6200129c898601620010ec565b81528285015184811115620012b15760008081fd5b8086019550508d603f860112620012c85760008081fd5b8885015184811115620012df57620012df62001109565b620012f08a848e840116016200116f565b94508085528e848288010111156200130a57600092508283fd5b6200131b818b8701868901620011c8565b5080890193909352505084525091830191830162001247565b50979650505050505050565b6000806000606084860312156200135657600080fd5b6200136184620010ec565b60208501519093506001600160401b03808211156200137f57600080fd5b818601915086601f8301126200139457600080fd5b8151620013a56200121d82620011a2565b8082825260208201915060208360051b860101925089831115620013c857600080fd5b602085015b83811015620014e057805185811115620013e657600080fd5b86016060818d03601f19011215620013fd57600080fd5b620014076200114a565b6200141560208301620010ec565b81526040820151600381106200142a57600080fd5b60208201526060820151878111156200144257600080fd5b8083019250508c603f8301126200145857600080fd5b60208201516200146c6200121d82620011a2565b81815260059190911b83016040019060208101908f8311156200148e57600080fd5b6040850194505b82851015620014c95784516001600160e01b031981168114620014b757600080fd5b82526020948501949091019062001495565b6040840152505084525060209283019201620013cd565b5060408901519096509350505080821115620014fb57600080fd5b506200150a86828701620011f7565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156200155757620015576200152a565b5060010190565b634e487b7160e01b600052602160045260246000fd5b600081518084526200158e816020860160208601620011c8565b601f01601f19169290920160200192915050565b60006060808301818452808751808352608092508286019150828160051b8701016020808b0160005b848110156200167757898403607f19018652815180516001600160a01b031685528381015189860190600381106200161357634e487b7160e01b600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b80831015620016615783516001600160e01b031916825292860192600192909201919086019062001635565b50978501979550505090820190600101620015cb565b50506001600160a01b038a169088015286810360408801526200169b818962001574565b9a9950505050505050505050565b60008251620016bd818460208701620011c8565b9190910192915050565b602081526000620016dc602083018462001574565b9392505050565b60006001600160601b03828116808214156200170357620017036200152a565b6001019392505050565b6000828210156200172257620017226200152a565b500390565b634e487b7160e01b600052603160045260246000fd5b611a25806200174d6000396000f3fe60806040523661000b57005b600080357fffffffff000000000000000000000000000000000000000000000000000000001681527fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c6020819052604090912054819073ffffffffffffffffffffffffffffffffffffffff16806100e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4469616d6f6e643a2046756e6374696f6e20646f6573206e6f7420657869737460448201526064015b60405180910390fd5b3660008037600080366000845af43d6000803e808015610102573d6000f35b3d6000fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c132080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff8481169182179093556040517fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60005b83518110156103ba5760008482815181106101e1576101e1611657565b60200260200101516020015190506000600281111561020257610202611686565b81600281111561021457610214611686565b14156102635761025e85838151811061022f5761022f611657565b60200260200101516000015186848151811061024d5761024d611657565b6020026020010151604001516106be565b6103a7565b600181600281111561027757610277611686565b14156102c15761025e85838151811061029257610292611657565b6020026020010151600001518684815181106102b0576102b0611657565b602002602001015160400151610a71565b60028160028111156102d5576102d5611686565b141561031f5761025e8583815181106102f0576102f0611657565b60200260200101516000015186848151811061030e5761030e611657565b602002602001015160400151610e2e565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4c69624469616d6f6e644375743a20496e636f7272656374204661636574437560448201527f74416374696f6e0000000000000000000000000000000000000000000000000060648201526084016100da565b50806103b2816116e4565b9150506101c4565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6738383836040516103ee93929190611793565b60405180910390a16104008282610405565b505050565b73ffffffffffffffffffffffffffffffffffffffff82166104b3578051156104af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860448201527f3029206275745f63616c6c64617461206973206e6f7420656d7074790000000060648201526084016100da565b5050565b6000815111610544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460448201527f7920627574205f696e6974206973206e6f74206164647265737328302900000060648201526084016100da565b73ffffffffffffffffffffffffffffffffffffffff8216301461058357610583826040518060600160405280602881526020016119a46028913961101b565b6000808373ffffffffffffffffffffffffffffffffffffffff16836040516105ab91906118fb565b600060405180830381855af49150503d80600081146105e6576040519150601f19603f3d011682016040523d82523d6000602084013e6105eb565b606091505b5091509150816106b85780511561063057806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100da9190611917565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e20726560448201527f766572746564000000000000000000000000000000000000000000000000000060648201526084016100da565b50505050565b600081511161074f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201527f6163657420746f2063757400000000000000000000000000000000000000000060648201526084016100da565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c73ffffffffffffffffffffffffffffffffffffffff8316610813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260448201527f652061646472657373283029000000000000000000000000000000000000000060648201526084016100da565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001820160205260409020546bffffffffffffffffffffffff8116610858576108588285611056565b60005b8351811015610a6a57600084828151811061087857610878611657565b6020908102919091018101517fffffffff00000000000000000000000000000000000000000000000000000000811660009081529186905260409091205490915073ffffffffffffffffffffffffffffffffffffffff16801561095d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60448201527f6e207468617420616c726561647920657869737473000000000000000000000060648201526084016100da565b7fffffffff000000000000000000000000000000000000000000000000000000008216600081815260208781526040808320805473ffffffffffffffffffffffffffffffffffffffff908116740100000000000000000000000000000000000000006bffffffffffffffffffffffff8c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281547fffffffffffffffffffffffff00000000000000000000000000000000000000001617905583610a5281611931565b94505050508080610a62906116e4565b91505061085b565b5050505050565b6000815111610b02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201527f6163657420746f2063757400000000000000000000000000000000000000000060648201526084016100da565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c73ffffffffffffffffffffffffffffffffffffffff8316610bc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260448201527f652061646472657373283029000000000000000000000000000000000000000060648201526084016100da565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001820160205260409020546bffffffffffffffffffffffff8116610c0b57610c0b8285611056565b60005b8351811015610a6a576000848281518110610c2b57610c2b611657565b6020908102919091018101517fffffffff00000000000000000000000000000000000000000000000000000000811660009081529186905260409091205490915073ffffffffffffffffffffffffffffffffffffffff908116908716811415610d16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60448201527f6374696f6e20776974682073616d652066756e6374696f6e000000000000000060648201526084016100da565b610d218582846110e5565b7fffffffff000000000000000000000000000000000000000000000000000000008216600081815260208781526040808320805473ffffffffffffffffffffffffffffffffffffffff908116740100000000000000000000000000000000000000006bffffffffffffffffffffffff8c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281547fffffffffffffffffffffffff00000000000000000000000000000000000000001617905583610e1681611931565b94505050508080610e26906116e4565b915050610c0e565b6000815111610ebf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201527f6163657420746f2063757400000000000000000000000000000000000000000060648201526084016100da565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c73ffffffffffffffffffffffffffffffffffffffff831615610f84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260448201527f657373206d75737420626520616464726573732830290000000000000000000060648201526084016100da565b60005b82518110156106b8576000838281518110610fa457610fa4611657565b6020908102919091018101517fffffffff00000000000000000000000000000000000000000000000000000000811660009081529185905260409091205490915073ffffffffffffffffffffffffffffffffffffffff166110068482846110e5565b50508080611013906116e4565b915050610f87565b813b81816106b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100da9190611917565b611078816040518060600160405280602481526020016119cc6024913961101b565b60028201805473ffffffffffffffffffffffffffffffffffffffff90921660008181526001948501602090815260408220860185905594840183559182529290200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b73ffffffffffffffffffffffffffffffffffffffff8216611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360448201527f74696f6e207468617420646f65736e277420657869737400000000000000000060648201526084016100da565b73ffffffffffffffffffffffffffffffffffffffff821630141561122e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560448201527f7461626c652066756e6374696f6e00000000000000000000000000000000000060648201526084016100da565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152602084815260408083205473ffffffffffffffffffffffffffffffffffffffff86168452600180880190935290832054740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff1692916112b89161195d565b90508082146113ff5773ffffffffffffffffffffffffffffffffffffffff8416600090815260018601602052604081208054839081106112fa576112fa611657565b6000918252602080832060088304015473ffffffffffffffffffffffffffffffffffffffff8916845260018a019091526040909220805460079092166004026101000a90920460e01b92508291908590811061135857611358611657565b600091825260208083206008830401805463ffffffff60079094166004026101000a938402191660e09590951c929092029390931790557fffffffff0000000000000000000000000000000000000000000000000000000092909216825286905260409020805473ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000006bffffffffffffffffffffffff8516021790555b73ffffffffffffffffffffffffffffffffffffffff84166000908152600186016020526040902080548061143557611435611974565b6000828152602080822060087fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193840401805463ffffffff600460078716026101000a0219169055919092557fffffffff0000000000000000000000000000000000000000000000000000000085168252869052604081205580610a6a5760028501546000906114ca9060019061195d565b73ffffffffffffffffffffffffffffffffffffffff861660009081526001808901602052604090912001549091508082146115b857600087600201838154811061151657611516611657565b60009182526020909120015460028901805473ffffffffffffffffffffffffffffffffffffffff909216925082918490811061155457611554611657565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055929091168152600189810190925260409020018190555b866002018054806115cb576115cb611974565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff88168252600189810190915260408220015550505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611716576117166116b5565b5060010190565b60005b83811015611738578181015183820152602001611720565b838111156106b85750506000910152565b6000815180845261176181602086016020860161171d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006060808301818452808751808352608092508286019150828160051b8701016020808b0160005b848110156118be577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808a8503018652815188850173ffffffffffffffffffffffffffffffffffffffff82511686528482015160038110611845577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b808310156118a95783517fffffffff00000000000000000000000000000000000000000000000000000000168252928601926001929092019190860190611867565b509785019795505050908201906001016117bc565b505073ffffffffffffffffffffffffffffffffffffffff8a169088015286810360408801526118ed8189611749565b9a9950505050505050505050565b6000825161190d81846020870161171d565b9190910192915050565b60208152600061192a6020830184611749565b9392505050565b60006bffffffffffffffffffffffff80831681811415611953576119536116b5565b6001019392505050565b60008282101561196f5761196f6116b5565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f6465a26469706673582212202b18a533b03703e1326000cf2f36b1c6ec631cff163a752d939e5ee79ad2cde364736f6c634300080a0033c8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204164642066616365742063616e277420624c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f64654c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e2066", + "deployedBytecode": "0x60806040523661000b57005b600080357fffffffff000000000000000000000000000000000000000000000000000000001681527fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c6020819052604090912054819073ffffffffffffffffffffffffffffffffffffffff16806100e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4469616d6f6e643a2046756e6374696f6e20646f6573206e6f7420657869737460448201526064015b60405180910390fd5b3660008037600080366000845af43d6000803e808015610102573d6000f35b3d6000fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c132080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff8481169182179093556040517fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60005b83518110156103ba5760008482815181106101e1576101e1611657565b60200260200101516020015190506000600281111561020257610202611686565b81600281111561021457610214611686565b14156102635761025e85838151811061022f5761022f611657565b60200260200101516000015186848151811061024d5761024d611657565b6020026020010151604001516106be565b6103a7565b600181600281111561027757610277611686565b14156102c15761025e85838151811061029257610292611657565b6020026020010151600001518684815181106102b0576102b0611657565b602002602001015160400151610a71565b60028160028111156102d5576102d5611686565b141561031f5761025e8583815181106102f0576102f0611657565b60200260200101516000015186848151811061030e5761030e611657565b602002602001015160400151610e2e565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4c69624469616d6f6e644375743a20496e636f7272656374204661636574437560448201527f74416374696f6e0000000000000000000000000000000000000000000000000060648201526084016100da565b50806103b2816116e4565b9150506101c4565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6738383836040516103ee93929190611793565b60405180910390a16104008282610405565b505050565b73ffffffffffffffffffffffffffffffffffffffff82166104b3578051156104af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860448201527f3029206275745f63616c6c64617461206973206e6f7420656d7074790000000060648201526084016100da565b5050565b6000815111610544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460448201527f7920627574205f696e6974206973206e6f74206164647265737328302900000060648201526084016100da565b73ffffffffffffffffffffffffffffffffffffffff8216301461058357610583826040518060600160405280602881526020016119a46028913961101b565b6000808373ffffffffffffffffffffffffffffffffffffffff16836040516105ab91906118fb565b600060405180830381855af49150503d80600081146105e6576040519150601f19603f3d011682016040523d82523d6000602084013e6105eb565b606091505b5091509150816106b85780511561063057806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100da9190611917565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e20726560448201527f766572746564000000000000000000000000000000000000000000000000000060648201526084016100da565b50505050565b600081511161074f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201527f6163657420746f2063757400000000000000000000000000000000000000000060648201526084016100da565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c73ffffffffffffffffffffffffffffffffffffffff8316610813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260448201527f652061646472657373283029000000000000000000000000000000000000000060648201526084016100da565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001820160205260409020546bffffffffffffffffffffffff8116610858576108588285611056565b60005b8351811015610a6a57600084828151811061087857610878611657565b6020908102919091018101517fffffffff00000000000000000000000000000000000000000000000000000000811660009081529186905260409091205490915073ffffffffffffffffffffffffffffffffffffffff16801561095d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60448201527f6e207468617420616c726561647920657869737473000000000000000000000060648201526084016100da565b7fffffffff000000000000000000000000000000000000000000000000000000008216600081815260208781526040808320805473ffffffffffffffffffffffffffffffffffffffff908116740100000000000000000000000000000000000000006bffffffffffffffffffffffff8c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281547fffffffffffffffffffffffff00000000000000000000000000000000000000001617905583610a5281611931565b94505050508080610a62906116e4565b91505061085b565b5050505050565b6000815111610b02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201527f6163657420746f2063757400000000000000000000000000000000000000000060648201526084016100da565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c73ffffffffffffffffffffffffffffffffffffffff8316610bc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260448201527f652061646472657373283029000000000000000000000000000000000000000060648201526084016100da565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001820160205260409020546bffffffffffffffffffffffff8116610c0b57610c0b8285611056565b60005b8351811015610a6a576000848281518110610c2b57610c2b611657565b6020908102919091018101517fffffffff00000000000000000000000000000000000000000000000000000000811660009081529186905260409091205490915073ffffffffffffffffffffffffffffffffffffffff908116908716811415610d16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60448201527f6374696f6e20776974682073616d652066756e6374696f6e000000000000000060648201526084016100da565b610d218582846110e5565b7fffffffff000000000000000000000000000000000000000000000000000000008216600081815260208781526040808320805473ffffffffffffffffffffffffffffffffffffffff908116740100000000000000000000000000000000000000006bffffffffffffffffffffffff8c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281547fffffffffffffffffffffffff00000000000000000000000000000000000000001617905583610e1681611931565b94505050508080610e26906116e4565b915050610c0e565b6000815111610ebf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201527f6163657420746f2063757400000000000000000000000000000000000000000060648201526084016100da565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c73ffffffffffffffffffffffffffffffffffffffff831615610f84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260448201527f657373206d75737420626520616464726573732830290000000000000000000060648201526084016100da565b60005b82518110156106b8576000838281518110610fa457610fa4611657565b6020908102919091018101517fffffffff00000000000000000000000000000000000000000000000000000000811660009081529185905260409091205490915073ffffffffffffffffffffffffffffffffffffffff166110068482846110e5565b50508080611013906116e4565b915050610f87565b813b81816106b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100da9190611917565b611078816040518060600160405280602481526020016119cc6024913961101b565b60028201805473ffffffffffffffffffffffffffffffffffffffff90921660008181526001948501602090815260408220860185905594840183559182529290200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b73ffffffffffffffffffffffffffffffffffffffff8216611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360448201527f74696f6e207468617420646f65736e277420657869737400000000000000000060648201526084016100da565b73ffffffffffffffffffffffffffffffffffffffff821630141561122e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560448201527f7461626c652066756e6374696f6e00000000000000000000000000000000000060648201526084016100da565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152602084815260408083205473ffffffffffffffffffffffffffffffffffffffff86168452600180880190935290832054740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff1692916112b89161195d565b90508082146113ff5773ffffffffffffffffffffffffffffffffffffffff8416600090815260018601602052604081208054839081106112fa576112fa611657565b6000918252602080832060088304015473ffffffffffffffffffffffffffffffffffffffff8916845260018a019091526040909220805460079092166004026101000a90920460e01b92508291908590811061135857611358611657565b600091825260208083206008830401805463ffffffff60079094166004026101000a938402191660e09590951c929092029390931790557fffffffff0000000000000000000000000000000000000000000000000000000092909216825286905260409020805473ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000006bffffffffffffffffffffffff8516021790555b73ffffffffffffffffffffffffffffffffffffffff84166000908152600186016020526040902080548061143557611435611974565b6000828152602080822060087fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193840401805463ffffffff600460078716026101000a0219169055919092557fffffffff0000000000000000000000000000000000000000000000000000000085168252869052604081205580610a6a5760028501546000906114ca9060019061195d565b73ffffffffffffffffffffffffffffffffffffffff861660009081526001808901602052604090912001549091508082146115b857600087600201838154811061151657611516611657565b60009182526020909120015460028901805473ffffffffffffffffffffffffffffffffffffffff909216925082918490811061155457611554611657565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055929091168152600189810190925260409020018190555b866002018054806115cb576115cb611974565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff88168252600189810190915260408220015550505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611716576117166116b5565b5060010190565b60005b83811015611738578181015183820152602001611720565b838111156106b85750506000910152565b6000815180845261176181602086016020860161171d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006060808301818452808751808352608092508286019150828160051b8701016020808b0160005b848110156118be577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808a8503018652815188850173ffffffffffffffffffffffffffffffffffffffff82511686528482015160038110611845577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b808310156118a95783517fffffffff00000000000000000000000000000000000000000000000000000000168252928601926001929092019190860190611867565b509785019795505050908201906001016117bc565b505073ffffffffffffffffffffffffffffffffffffffff8a169088015286810360408801526118ed8189611749565b9a9950505050505050505050565b6000825161190d81846020870161171d565b9190910192915050565b60208152600061192a6020830184611749565b9392505050565b60006bffffffffffffffffffffffff80831681811415611953576119536116b5565b6001019392505050565b60008282101561196f5761196f6116b5565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f6465a26469706673582212202b18a533b03703e1326000cf2f36b1c6ec631cff163a752d939e5ee79ad2cde364736f6c634300080a0033", + "devdoc": { + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_contractOwner": "the owner of the contract. With default DiamondCutFacet, this is the sole address allowed to make further cuts.", + "_diamondCut": "the list of facet to add", + "_initializations": "the list of initialization pair to execute. This allow to setup a contract with multiple level of independent initialization." + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "constructor": { + "notice": "This construct a diamond contract" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file