mirror of
https://github.com/logos-messaging/waku-rlnv1-contract.git
synced 2026-05-21 01:19:31 +00:00
535 lines
169 KiB
JSON
535 lines
169 KiB
JSON
{
|
|
"address": "0x451dE04f6C219EFDE9432a3B34D8eaac54C43589",
|
|
"abi": [
|
|
{
|
|
"inputs": [],
|
|
"name": "IncompatibleStorageIndex",
|
|
"type": "error"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "InvalidMaxMessageLimit",
|
|
"type": "error"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "NoStorageContractAvailable",
|
|
"type": "error"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "address",
|
|
"name": "storageAddress",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "StorageAlreadyExists",
|
|
"type": "error"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "previousAdmin",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "newAdmin",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "AdminChanged",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": true,
|
|
"internalType": "address",
|
|
"name": "beacon",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "BeaconUpgraded",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint8",
|
|
"name": "version",
|
|
"type": "uint8"
|
|
}
|
|
],
|
|
"name": "Initialized",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint16",
|
|
"name": "index",
|
|
"type": "uint16"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "storageAddress",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "NewStorageContract",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": true,
|
|
"internalType": "address",
|
|
"name": "previousOwner",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": true,
|
|
"internalType": "address",
|
|
"name": "newOwner",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "OwnershipTransferred",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": true,
|
|
"internalType": "address",
|
|
"name": "implementation",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "Upgraded",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "forceProgress",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "initialize",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "maxMessageLimit",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "newStorage",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "nextStorageIndex",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint16",
|
|
"name": "",
|
|
"type": "uint16"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "owner",
|
|
"outputs": [
|
|
{
|
|
"internalType": "address",
|
|
"name": "",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "proxiableUUID",
|
|
"outputs": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256[]",
|
|
"name": "commitments",
|
|
"type": "uint256[]"
|
|
},
|
|
{
|
|
"internalType": "uint256[]",
|
|
"name": "limits",
|
|
"type": "uint256[]"
|
|
}
|
|
],
|
|
"name": "register",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint16",
|
|
"name": "storageIndex",
|
|
"type": "uint16"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "idCommitment",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "userMessageLimit",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "register",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint16",
|
|
"name": "storageIndex",
|
|
"type": "uint16"
|
|
},
|
|
{
|
|
"internalType": "uint256[]",
|
|
"name": "commitments",
|
|
"type": "uint256[]"
|
|
},
|
|
{
|
|
"internalType": "uint256[]",
|
|
"name": "limits",
|
|
"type": "uint256[]"
|
|
}
|
|
],
|
|
"name": "register",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "address",
|
|
"name": "storageAddress",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "registerStorage",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "renounceOwnership",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint16",
|
|
"name": "",
|
|
"type": "uint16"
|
|
}
|
|
],
|
|
"name": "storages",
|
|
"outputs": [
|
|
{
|
|
"internalType": "address",
|
|
"name": "",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "address",
|
|
"name": "newOwner",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "transferOwnership",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "address",
|
|
"name": "newImplementation",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "upgradeTo",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "address",
|
|
"name": "newImplementation",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes",
|
|
"name": "data",
|
|
"type": "bytes"
|
|
}
|
|
],
|
|
"name": "upgradeToAndCall",
|
|
"outputs": [],
|
|
"stateMutability": "payable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "usingStorageIndex",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint16",
|
|
"name": "",
|
|
"type": "uint16"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
}
|
|
],
|
|
"transactionHash": "0xefffd4d353924675388ea8ea2798f00c3715642a0ebdef3c3db639c7211fa33f",
|
|
"receipt": {
|
|
"to": null,
|
|
"from": "0x3F47b2a1dF96DE2e198d646b598C37251CCC3b98",
|
|
"contractAddress": "0x451dE04f6C219EFDE9432a3B34D8eaac54C43589",
|
|
"transactionIndex": 31,
|
|
"gasUsed": "3875211",
|
|
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
|
"blockHash": "0xce50327458a4162789ffc1daacb9254756475faccb5fd2ed71d8cdb3984662f0",
|
|
"transactionHash": "0xefffd4d353924675388ea8ea2798f00c3715642a0ebdef3c3db639c7211fa33f",
|
|
"logs": [],
|
|
"blockNumber": 5144395,
|
|
"cumulativeGasUsed": "8460789",
|
|
"status": 1,
|
|
"byzantium": true
|
|
},
|
|
"args": [],
|
|
"numDeployments": 1,
|
|
"solcInputHash": "d2fef1fbb2fedf5bcbd0849b0742e736",
|
|
"metadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"IncompatibleStorageIndex\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMaxMessageLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoStorageContractAvailable\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"storageAddress\",\"type\":\"address\"}],\"name\":\"StorageAlreadyExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"index\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"storageAddress\",\"type\":\"address\"}],\"name\":\"NewStorageContract\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"forceProgress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxMessageLimit\",\"type\":\"uint256\"}],\"name\":\"newStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextStorageIndex\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"commitments\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"limits\",\"type\":\"uint256[]\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"storageIndex\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"idCommitment\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"userMessageLimit\",\"type\":\"uint256\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"storageIndex\",\"type\":\"uint16\"},{\"internalType\":\"uint256[]\",\"name\":\"commitments\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"limits\",\"type\":\"uint256[]\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"storageAddress\",\"type\":\"address\"}],\"name\":\"registerStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"name\":\"storages\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"usingStorageIndex\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/WakuRlnRegistry.sol\":\"WakuRlnRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":rln-contract/=lib/rln-contract/src/\"]},\"sources\":{\"contracts/WakuRln.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.19;\\n\\nimport {RlnBase, DuplicateIdCommitment, FullTree, InvalidIdCommitment} from \\\"rln-contract/RlnBase.sol\\\";\\nimport {Ownable} from \\\"openzeppelin-contracts/contracts/access/Ownable.sol\\\";\\n\\nerror NotImplemented();\\nerror MalformedCommitmentToMessageLimitMap();\\n\\nfunction isValidCommitmentToMessageLimitMap(uint256[] calldata commitments, uint256[] calldata limits)\\n pure\\n returns (bool)\\n{\\n uint256 commitmentsLen = commitments.length;\\n uint256 limitsLen = limits.length;\\n if (commitmentsLen != limitsLen) return false;\\n return true;\\n}\\n\\ncontract WakuRln is Ownable, RlnBase {\\n uint16 public immutable contractIndex;\\n\\n constructor(uint256 _maxMessageLimit, uint16 _contractIndex)\\n Ownable()\\n RlnBase(0, 20, _maxMessageLimit, address(0))\\n {\\n contractIndex = _contractIndex;\\n }\\n\\n modifier onlyValidCommitmentToMessageLimitMap(uint256[] calldata commitments, uint256[] calldata limits) {\\n if (!isValidCommitmentToMessageLimitMap(commitments, limits)) {\\n revert MalformedCommitmentToMessageLimitMap();\\n }\\n _;\\n }\\n\\n /// Registers a member\\n /// @param idCommitment The idCommitment of the member\\n /// @param userMessageLimit The userMessageLimit of the member\\n function _register(uint256 idCommitment, uint256 userMessageLimit) internal {\\n _validateRegistration(idCommitment, userMessageLimit);\\n\\n members[idCommitment] = idCommitmentIndex;\\n indexToCommitment[idCommitmentIndex] = idCommitment;\\n memberExists[idCommitment] = true;\\n userMessageLimits[idCommitment] = userMessageLimit;\\n\\n emit MemberRegistered(idCommitment, userMessageLimit, idCommitmentIndex);\\n idCommitmentIndex += 1;\\n }\\n\\n function register(uint256[] calldata commitments, uint256[] calldata limits)\\n external\\n onlyOwner\\n onlyValidCommitmentToMessageLimitMap(commitments, limits)\\n {\\n uint256 len = commitments.length;\\n for (uint256 i = 0; i < len;) {\\n _register(commitments[i], limits[i]);\\n unchecked {\\n ++i;\\n }\\n }\\n }\\n\\n function register(uint256 idCommitment, uint256 userMessageLimit) external payable override {\\n _register(idCommitment, userMessageLimit);\\n }\\n\\n function slash(uint256 idCommitment, address payable receiver, uint256[8] calldata proof) external pure override {\\n revert NotImplemented();\\n }\\n\\n function _validateRegistration(uint256 idCommitment, uint256 userMessageLimit)\\n internal\\n view\\n override\\n onlyValidUserMessageLimit(userMessageLimit)\\n onlyValidIdCommitment(idCommitment)\\n {\\n if (memberExists[idCommitment] == true) revert DuplicateIdCommitment();\\n if (idCommitmentIndex >= SET_SIZE) revert FullTree();\\n }\\n\\n function _validateSlash(uint256 idCommitment, address payable receiver, uint256[8] calldata proof)\\n internal\\n pure\\n override\\n {\\n revert NotImplemented();\\n }\\n\\n function withdraw() external pure override {\\n revert NotImplemented();\\n }\\n}\\n\",\"keccak256\":\"0x25d1ae31471d20d4c31016dde309d94b62e8df697839dd739fa0349ea8c82681\",\"license\":\"MIT\"},\"contracts/WakuRlnRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.19;\\n\\nimport {WakuRln} from \\\"./WakuRln.sol\\\";\\nimport {UUPSUpgradeable} from \\\"openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport {OwnableUpgradeable} from \\\"openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\\\";\\nimport {ERC1967Proxy} from \\\"openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol\\\";\\n\\nerror StorageAlreadyExists(address storageAddress);\\nerror NoStorageContractAvailable();\\nerror IncompatibleStorage();\\nerror IncompatibleStorageIndex();\\nerror InvalidMaxMessageLimit();\\n\\ncontract WakuRlnRegistry is OwnableUpgradeable, UUPSUpgradeable {\\n uint16 public nextStorageIndex;\\n mapping(uint16 => address) public storages;\\n\\n uint16 public usingStorageIndex = 0;\\n\\n event NewStorageContract(uint16 index, address storageAddress);\\n\\n modifier onlyUsableStorage() {\\n if (usingStorageIndex >= nextStorageIndex) revert NoStorageContractAvailable();\\n _;\\n }\\n\\n function initialize() external initializer {\\n __Ownable_init();\\n }\\n\\n function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}\\n\\n function _insertIntoStorageMap(address storageAddress) internal {\\n storages[nextStorageIndex] = storageAddress;\\n emit NewStorageContract(nextStorageIndex, storageAddress);\\n nextStorageIndex += 1;\\n }\\n\\n function registerStorage(address storageAddress) external onlyOwner {\\n if (storages[nextStorageIndex] != address(0)) revert StorageAlreadyExists(storageAddress);\\n WakuRln wakuRln = WakuRln(storageAddress);\\n if (wakuRln.contractIndex() != nextStorageIndex) revert IncompatibleStorageIndex();\\n _insertIntoStorageMap(storageAddress);\\n }\\n\\n function newStorage(uint256 maxMessageLimit) external onlyOwner {\\n if (maxMessageLimit == 0) revert InvalidMaxMessageLimit();\\n WakuRln newStorageContract = new WakuRln(maxMessageLimit, nextStorageIndex);\\n _insertIntoStorageMap(address(newStorageContract));\\n }\\n\\n function register(uint256[] calldata commitments, uint256[] calldata limits) external onlyUsableStorage {\\n // iteratively check if the storage contract is full, and increment the usingStorageIndex if it is\\n while (true) {\\n try WakuRln(storages[usingStorageIndex]).register(commitments, limits) {\\n break;\\n } catch (bytes memory err) {\\n if (keccak256(err) != keccak256(abi.encodeWithSignature(\\\"FullTree()\\\"))) {\\n assembly {\\n revert(add(32, err), mload(err))\\n }\\n // when there are no further storage contracts available, revert\\n } else if (usingStorageIndex + 1 >= nextStorageIndex) {\\n revert NoStorageContractAvailable();\\n }\\n usingStorageIndex += 1;\\n }\\n }\\n }\\n\\n function register(uint16 storageIndex, uint256[] calldata commitments, uint256[] calldata limits) external {\\n if (storageIndex >= nextStorageIndex) revert NoStorageContractAvailable();\\n WakuRln(storages[storageIndex]).register(commitments, limits);\\n }\\n\\n function register(uint16 storageIndex, uint256 idCommitment, uint256 userMessageLimit) external {\\n if (storageIndex >= nextStorageIndex) revert NoStorageContractAvailable();\\n // optimize the gas used below\\n WakuRln(storages[storageIndex]).register(idCommitment, userMessageLimit);\\n }\\n\\n function forceProgress() external onlyOwner onlyUsableStorage {\\n if (storages[usingStorageIndex + 1] == address(0)) revert NoStorageContractAvailable();\\n usingStorageIndex += 1;\\n }\\n}\\n\",\"keccak256\":\"0xd31d348d0ead922f5ac14b6ace4df28d096a1fec00c6c66f5a2080e817a2d8c3\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal onlyInitializing {\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal onlyInitializing {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```solidity\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n *\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n * constructor.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = !_initializing;\\n require(\\n (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n _initialized = 1;\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: setting the version to 255 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint8 version) {\\n require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n _initializing = true;\\n _;\\n _initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n if (_initialized != type(uint8).max) {\\n _initialized = type(uint8).max;\\n emit Initialized(type(uint8).max);\\n }\\n }\\n\\n /**\\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\\n */\\n function _getInitializedVersion() internal view returns (uint8) {\\n return _initialized;\\n }\\n\\n /**\\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _initializing;\\n }\\n}\\n\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967 {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x3cbef5ebc24b415252e2f8c0c9254555d30d9f085603b4b80d9b5ed20ab87e90\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializing the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0xa2b22da3032e50b55f95ec1d13336102d675f341167aa76db571ef7f8bb7975d\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/IERC1967.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967Upgrade is IERC1967 {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3b21ae06bf5957f73fa16754b0669c77b7abd8ba6c072d35c3281d446fdb86c2\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../ERC1967/ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n _;\\n }\\n\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n return _IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeTo(address newImplementation) public virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeTo} and {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal override onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n}\\n\",\"keccak256\":\"0xc6619957bcc6641fe8984bfaf9ff11a9e4b97d8149c0495f608f9a2416d7c5cf\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\\n * _Available since v4.9 for `string`, `bytes`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n struct StringSlot {\\n string value;\\n }\\n\\n struct BytesSlot {\\n bytes value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\\n */\\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\\n */\\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\\n */\\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\\n */\\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\"},\"lib/rln-contract/src/IVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0 OR MIT\\npragma solidity >=0.8.19;\\n\\ninterface IVerifier {\\n function verifyProof(\\n uint256[2] calldata a,\\n uint256[2][2] calldata b,\\n uint256[2] calldata c,\\n uint256[2] calldata input\\n )\\n external\\n view\\n returns (bool);\\n}\\n\",\"keccak256\":\"0xdff08d48c907dddb248e40d1174aa7a3a169e080cfbd3d04ab3ebae98c165eeb\",\"license\":\"Apache-2.0 OR MIT\"},\"lib/rln-contract/src/RlnBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.19;\\n\\nimport { IVerifier } from \\\"./IVerifier.sol\\\";\\n\\n/// The tree is full\\nerror FullTree();\\n\\n/// Invalid deposit amount\\n/// @param required The required deposit amount\\n/// @param provided The provided deposit amount\\nerror InsufficientDeposit(uint256 required, uint256 provided);\\n\\n/// Member is already registered\\nerror DuplicateIdCommitment();\\n\\n/// Failed validation on registration/slashing\\nerror FailedValidation();\\n\\n/// Invalid idCommitment\\nerror InvalidIdCommitment(uint256 idCommitment);\\n\\n/// Invalid userMessageLimit\\nerror InvalidUserMessageLimit(uint256 messageLimit);\\n\\n/// Invalid receiver address, when the receiver is the contract itself or 0x0\\nerror InvalidReceiverAddress(address to);\\n\\n/// Member is not registered\\nerror MemberNotRegistered(uint256 idCommitment);\\n\\n/// Member has no stake\\nerror MemberHasNoStake(uint256 idCommitment);\\n\\n/// User has insufficient balance to withdraw\\nerror InsufficientWithdrawalBalance();\\n\\n/// Contract has insufficient balance to return\\nerror InsufficientContractBalance();\\n\\n/// Invalid proof\\nerror InvalidProof();\\n\\n/// Invalid pagination query\\nerror InvalidPaginationQuery(uint256 startIndex, uint256 endIndex);\\n\\nabstract contract RlnBase {\\n /// @notice The Field\\n uint256 public constant Q =\\n 21_888_242_871_839_275_222_246_405_745_257_275_088_548_364_400_416_034_343_698_204_186_575_808_495_617;\\n\\n /// @notice The max message limit per epoch\\n uint256 public immutable MAX_MESSAGE_LIMIT;\\n\\n /// @notice The deposit amount required to register as a member\\n uint256 public immutable MEMBERSHIP_DEPOSIT;\\n\\n /// @notice The depth of the merkle tree\\n uint256 public immutable DEPTH;\\n\\n /// @notice The size of the merkle tree, i.e 2^depth\\n uint256 public immutable SET_SIZE;\\n\\n /// @notice The index of the next member to be registered\\n uint256 public idCommitmentIndex = 0;\\n\\n /// @notice The amount of eth staked by each member\\n /// maps from idCommitment to the amount staked\\n mapping(uint256 => uint256) public stakedAmounts;\\n\\n /// @notice The membership status of each member\\n /// maps from idCommitment to their index in the set\\n mapping(uint256 => uint256) public members;\\n\\n /// @notice the user message limit of each member\\n /// maps from idCommitment to their user message limit\\n mapping(uint256 => uint256) public userMessageLimits;\\n\\n /// @notice the index to commitment mapping\\n mapping(uint256 => uint256) public indexToCommitment;\\n\\n /// @notice The membership status of each member\\n mapping(uint256 => bool) public memberExists;\\n\\n /// @notice The balance of each user that can be withdrawn\\n mapping(address => uint256) public withdrawalBalance;\\n\\n /// @notice The groth16 verifier contract\\n IVerifier public immutable verifier;\\n\\n /// @notice the deployed block number\\n uint32 public immutable deployedBlockNumber;\\n\\n /// Emitted when a new member is added to the set\\n /// @param idCommitment The idCommitment of the member\\n /// @param userMessageLimit the user message limit of the member\\n /// @param index The index of the member in the set\\n event MemberRegistered(uint256 idCommitment, uint256 userMessageLimit, uint256 index);\\n\\n /// Emitted when a member is removed from the set\\n /// @param idCommitment The idCommitment of the member\\n /// @param index The index of the member in the set\\n event MemberWithdrawn(uint256 idCommitment, uint256 index);\\n\\n modifier onlyValidIdCommitment(uint256 idCommitment) {\\n if (!isValidCommitment(idCommitment)) revert InvalidIdCommitment(idCommitment);\\n _;\\n }\\n\\n modifier onlyValidUserMessageLimit(uint256 messageLimit) {\\n if (messageLimit > MAX_MESSAGE_LIMIT) revert InvalidUserMessageLimit(messageLimit);\\n if (messageLimit == 0) revert InvalidUserMessageLimit(messageLimit);\\n _;\\n }\\n\\n constructor(uint256 membershipDeposit, uint256 depth, uint256 maxMessageLimit, address _verifier) {\\n MEMBERSHIP_DEPOSIT = membershipDeposit;\\n MAX_MESSAGE_LIMIT = maxMessageLimit;\\n DEPTH = depth;\\n SET_SIZE = 1 << depth;\\n verifier = IVerifier(_verifier);\\n deployedBlockNumber = uint32(block.number);\\n }\\n\\n /// Returns the deposit amount required to register as a member\\n /// @param userMessageLimit The message limit of the member\\n /// TODO: update this function as per tokenomics design\\n function getDepositAmount(uint256 userMessageLimit) public view returns (uint256) {\\n return userMessageLimit * MEMBERSHIP_DEPOSIT;\\n }\\n\\n /// Allows a user to register as a member\\n /// @param idCommitment The idCommitment of the member\\n /// @param userMessageLimit The message limit of the member\\n function register(\\n uint256 idCommitment,\\n uint256 userMessageLimit\\n )\\n external\\n payable\\n virtual\\n onlyValidIdCommitment(idCommitment)\\n onlyValidUserMessageLimit(userMessageLimit)\\n {\\n uint256 requiredDeposit = getDepositAmount(userMessageLimit);\\n if (msg.value != requiredDeposit) {\\n revert InsufficientDeposit(MEMBERSHIP_DEPOSIT, msg.value);\\n }\\n _validateRegistration(idCommitment, userMessageLimit);\\n _register(idCommitment, userMessageLimit, msg.value);\\n }\\n\\n /// Registers a member\\n /// @param idCommitment The idCommitment of the member\\n /// @param userMessageLimit The message limit of the member\\n /// @param stake The amount of eth staked by the member\\n function _register(uint256 idCommitment, uint256 userMessageLimit, uint256 stake) internal virtual {\\n if (memberExists[idCommitment]) revert DuplicateIdCommitment();\\n if (idCommitmentIndex >= SET_SIZE) revert FullTree();\\n\\n members[idCommitment] = idCommitmentIndex;\\n indexToCommitment[idCommitmentIndex] = idCommitment;\\n memberExists[idCommitment] = true;\\n stakedAmounts[idCommitment] = stake;\\n userMessageLimits[idCommitment] = userMessageLimit;\\n\\n emit MemberRegistered(idCommitment, userMessageLimit, idCommitmentIndex);\\n idCommitmentIndex += 1;\\n }\\n\\n /// @dev Inheriting contracts MUST override this function\\n function _validateRegistration(uint256 idCommitment, uint256 userMessageLimit) internal view virtual;\\n\\n /// @dev Allows a user to slash a member\\n /// @param idCommitment The idCommitment of the member\\n function slash(\\n uint256 idCommitment,\\n address payable receiver,\\n uint256[8] calldata proof\\n )\\n external\\n virtual\\n onlyValidIdCommitment(idCommitment)\\n {\\n _validateSlash(idCommitment, receiver, proof);\\n _slash(idCommitment, receiver, proof);\\n }\\n\\n /// @dev Slashes a member by removing them from the set, and adding their\\n /// stake to the receiver's available withdrawal balance\\n /// @param idCommitment The idCommitment of the member\\n /// @param receiver The address to receive the funds\\n function _slash(uint256 idCommitment, address payable receiver, uint256[8] calldata proof) internal virtual {\\n if (receiver == address(this) || receiver == address(0)) {\\n revert InvalidReceiverAddress(receiver);\\n }\\n\\n uint256 userMessageLimit = userMessageLimits[idCommitment];\\n if (memberExists[idCommitment] == false) revert MemberNotRegistered(idCommitment);\\n // check if member is registered\\n if (stakedAmounts[idCommitment] == 0) {\\n revert MemberHasNoStake(idCommitment);\\n }\\n\\n if (!_verifyProof(idCommitment, receiver, proof)) {\\n revert InvalidProof();\\n }\\n\\n uint256 amountToTransfer = stakedAmounts[idCommitment];\\n\\n // delete member\\n uint256 index = members[idCommitment];\\n members[idCommitment] = 0;\\n indexToCommitment[index] = 0;\\n memberExists[idCommitment] = false;\\n stakedAmounts[idCommitment] = 0;\\n userMessageLimits[idCommitment] = 0;\\n\\n // refund deposit\\n withdrawalBalance[receiver] += amountToTransfer;\\n\\n emit MemberWithdrawn(idCommitment, index);\\n }\\n\\n function _validateSlash(\\n uint256 idCommitment,\\n address payable receiver,\\n uint256[8] calldata proof\\n )\\n internal\\n view\\n virtual;\\n\\n /// Allows a user to withdraw funds allocated to them upon slashing a member\\n function withdraw() external virtual {\\n uint256 amount = withdrawalBalance[msg.sender];\\n\\n if (amount == 0) revert InsufficientWithdrawalBalance();\\n if (amount > address(this).balance) {\\n revert InsufficientContractBalance();\\n }\\n\\n withdrawalBalance[msg.sender] = 0;\\n\\n payable(msg.sender).transfer(amount);\\n }\\n\\n function isValidCommitment(uint256 idCommitment) public pure returns (bool) {\\n return idCommitment != 0 && idCommitment < Q;\\n }\\n\\n /// @dev Groth16 proof verification\\n function _verifyProof(\\n uint256 idCommitment,\\n address receiver,\\n uint256[8] calldata proof\\n )\\n internal\\n view\\n virtual\\n returns (bool)\\n {\\n return verifier.verifyProof(\\n [proof[0], proof[1]],\\n [[proof[2], proof[3]], [proof[4], proof[5]]],\\n [proof[6], proof[7]],\\n [idCommitment, uint256(uint160(receiver))]\\n );\\n }\\n\\n function getCommitments(uint256 startIndex, uint256 endIndex) public view returns (uint256[] memory) {\\n if (startIndex >= endIndex) revert InvalidPaginationQuery(startIndex, endIndex);\\n if (endIndex > idCommitmentIndex) revert InvalidPaginationQuery(startIndex, endIndex);\\n\\n uint256[] memory commitments = new uint256[](endIndex - startIndex);\\n for (uint256 i = startIndex; i < endIndex; i++) {\\n commitments[i - startIndex] = indexToCommitment[i];\\n }\\n return commitments;\\n }\\n}\\n\",\"keccak256\":\"0x4203a69fbfbdb33e2b28efb810aa7d028f376f6e86cc2d18b77095d316f76eec\",\"license\":\"MIT\"}},\"version\":1}",
|
|
"bytecode": "0x60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff168152506000606760006101000a81548161ffff021916908361ffff16021790555034801561006157600080fd5b50608051614598610099600039600081816106870152818161071801528181610922015281816109b30152610a6c01526145986000f3fe6080604052600436106200010a5760003560e01c80638da5cb5b1162000097578063f184ef4c1162000061578063f184ef4c14620002f3578063f2fde38b1462000323578063f55421471462000351578063fc6ed4641462000395576200010a565b80638da5cb5b146200024b578063cf616374146200027b578063d44fda1f14620002ab578063ef653d5e14620002c5576200010a565b806352d1902d11620000d957806352d1902d14620001b95780635a244efd14620001e9578063715018a614620002175780638129fc1c1462000231576200010a565b80632de999bf146200010f5780633659cfe6146200013d57806339c0364b146200016b5780634f1ef2861462000199575b600080fd5b3480156200011c57600080fd5b506200013b600480360381019062000135919062001afa565b620003c3565b005b3480156200014a57600080fd5b5062000169600480360381019062000163919062001bed565b62000685565b005b3480156200017857600080fd5b5062000197600480360381019062000191919062001c99565b6200081d565b005b620001b76004803603810190620001b1919062001e52565b62000920565b005b348015620001c657600080fd5b50620001d162000a68565b604051620001e0919062001ed3565b60405180910390f35b348015620001f657600080fd5b506200021560048036038101906200020f919062001ef0565b62000b24565b005b3480156200022457600080fd5b506200022f62000bc7565b005b3480156200023e57600080fd5b506200024962000bdf565b005b3480156200025857600080fd5b506200026362000d2b565b60405162000272919062001f33565b60405180910390f35b3480156200028857600080fd5b506200029362000d55565b604051620002a2919062001f61565b60405180910390f35b348015620002b857600080fd5b50620002c362000d69565b005b348015620002d257600080fd5b50620002f16004803603810190620002eb919062001bed565b62000ed3565b005b3480156200030057600080fd5b506200030b62001073565b6040516200031a919062001f61565b60405180910390f35b3480156200033057600080fd5b506200034f600480360381019062000349919062001bed565b62001087565b005b3480156200035e57600080fd5b506200037d600480360381019062000377919062001f7e565b62001111565b6040516200038c919062001f33565b60405180910390f35b348015620003a257600080fd5b50620003c16004803603810190620003bb919062001fb0565b62001144565b005b606560009054906101000a900461ffff1661ffff16606760009054906101000a900461ffff1661ffff161062000425576040517fd23276a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6001156200067f5760666000606760009054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632de999bf858585856040518563ffffffff1660e01b8152600401620004ba9493929190620020d6565b600060405180830381600087803b158015620004d557600080fd5b505af1925050508015620004e7575060015b62000673573d80600081146200051a576040519150601f19603f3d011682016040523d82523d6000602084013e6200051f565b606091505b506040516024016040516020818303038152906040527f57f69531000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505080519060200120818051906020012014620005c057805181602001fd5b606560009054906101000a900461ffff1661ffff166001606760009054906101000a900461ffff16620005f4919062002144565b61ffff161062000630576040517fd23276a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001606760008282829054906101000a900461ffff1662000652919062002144565b92506101000a81548161ffff021916908361ffff1602179055505062000679565b6200067f565b62000426565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff160362000716576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200070d9062002208565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16620007576200124d565b73ffffffffffffffffffffffffffffffffffffffff1614620007b0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007a790620022a0565b60405180910390fd5b620007bb81620012a6565b6200081a81600067ffffffffffffffff811115620007de57620007dd62001d0b565b5b6040519080825280601f01601f191660200182016040528015620008115781602001600182028036833780820191505090505b506000620012b3565b50565b606560009054906101000a900461ffff1661ffff168361ffff16106200086f576040517fd23276a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606660008461ffff1661ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d66d6c1083836040518363ffffffff1660e01b8152600401620008e7929190620022d3565b600060405180830381600087803b1580156200090257600080fd5b505af115801562000917573d6000803e3d6000fd5b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603620009b1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009a89062002208565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16620009f26200124d565b73ffffffffffffffffffffffffffffffffffffffff161462000a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a4290620022a0565b60405180910390fd5b62000a5682620012a6565b62000a6482826001620012b3565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161462000afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000af29062002376565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905090565b62000b2e62001432565b6000810362000b69576040517fe671aff300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081606560009054906101000a900461ffff1660405162000b8b9062001a6a565b62000b9892919062002398565b604051809103906000f08015801562000bb5573d6000803e3d6000fd5b50905062000bc381620014b7565b5050565b62000bd162001432565b62000bdd6000620015ab565b565b60008060019054906101000a900460ff1615905080801562000c115750600160008054906101000a900460ff1660ff16105b8062000c42575062000c233062001671565b15801562000c415750600160008054906101000a900460ff1660ff16145b5b62000c84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c7b906200243b565b60405180910390fd5b60016000806101000a81548160ff021916908360ff160217905550801562000cc2576001600060016101000a81548160ff0219169083151502179055505b62000ccc62001694565b801562000d285760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405162000d1f9190620024b7565b60405180910390a15b50565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606760009054906101000a900461ffff1681565b62000d7362001432565b606560009054906101000a900461ffff1661ffff16606760009054906101000a900461ffff1661ffff161062000dd5576040517fd23276a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16606660006001606760009054906101000a900461ffff1662000e10919062002144565b61ffff1661ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160362000e95576040517fd23276a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001606760008282829054906101000a900461ffff1662000eb7919062002144565b92506101000a81548161ffff021916908361ffff160217905550565b62000edd62001432565b600073ffffffffffffffffffffffffffffffffffffffff1660666000606560009054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000f9c57806040517f9cfabd1600000000000000000000000000000000000000000000000000000000815260040162000f93919062001f33565b60405180910390fd5b6000819050606560009054906101000a900461ffff1661ffff168173ffffffffffffffffffffffffffffffffffffffff166328b070e06040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001002573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620010289190620024eb565b61ffff161462001064576040517fb893b72300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200106f82620014b7565b5050565b606560009054906101000a900461ffff1681565b6200109162001432565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362001103576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620010fa9062002593565b60405180910390fd5b6200110e81620015ab565b50565b60666020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606560009054906101000a900461ffff1661ffff168561ffff161062001196576040517fd23276a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606660008661ffff1661ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632de999bf858585856040518563ffffffff1660e01b8152600401620012129493929190620020d6565b600060405180830381600087803b1580156200122d57600080fd5b505af115801562001242573d6000803e3d6000fd5b505050505050505050565b60006200127d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620016f2565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620012b062001432565b50565b620012e17f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd914360001b620016fc565b60000160009054906101000a900460ff16156200130957620013038362001706565b6200142d565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156200137457506040513d601f19601f82011682018060405250810190620013719190620025e6565b60015b620013b6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013ad906200268e565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b81146200141e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620014159062002726565b60405180910390fd5b506200142c838383620017c6565b5b505050565b6200143c620017f8565b73ffffffffffffffffffffffffffffffffffffffff166200145c62000d2b565b73ffffffffffffffffffffffffffffffffffffffff1614620014b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620014ac9062002798565b60405180910390fd5b565b8060666000606560009054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fcf6a3b406170499209d0fcf152a1605c7c5a5c99c855e2bb803433fc960718eb606560009054906101000a900461ffff168260405162001564929190620027ba565b60405180910390a16001606560008282829054906101000a900461ffff166200158e919062002144565b92506101000a81548161ffff021916908361ffff16021790555050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16620016e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620016dd906200285d565b60405180910390fd5b620016f062001800565b565b6000819050919050565b6000819050919050565b620017118162001868565b62001753576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200174a90620028f5565b60405180910390fd5b80620017827f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620016f2565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b620017d1836200188b565b600082511180620017df5750805b15620017f357620017f18383620018dc565b505b505050565b600033905090565b600060019054906101000a900460ff1662001852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001849906200285d565b60405180910390fd5b6200186662001860620017f8565b620015ab565b565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b620018968162001706565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b60606200190483836040518060600160405280602781526020016200453c602791396200190c565b905092915050565b60606000808573ffffffffffffffffffffffffffffffffffffffff168560405162001938919062002990565b600060405180830381855af49150503d806000811462001975576040519150601f19603f3d011682016040523d82523d6000602084013e6200197a565b606091505b50915091506200198d8683838762001998565b925050509392505050565b6060831562001a02576000835103620019f957620019b68562001868565b620019f8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620019ef90620029f9565b60405180910390fd5b5b82905062001a0f565b62001a0e838362001a17565b5b949350505050565b60008251111562001a2b5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001a61919062002a67565b60405180910390fd5b611ab08062002a8c83390190565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011262001ab45762001ab362001a8c565b5b8235905067ffffffffffffffff81111562001ad45762001ad362001a91565b5b60208301915083602082028301111562001af35762001af262001a96565b5b9250929050565b6000806000806040858703121562001b175762001b1662001a82565b5b600085013567ffffffffffffffff81111562001b385762001b3762001a87565b5b62001b468782880162001a9b565b9450945050602085013567ffffffffffffffff81111562001b6c5762001b6b62001a87565b5b62001b7a8782880162001a9b565b925092505092959194509250565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062001bb58262001b88565b9050919050565b62001bc78162001ba8565b811462001bd357600080fd5b50565b60008135905062001be78162001bbc565b92915050565b60006020828403121562001c065762001c0562001a82565b5b600062001c168482850162001bd6565b91505092915050565b600061ffff82169050919050565b62001c388162001c1f565b811462001c4457600080fd5b50565b60008135905062001c588162001c2d565b92915050565b6000819050919050565b62001c738162001c5e565b811462001c7f57600080fd5b50565b60008135905062001c938162001c68565b92915050565b60008060006060848603121562001cb55762001cb462001a82565b5b600062001cc58682870162001c47565b935050602062001cd88682870162001c82565b925050604062001ceb8682870162001c82565b9150509250925092565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62001d458262001cfa565b810181811067ffffffffffffffff8211171562001d675762001d6662001d0b565b5b80604052505050565b600062001d7c62001a78565b905062001d8a828262001d3a565b919050565b600067ffffffffffffffff82111562001dad5762001dac62001d0b565b5b62001db88262001cfa565b9050602081019050919050565b82818337600083830152505050565b600062001deb62001de58462001d8f565b62001d70565b90508281526020810184848401111562001e0a5762001e0962001cf5565b5b62001e1784828562001dc5565b509392505050565b600082601f83011262001e375762001e3662001a8c565b5b813562001e4984826020860162001dd4565b91505092915050565b6000806040838503121562001e6c5762001e6b62001a82565b5b600062001e7c8582860162001bd6565b925050602083013567ffffffffffffffff81111562001ea05762001e9f62001a87565b5b62001eae8582860162001e1f565b9150509250929050565b6000819050919050565b62001ecd8162001eb8565b82525050565b600060208201905062001eea600083018462001ec2565b92915050565b60006020828403121562001f095762001f0862001a82565b5b600062001f198482850162001c82565b91505092915050565b62001f2d8162001ba8565b82525050565b600060208201905062001f4a600083018462001f22565b92915050565b62001f5b8162001c1f565b82525050565b600060208201905062001f78600083018462001f50565b92915050565b60006020828403121562001f975762001f9662001a82565b5b600062001fa78482850162001c47565b91505092915050565b60008060008060006060868803121562001fcf5762001fce62001a82565b5b600062001fdf8882890162001c47565b955050602086013567ffffffffffffffff81111562002003576200200262001a87565b5b620020118882890162001a9b565b9450945050604086013567ffffffffffffffff81111562002037576200203662001a87565b5b620020458882890162001a9b565b92509250509295509295909350565b600082825260208201905092915050565b600080fd5b82818337505050565b600062002081838562002054565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115620020b757620020b662002065565b5b602083029250620020ca8385846200206a565b82840190509392505050565b60006040820190508181036000830152620020f381868862002073565b905081810360208301526200210a81848662002073565b905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620021518262001c1f565b91506200215e8362001c1f565b9250828201905061ffff8111156200217b576200217a62002115565b5b92915050565b600082825260208201905092915050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f64656c656761746563616c6c0000000000000000000000000000000000000000602082015250565b6000620021f0602c8362002181565b9150620021fd8262002192565b604082019050919050565b600060208201905081810360008301526200222381620021e1565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f6163746976652070726f78790000000000000000000000000000000000000000602082015250565b600062002288602c8362002181565b915062002295826200222a565b604082019050919050565b60006020820190508181036000830152620022bb8162002279565b9050919050565b620022cd8162001c5e565b82525050565b6000604082019050620022ea6000830185620022c2565b620022f96020830184620022c2565b9392505050565b7f555550535570677261646561626c653a206d757374206e6f742062652063616c60008201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000602082015250565b60006200235e60388362002181565b91506200236b8262002300565b604082019050919050565b6000602082019050818103600083015262002391816200234f565b9050919050565b6000604082019050620023af6000830185620022c2565b620023be602083018462001f50565b9392505050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b600062002423602e8362002181565b91506200243082620023c5565b604082019050919050565b60006020820190508181036000830152620024568162002414565b9050919050565b6000819050919050565b600060ff82169050919050565b6000819050919050565b60006200249f6200249962002493846200245d565b62002474565b62002467565b9050919050565b620024b1816200247e565b82525050565b6000602082019050620024ce6000830184620024a6565b92915050565b600081519050620024e58162001c2d565b92915050565b60006020828403121562002504576200250362001a82565b5b60006200251484828501620024d4565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006200257b60268362002181565b915062002588826200251d565b604082019050919050565b60006020820190508181036000830152620025ae816200256c565b9050919050565b620025c08162001eb8565b8114620025cc57600080fd5b50565b600081519050620025e081620025b5565b92915050565b600060208284031215620025ff57620025fe62001a82565b5b60006200260f84828501620025cf565b91505092915050565b7f45524331393637557067726164653a206e657720696d706c656d656e7461746960008201527f6f6e206973206e6f742055555053000000000000000000000000000000000000602082015250565b600062002676602e8362002181565b9150620026838262002618565b604082019050919050565b60006020820190508181036000830152620026a98162002667565b9050919050565b7f45524331393637557067726164653a20756e737570706f727465642070726f7860008201527f6961626c65555549440000000000000000000000000000000000000000000000602082015250565b60006200270e60298362002181565b91506200271b82620026b0565b604082019050919050565b600060208201905081810360008301526200274181620026ff565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200278060208362002181565b91506200278d8262002748565b602082019050919050565b60006020820190508181036000830152620027b38162002771565b9050919050565b6000604082019050620027d1600083018562001f50565b620027e0602083018462001f22565b9392505050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b600062002845602b8362002181565b91506200285282620027e7565b604082019050919050565b60006020820190508181036000830152620028788162002836565b9050919050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b6000620028dd602d8362002181565b9150620028ea826200287f565b604082019050919050565b600060208201905081810360008301526200291081620028ce565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156200294d57808201518184015260208101905062002930565b60008484015250505050565b6000620029668262002917565b62002972818562002922565b9350620029848185602086016200292d565b80840191505092915050565b60006200299e828462002959565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000620029e1601d8362002181565b9150620029ee82620029a9565b602082019050919050565b6000602082019050818103600083015262002a1481620029d2565b9050919050565b600081519050919050565b600062002a338262002a1b565b62002a3f818562002181565b935062002a518185602086016200292d565b62002a5c8162001cfa565b840191505092915050565b6000602082019050818103600083015262002a83818462002a26565b90509291505056fe61016060405260006001553480156200001757600080fd5b5060405162001ab038038062001ab083398181016040528101906200003d91906200023a565b600060148360006200006462000058620000ef60201b60201c565b620000f760201b60201c565b8360a0818152505081608081815250508260c08181525050826001901b60e081815250508073ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff16815250504363ffffffff166101208163ffffffff1681525050505050508061ffff166101408161ffff1681525050505062000281565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b6000819050919050565b620001d581620001c0565b8114620001e157600080fd5b50565b600081519050620001f581620001ca565b92915050565b600061ffff82169050919050565b6200021481620001fb565b81146200022057600080fd5b50565b600081519050620002348162000209565b92915050565b60008060408385031215620002545762000253620001bb565b5b60006200026485828601620001e4565b9250506020620002778582860162000223565b9150509250929050565b60805160a05160c05160e0516101005161012051610140516117bf620002f16000396000610661015260006107c401526000610685015260008181610a6c0152610f1401526000610a1201526000818161075f0152610ac20152600081816106050152610dc201526117bf6000f3fe6080604052600436106101665760003560e01c80638be9b119116100d1578063bc4991281161008a578063d66d6c1011610064578063d66d6c1014610568578063e493ef8c14610584578063f220b9ec146105af578063f2fde38b146105da57610166565b8063bc499128146104c3578063c5b208ff14610500578063d0383d681461053d57610166565b80638be9b1191461039f5780638da5cb5b146103c85780639056a9bf146103f3578063933ebfdd1461043057806398366e351461046d578063ae74552a1461049857610166565b80633ccfd60b116101235780633ccfd60b1461028f5780634add651e146102a65780635daf08ca146102d15780636bdcc8ab1461030e578063715018a61461034b5780637671ac051461036257610166565b806309aeb04c1461016b57806322d9730c1461019657806328b070e0146101d35780632b7ac3f3146101fe5780632de999bf14610229578063378de45b14610252575b600080fd5b34801561017757600080fd5b50610180610603565b60405161018d9190610f8c565b60405180910390f35b3480156101a257600080fd5b506101bd60048036038101906101b89190610fdd565b610627565b6040516101ca9190611025565b60405180910390f35b3480156101df57600080fd5b506101e861065f565b6040516101f5919061105d565b60405180910390f35b34801561020a57600080fd5b50610213610683565b60405161022091906110f7565b60405180910390f35b34801561023557600080fd5b50610250600480360381019061024b9190611177565b6106a7565b005b34801561025e57600080fd5b5061027960048036038101906102749190610fdd565b61075b565b6040516102869190610f8c565b60405180910390f35b34801561029b57600080fd5b506102a4610790565b005b3480156102b257600080fd5b506102bb6107c2565b6040516102c89190611217565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f39190610fdd565b6107e6565b6040516103059190610f8c565b60405180910390f35b34801561031a57600080fd5b5061033560048036038101906103309190610fdd565b6107fe565b6040516103429190611025565b60405180910390f35b34801561035757600080fd5b5061036061081e565b005b34801561036e57600080fd5b5061038960048036038101906103849190610fdd565b610832565b6040516103969190610f8c565b60405180910390f35b3480156103ab57600080fd5b506103c660048036038101906103c19190611292565b61084a565b005b3480156103d457600080fd5b506103dd61087c565b6040516103ea9190611307565b60405180910390f35b3480156103ff57600080fd5b5061041a60048036038101906104159190610fdd565b6108a5565b6040516104279190610f8c565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190611322565b6108bd565b6040516104649190611420565b60405180910390f35b34801561047957600080fd5b50610482610a10565b60405161048f9190610f8c565b60405180910390f35b3480156104a457600080fd5b506104ad610a34565b6040516104ba9190610f8c565b60405180910390f35b3480156104cf57600080fd5b506104ea60048036038101906104e59190610fdd565b610a3a565b6040516104f79190610f8c565b60405180910390f35b34801561050c57600080fd5b506105276004803603810190610522919061146e565b610a52565b6040516105349190610f8c565b60405180910390f35b34801561054957600080fd5b50610552610a6a565b60405161055f9190610f8c565b60405180910390f35b610582600480360381019061057d9190611322565b610a8e565b005b34801561059057600080fd5b50610599610a9c565b6040516105a69190610f8c565b60405180910390f35b3480156105bb57600080fd5b506105c4610ac0565b6040516105d19190610f8c565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc919061146e565b610ae4565b005b7f000000000000000000000000000000000000000000000000000000000000000081565b600080821415801561065857507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182105b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6106af610b67565b838383836106bf84848484610be5565b6106f5576040517fb750624800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088889050905060005b8181101561074f576107448a8a8381811061071e5761071d61149b565b5b905060200201358989848181106107385761073761149b565b5b90506020020135610c17565b806001019050610700565b50505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000008261078991906114f9565b9050919050565b6040517fd623472500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b60036020528060005260406000206000915090505481565b60066020528060005260406000206000915054906101000a900460ff1681565b610826610b67565b6108306000610cf3565b565b60056020528060005260406000206000915090505481565b6040517fd623472500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60046020528060005260406000206000915090505481565b60608183106109055782826040517f9ffcd53d0000000000000000000000000000000000000000000000000000000081526004016108fc92919061153b565b60405180910390fd5b60015482111561094e5782826040517f9ffcd53d00000000000000000000000000000000000000000000000000000000815260040161094592919061153b565b60405180910390fd5b6000838361095c9190611564565b67ffffffffffffffff81111561097557610974611598565b5b6040519080825280602002602001820160405280156109a35781602001602082028036833780820191505090505b50905060008490505b83811015610a055760056000828152602001908152602001600020548286836109d59190611564565b815181106109e6576109e561149b565b5b60200260200101818152505080806109fd906115c7565b9150506109ac565b508091505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b60026020528060005260406000206000915090505481565b60076020528060005260406000206000915090505481565b7f000000000000000000000000000000000000000000000000000000000000000081565b610a988282610c17565b5050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181565b7f000000000000000000000000000000000000000000000000000000000000000081565b610aec610b67565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5290611692565b60405180910390fd5b610b6481610cf3565b50565b610b6f610db7565b73ffffffffffffffffffffffffffffffffffffffff16610b8d61087c565b73ffffffffffffffffffffffffffffffffffffffff1614610be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bda906116fe565b60405180910390fd5b565b6000808585905090506000848490509050808214610c0857600092505050610c0f565b6001925050505b949350505050565b610c218282610dbf565b6001546003600084815260200190815260200160002081905550816005600060015481526020019081526020016000208190555060016006600084815260200190815260200160002060006101000a81548160ff0219169083151502179055508060046000848152602001908152602001600020819055507fff42916a89d1f5125f7f47168ee59c2b3fc9246ad1b229082ee85b69d001b5d78282600154604051610cce9392919061171e565b60405180910390a16001806000828254610ce89190611755565b925050819055505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b807f0000000000000000000000000000000000000000000000000000000000000000811115610e2557806040517f13a5e2ee000000000000000000000000000000000000000000000000000000008152600401610e1c9190610f8c565b60405180910390fd5b60008103610e6a57806040517f13a5e2ee000000000000000000000000000000000000000000000000000000008152600401610e619190610f8c565b60405180910390fd5b82610e7481610627565b610eb557806040517f7f3e75af000000000000000000000000000000000000000000000000000000008152600401610eac9190610f8c565b60405180910390fd5b600115156006600086815260200190815260200160002060009054906101000a900460ff16151503610f12576040517e0a60f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060015410610f6d576040517f57f6953100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000819050919050565b610f8681610f73565b82525050565b6000602082019050610fa16000830184610f7d565b92915050565b600080fd5b600080fd5b610fba81610f73565b8114610fc557600080fd5b50565b600081359050610fd781610fb1565b92915050565b600060208284031215610ff357610ff2610fa7565b5b600061100184828501610fc8565b91505092915050565b60008115159050919050565b61101f8161100a565b82525050565b600060208201905061103a6000830184611016565b92915050565b600061ffff82169050919050565b61105781611040565b82525050565b6000602082019050611072600083018461104e565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006110bd6110b86110b384611078565b611098565b611078565b9050919050565b60006110cf826110a2565b9050919050565b60006110e1826110c4565b9050919050565b6110f1816110d6565b82525050565b600060208201905061110c60008301846110e8565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261113757611136611112565b5b8235905067ffffffffffffffff81111561115457611153611117565b5b6020830191508360208202830111156111705761116f61111c565b5b9250929050565b6000806000806040858703121561119157611190610fa7565b5b600085013567ffffffffffffffff8111156111af576111ae610fac565b5b6111bb87828801611121565b9450945050602085013567ffffffffffffffff8111156111de576111dd610fac565b5b6111ea87828801611121565b925092505092959194509250565b600063ffffffff82169050919050565b611211816111f8565b82525050565b600060208201905061122c6000830184611208565b92915050565b600061123d82611078565b9050919050565b61124d81611232565b811461125857600080fd5b50565b60008135905061126a81611244565b92915050565b60008190508260206008028201111561128c5761128b61111c565b5b92915050565b600080600061014084860312156112ac576112ab610fa7565b5b60006112ba86828701610fc8565b93505060206112cb8682870161125b565b92505060406112dc86828701611270565b9150509250925092565b60006112f182611078565b9050919050565b611301816112e6565b82525050565b600060208201905061131c60008301846112f8565b92915050565b6000806040838503121561133957611338610fa7565b5b600061134785828601610fc8565b925050602061135885828601610fc8565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61139781610f73565b82525050565b60006113a9838361138e565b60208301905092915050565b6000602082019050919050565b60006113cd82611362565b6113d7818561136d565b93506113e28361137e565b8060005b838110156114135781516113fa888261139d565b9750611405836113b5565b9250506001810190506113e6565b5085935050505092915050565b6000602082019050818103600083015261143a81846113c2565b905092915050565b61144b816112e6565b811461145657600080fd5b50565b60008135905061146881611442565b92915050565b60006020828403121561148457611483610fa7565b5b600061149284828501611459565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061150482610f73565b915061150f83610f73565b925082820261151d81610f73565b91508282048414831517611534576115336114ca565b5b5092915050565b60006040820190506115506000830185610f7d565b61155d6020830184610f7d565b9392505050565b600061156f82610f73565b915061157a83610f73565b9250828203905081811115611592576115916114ca565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006115d282610f73565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611604576116036114ca565b5b600182019050919050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061167c60268361160f565b915061168782611620565b604082019050919050565b600060208201905081810360008301526116ab8161166f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006116e860208361160f565b91506116f3826116b2565b602082019050919050565b60006020820190508181036000830152611717816116db565b9050919050565b60006060820190506117336000830186610f7d565b6117406020830185610f7d565b61174d6040830184610f7d565b949350505050565b600061176082610f73565b915061176b83610f73565b9250828201905080821115611783576117826114ca565b5b9291505056fea2646970667358221220f6c3084e40c3d832e80d8784a217128c00d11febcddb3c95a294a3dda6d98fcc64736f6c63430008130033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204b81af5902b9bb5e9047b4240454a3efa2d73ee95ad9c862a38fbd4c9e43533964736f6c63430008130033",
|
|
"deployedBytecode": "0x6080604052600436106200010a5760003560e01c80638da5cb5b1162000097578063f184ef4c1162000061578063f184ef4c14620002f3578063f2fde38b1462000323578063f55421471462000351578063fc6ed4641462000395576200010a565b80638da5cb5b146200024b578063cf616374146200027b578063d44fda1f14620002ab578063ef653d5e14620002c5576200010a565b806352d1902d11620000d957806352d1902d14620001b95780635a244efd14620001e9578063715018a614620002175780638129fc1c1462000231576200010a565b80632de999bf146200010f5780633659cfe6146200013d57806339c0364b146200016b5780634f1ef2861462000199575b600080fd5b3480156200011c57600080fd5b506200013b600480360381019062000135919062001afa565b620003c3565b005b3480156200014a57600080fd5b5062000169600480360381019062000163919062001bed565b62000685565b005b3480156200017857600080fd5b5062000197600480360381019062000191919062001c99565b6200081d565b005b620001b76004803603810190620001b1919062001e52565b62000920565b005b348015620001c657600080fd5b50620001d162000a68565b604051620001e0919062001ed3565b60405180910390f35b348015620001f657600080fd5b506200021560048036038101906200020f919062001ef0565b62000b24565b005b3480156200022457600080fd5b506200022f62000bc7565b005b3480156200023e57600080fd5b506200024962000bdf565b005b3480156200025857600080fd5b506200026362000d2b565b60405162000272919062001f33565b60405180910390f35b3480156200028857600080fd5b506200029362000d55565b604051620002a2919062001f61565b60405180910390f35b348015620002b857600080fd5b50620002c362000d69565b005b348015620002d257600080fd5b50620002f16004803603810190620002eb919062001bed565b62000ed3565b005b3480156200030057600080fd5b506200030b62001073565b6040516200031a919062001f61565b60405180910390f35b3480156200033057600080fd5b506200034f600480360381019062000349919062001bed565b62001087565b005b3480156200035e57600080fd5b506200037d600480360381019062000377919062001f7e565b62001111565b6040516200038c919062001f33565b60405180910390f35b348015620003a257600080fd5b50620003c16004803603810190620003bb919062001fb0565b62001144565b005b606560009054906101000a900461ffff1661ffff16606760009054906101000a900461ffff1661ffff161062000425576040517fd23276a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6001156200067f5760666000606760009054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632de999bf858585856040518563ffffffff1660e01b8152600401620004ba9493929190620020d6565b600060405180830381600087803b158015620004d557600080fd5b505af1925050508015620004e7575060015b62000673573d80600081146200051a576040519150601f19603f3d011682016040523d82523d6000602084013e6200051f565b606091505b506040516024016040516020818303038152906040527f57f69531000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505080519060200120818051906020012014620005c057805181602001fd5b606560009054906101000a900461ffff1661ffff166001606760009054906101000a900461ffff16620005f4919062002144565b61ffff161062000630576040517fd23276a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001606760008282829054906101000a900461ffff1662000652919062002144565b92506101000a81548161ffff021916908361ffff1602179055505062000679565b6200067f565b62000426565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff160362000716576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200070d9062002208565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16620007576200124d565b73ffffffffffffffffffffffffffffffffffffffff1614620007b0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007a790620022a0565b60405180910390fd5b620007bb81620012a6565b6200081a81600067ffffffffffffffff811115620007de57620007dd62001d0b565b5b6040519080825280601f01601f191660200182016040528015620008115781602001600182028036833780820191505090505b506000620012b3565b50565b606560009054906101000a900461ffff1661ffff168361ffff16106200086f576040517fd23276a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606660008461ffff1661ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d66d6c1083836040518363ffffffff1660e01b8152600401620008e7929190620022d3565b600060405180830381600087803b1580156200090257600080fd5b505af115801562000917573d6000803e3d6000fd5b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603620009b1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009a89062002208565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16620009f26200124d565b73ffffffffffffffffffffffffffffffffffffffff161462000a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a4290620022a0565b60405180910390fd5b62000a5682620012a6565b62000a6482826001620012b3565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161462000afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000af29062002376565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905090565b62000b2e62001432565b6000810362000b69576040517fe671aff300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081606560009054906101000a900461ffff1660405162000b8b9062001a6a565b62000b9892919062002398565b604051809103906000f08015801562000bb5573d6000803e3d6000fd5b50905062000bc381620014b7565b5050565b62000bd162001432565b62000bdd6000620015ab565b565b60008060019054906101000a900460ff1615905080801562000c115750600160008054906101000a900460ff1660ff16105b8062000c42575062000c233062001671565b15801562000c415750600160008054906101000a900460ff1660ff16145b5b62000c84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c7b906200243b565b60405180910390fd5b60016000806101000a81548160ff021916908360ff160217905550801562000cc2576001600060016101000a81548160ff0219169083151502179055505b62000ccc62001694565b801562000d285760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405162000d1f9190620024b7565b60405180910390a15b50565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606760009054906101000a900461ffff1681565b62000d7362001432565b606560009054906101000a900461ffff1661ffff16606760009054906101000a900461ffff1661ffff161062000dd5576040517fd23276a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16606660006001606760009054906101000a900461ffff1662000e10919062002144565b61ffff1661ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160362000e95576040517fd23276a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001606760008282829054906101000a900461ffff1662000eb7919062002144565b92506101000a81548161ffff021916908361ffff160217905550565b62000edd62001432565b600073ffffffffffffffffffffffffffffffffffffffff1660666000606560009054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000f9c57806040517f9cfabd1600000000000000000000000000000000000000000000000000000000815260040162000f93919062001f33565b60405180910390fd5b6000819050606560009054906101000a900461ffff1661ffff168173ffffffffffffffffffffffffffffffffffffffff166328b070e06040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001002573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620010289190620024eb565b61ffff161462001064576040517fb893b72300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200106f82620014b7565b5050565b606560009054906101000a900461ffff1681565b6200109162001432565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362001103576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620010fa9062002593565b60405180910390fd5b6200110e81620015ab565b50565b60666020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606560009054906101000a900461ffff1661ffff168561ffff161062001196576040517fd23276a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606660008661ffff1661ffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632de999bf858585856040518563ffffffff1660e01b8152600401620012129493929190620020d6565b600060405180830381600087803b1580156200122d57600080fd5b505af115801562001242573d6000803e3d6000fd5b505050505050505050565b60006200127d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620016f2565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620012b062001432565b50565b620012e17f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd914360001b620016fc565b60000160009054906101000a900460ff16156200130957620013038362001706565b6200142d565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156200137457506040513d601f19601f82011682018060405250810190620013719190620025e6565b60015b620013b6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013ad906200268e565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b81146200141e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620014159062002726565b60405180910390fd5b506200142c838383620017c6565b5b505050565b6200143c620017f8565b73ffffffffffffffffffffffffffffffffffffffff166200145c62000d2b565b73ffffffffffffffffffffffffffffffffffffffff1614620014b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620014ac9062002798565b60405180910390fd5b565b8060666000606560009054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fcf6a3b406170499209d0fcf152a1605c7c5a5c99c855e2bb803433fc960718eb606560009054906101000a900461ffff168260405162001564929190620027ba565b60405180910390a16001606560008282829054906101000a900461ffff166200158e919062002144565b92506101000a81548161ffff021916908361ffff16021790555050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16620016e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620016dd906200285d565b60405180910390fd5b620016f062001800565b565b6000819050919050565b6000819050919050565b620017118162001868565b62001753576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200174a90620028f5565b60405180910390fd5b80620017827f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620016f2565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b620017d1836200188b565b600082511180620017df5750805b15620017f357620017f18383620018dc565b505b505050565b600033905090565b600060019054906101000a900460ff1662001852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001849906200285d565b60405180910390fd5b6200186662001860620017f8565b620015ab565b565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b620018968162001706565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b60606200190483836040518060600160405280602781526020016200453c602791396200190c565b905092915050565b60606000808573ffffffffffffffffffffffffffffffffffffffff168560405162001938919062002990565b600060405180830381855af49150503d806000811462001975576040519150601f19603f3d011682016040523d82523d6000602084013e6200197a565b606091505b50915091506200198d8683838762001998565b925050509392505050565b6060831562001a02576000835103620019f957620019b68562001868565b620019f8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620019ef90620029f9565b60405180910390fd5b5b82905062001a0f565b62001a0e838362001a17565b5b949350505050565b60008251111562001a2b5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001a61919062002a67565b60405180910390fd5b611ab08062002a8c83390190565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011262001ab45762001ab362001a8c565b5b8235905067ffffffffffffffff81111562001ad45762001ad362001a91565b5b60208301915083602082028301111562001af35762001af262001a96565b5b9250929050565b6000806000806040858703121562001b175762001b1662001a82565b5b600085013567ffffffffffffffff81111562001b385762001b3762001a87565b5b62001b468782880162001a9b565b9450945050602085013567ffffffffffffffff81111562001b6c5762001b6b62001a87565b5b62001b7a8782880162001a9b565b925092505092959194509250565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062001bb58262001b88565b9050919050565b62001bc78162001ba8565b811462001bd357600080fd5b50565b60008135905062001be78162001bbc565b92915050565b60006020828403121562001c065762001c0562001a82565b5b600062001c168482850162001bd6565b91505092915050565b600061ffff82169050919050565b62001c388162001c1f565b811462001c4457600080fd5b50565b60008135905062001c588162001c2d565b92915050565b6000819050919050565b62001c738162001c5e565b811462001c7f57600080fd5b50565b60008135905062001c938162001c68565b92915050565b60008060006060848603121562001cb55762001cb462001a82565b5b600062001cc58682870162001c47565b935050602062001cd88682870162001c82565b925050604062001ceb8682870162001c82565b9150509250925092565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62001d458262001cfa565b810181811067ffffffffffffffff8211171562001d675762001d6662001d0b565b5b80604052505050565b600062001d7c62001a78565b905062001d8a828262001d3a565b919050565b600067ffffffffffffffff82111562001dad5762001dac62001d0b565b5b62001db88262001cfa565b9050602081019050919050565b82818337600083830152505050565b600062001deb62001de58462001d8f565b62001d70565b90508281526020810184848401111562001e0a5762001e0962001cf5565b5b62001e1784828562001dc5565b509392505050565b600082601f83011262001e375762001e3662001a8c565b5b813562001e4984826020860162001dd4565b91505092915050565b6000806040838503121562001e6c5762001e6b62001a82565b5b600062001e7c8582860162001bd6565b925050602083013567ffffffffffffffff81111562001ea05762001e9f62001a87565b5b62001eae8582860162001e1f565b9150509250929050565b6000819050919050565b62001ecd8162001eb8565b82525050565b600060208201905062001eea600083018462001ec2565b92915050565b60006020828403121562001f095762001f0862001a82565b5b600062001f198482850162001c82565b91505092915050565b62001f2d8162001ba8565b82525050565b600060208201905062001f4a600083018462001f22565b92915050565b62001f5b8162001c1f565b82525050565b600060208201905062001f78600083018462001f50565b92915050565b60006020828403121562001f975762001f9662001a82565b5b600062001fa78482850162001c47565b91505092915050565b60008060008060006060868803121562001fcf5762001fce62001a82565b5b600062001fdf8882890162001c47565b955050602086013567ffffffffffffffff81111562002003576200200262001a87565b5b620020118882890162001a9b565b9450945050604086013567ffffffffffffffff81111562002037576200203662001a87565b5b620020458882890162001a9b565b92509250509295509295909350565b600082825260208201905092915050565b600080fd5b82818337505050565b600062002081838562002054565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115620020b757620020b662002065565b5b602083029250620020ca8385846200206a565b82840190509392505050565b60006040820190508181036000830152620020f381868862002073565b905081810360208301526200210a81848662002073565b905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620021518262001c1f565b91506200215e8362001c1f565b9250828201905061ffff8111156200217b576200217a62002115565b5b92915050565b600082825260208201905092915050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f64656c656761746563616c6c0000000000000000000000000000000000000000602082015250565b6000620021f0602c8362002181565b9150620021fd8262002192565b604082019050919050565b600060208201905081810360008301526200222381620021e1565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f6163746976652070726f78790000000000000000000000000000000000000000602082015250565b600062002288602c8362002181565b915062002295826200222a565b604082019050919050565b60006020820190508181036000830152620022bb8162002279565b9050919050565b620022cd8162001c5e565b82525050565b6000604082019050620022ea6000830185620022c2565b620022f96020830184620022c2565b9392505050565b7f555550535570677261646561626c653a206d757374206e6f742062652063616c60008201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000602082015250565b60006200235e60388362002181565b91506200236b8262002300565b604082019050919050565b6000602082019050818103600083015262002391816200234f565b9050919050565b6000604082019050620023af6000830185620022c2565b620023be602083018462001f50565b9392505050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b600062002423602e8362002181565b91506200243082620023c5565b604082019050919050565b60006020820190508181036000830152620024568162002414565b9050919050565b6000819050919050565b600060ff82169050919050565b6000819050919050565b60006200249f6200249962002493846200245d565b62002474565b62002467565b9050919050565b620024b1816200247e565b82525050565b6000602082019050620024ce6000830184620024a6565b92915050565b600081519050620024e58162001c2d565b92915050565b60006020828403121562002504576200250362001a82565b5b60006200251484828501620024d4565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006200257b60268362002181565b915062002588826200251d565b604082019050919050565b60006020820190508181036000830152620025ae816200256c565b9050919050565b620025c08162001eb8565b8114620025cc57600080fd5b50565b600081519050620025e081620025b5565b92915050565b600060208284031215620025ff57620025fe62001a82565b5b60006200260f84828501620025cf565b91505092915050565b7f45524331393637557067726164653a206e657720696d706c656d656e7461746960008201527f6f6e206973206e6f742055555053000000000000000000000000000000000000602082015250565b600062002676602e8362002181565b9150620026838262002618565b604082019050919050565b60006020820190508181036000830152620026a98162002667565b9050919050565b7f45524331393637557067726164653a20756e737570706f727465642070726f7860008201527f6961626c65555549440000000000000000000000000000000000000000000000602082015250565b60006200270e60298362002181565b91506200271b82620026b0565b604082019050919050565b600060208201905081810360008301526200274181620026ff565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200278060208362002181565b91506200278d8262002748565b602082019050919050565b60006020820190508181036000830152620027b38162002771565b9050919050565b6000604082019050620027d1600083018562001f50565b620027e0602083018462001f22565b9392505050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b600062002845602b8362002181565b91506200285282620027e7565b604082019050919050565b60006020820190508181036000830152620028788162002836565b9050919050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b6000620028dd602d8362002181565b9150620028ea826200287f565b604082019050919050565b600060208201905081810360008301526200291081620028ce565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156200294d57808201518184015260208101905062002930565b60008484015250505050565b6000620029668262002917565b62002972818562002922565b9350620029848185602086016200292d565b80840191505092915050565b60006200299e828462002959565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000620029e1601d8362002181565b9150620029ee82620029a9565b602082019050919050565b6000602082019050818103600083015262002a1481620029d2565b9050919050565b600081519050919050565b600062002a338262002a1b565b62002a3f818562002181565b935062002a518185602086016200292d565b62002a5c8162001cfa565b840191505092915050565b6000602082019050818103600083015262002a83818462002a26565b90509291505056fe61016060405260006001553480156200001757600080fd5b5060405162001ab038038062001ab083398181016040528101906200003d91906200023a565b600060148360006200006462000058620000ef60201b60201c565b620000f760201b60201c565b8360a0818152505081608081815250508260c08181525050826001901b60e081815250508073ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff16815250504363ffffffff166101208163ffffffff1681525050505050508061ffff166101408161ffff1681525050505062000281565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b6000819050919050565b620001d581620001c0565b8114620001e157600080fd5b50565b600081519050620001f581620001ca565b92915050565b600061ffff82169050919050565b6200021481620001fb565b81146200022057600080fd5b50565b600081519050620002348162000209565b92915050565b60008060408385031215620002545762000253620001bb565b5b60006200026485828601620001e4565b9250506020620002778582860162000223565b9150509250929050565b60805160a05160c05160e0516101005161012051610140516117bf620002f16000396000610661015260006107c401526000610685015260008181610a6c0152610f1401526000610a1201526000818161075f0152610ac20152600081816106050152610dc201526117bf6000f3fe6080604052600436106101665760003560e01c80638be9b119116100d1578063bc4991281161008a578063d66d6c1011610064578063d66d6c1014610568578063e493ef8c14610584578063f220b9ec146105af578063f2fde38b146105da57610166565b8063bc499128146104c3578063c5b208ff14610500578063d0383d681461053d57610166565b80638be9b1191461039f5780638da5cb5b146103c85780639056a9bf146103f3578063933ebfdd1461043057806398366e351461046d578063ae74552a1461049857610166565b80633ccfd60b116101235780633ccfd60b1461028f5780634add651e146102a65780635daf08ca146102d15780636bdcc8ab1461030e578063715018a61461034b5780637671ac051461036257610166565b806309aeb04c1461016b57806322d9730c1461019657806328b070e0146101d35780632b7ac3f3146101fe5780632de999bf14610229578063378de45b14610252575b600080fd5b34801561017757600080fd5b50610180610603565b60405161018d9190610f8c565b60405180910390f35b3480156101a257600080fd5b506101bd60048036038101906101b89190610fdd565b610627565b6040516101ca9190611025565b60405180910390f35b3480156101df57600080fd5b506101e861065f565b6040516101f5919061105d565b60405180910390f35b34801561020a57600080fd5b50610213610683565b60405161022091906110f7565b60405180910390f35b34801561023557600080fd5b50610250600480360381019061024b9190611177565b6106a7565b005b34801561025e57600080fd5b5061027960048036038101906102749190610fdd565b61075b565b6040516102869190610f8c565b60405180910390f35b34801561029b57600080fd5b506102a4610790565b005b3480156102b257600080fd5b506102bb6107c2565b6040516102c89190611217565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f39190610fdd565b6107e6565b6040516103059190610f8c565b60405180910390f35b34801561031a57600080fd5b5061033560048036038101906103309190610fdd565b6107fe565b6040516103429190611025565b60405180910390f35b34801561035757600080fd5b5061036061081e565b005b34801561036e57600080fd5b5061038960048036038101906103849190610fdd565b610832565b6040516103969190610f8c565b60405180910390f35b3480156103ab57600080fd5b506103c660048036038101906103c19190611292565b61084a565b005b3480156103d457600080fd5b506103dd61087c565b6040516103ea9190611307565b60405180910390f35b3480156103ff57600080fd5b5061041a60048036038101906104159190610fdd565b6108a5565b6040516104279190610f8c565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190611322565b6108bd565b6040516104649190611420565b60405180910390f35b34801561047957600080fd5b50610482610a10565b60405161048f9190610f8c565b60405180910390f35b3480156104a457600080fd5b506104ad610a34565b6040516104ba9190610f8c565b60405180910390f35b3480156104cf57600080fd5b506104ea60048036038101906104e59190610fdd565b610a3a565b6040516104f79190610f8c565b60405180910390f35b34801561050c57600080fd5b506105276004803603810190610522919061146e565b610a52565b6040516105349190610f8c565b60405180910390f35b34801561054957600080fd5b50610552610a6a565b60405161055f9190610f8c565b60405180910390f35b610582600480360381019061057d9190611322565b610a8e565b005b34801561059057600080fd5b50610599610a9c565b6040516105a69190610f8c565b60405180910390f35b3480156105bb57600080fd5b506105c4610ac0565b6040516105d19190610f8c565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc919061146e565b610ae4565b005b7f000000000000000000000000000000000000000000000000000000000000000081565b600080821415801561065857507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182105b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6106af610b67565b838383836106bf84848484610be5565b6106f5576040517fb750624800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088889050905060005b8181101561074f576107448a8a8381811061071e5761071d61149b565b5b905060200201358989848181106107385761073761149b565b5b90506020020135610c17565b806001019050610700565b50505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000008261078991906114f9565b9050919050565b6040517fd623472500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b60036020528060005260406000206000915090505481565b60066020528060005260406000206000915054906101000a900460ff1681565b610826610b67565b6108306000610cf3565b565b60056020528060005260406000206000915090505481565b6040517fd623472500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60046020528060005260406000206000915090505481565b60608183106109055782826040517f9ffcd53d0000000000000000000000000000000000000000000000000000000081526004016108fc92919061153b565b60405180910390fd5b60015482111561094e5782826040517f9ffcd53d00000000000000000000000000000000000000000000000000000000815260040161094592919061153b565b60405180910390fd5b6000838361095c9190611564565b67ffffffffffffffff81111561097557610974611598565b5b6040519080825280602002602001820160405280156109a35781602001602082028036833780820191505090505b50905060008490505b83811015610a055760056000828152602001908152602001600020548286836109d59190611564565b815181106109e6576109e561149b565b5b60200260200101818152505080806109fd906115c7565b9150506109ac565b508091505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b60026020528060005260406000206000915090505481565b60076020528060005260406000206000915090505481565b7f000000000000000000000000000000000000000000000000000000000000000081565b610a988282610c17565b5050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181565b7f000000000000000000000000000000000000000000000000000000000000000081565b610aec610b67565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5290611692565b60405180910390fd5b610b6481610cf3565b50565b610b6f610db7565b73ffffffffffffffffffffffffffffffffffffffff16610b8d61087c565b73ffffffffffffffffffffffffffffffffffffffff1614610be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bda906116fe565b60405180910390fd5b565b6000808585905090506000848490509050808214610c0857600092505050610c0f565b6001925050505b949350505050565b610c218282610dbf565b6001546003600084815260200190815260200160002081905550816005600060015481526020019081526020016000208190555060016006600084815260200190815260200160002060006101000a81548160ff0219169083151502179055508060046000848152602001908152602001600020819055507fff42916a89d1f5125f7f47168ee59c2b3fc9246ad1b229082ee85b69d001b5d78282600154604051610cce9392919061171e565b60405180910390a16001806000828254610ce89190611755565b925050819055505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b807f0000000000000000000000000000000000000000000000000000000000000000811115610e2557806040517f13a5e2ee000000000000000000000000000000000000000000000000000000008152600401610e1c9190610f8c565b60405180910390fd5b60008103610e6a57806040517f13a5e2ee000000000000000000000000000000000000000000000000000000008152600401610e619190610f8c565b60405180910390fd5b82610e7481610627565b610eb557806040517f7f3e75af000000000000000000000000000000000000000000000000000000008152600401610eac9190610f8c565b60405180910390fd5b600115156006600086815260200190815260200160002060009054906101000a900460ff16151503610f12576040517e0a60f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060015410610f6d576040517f57f6953100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000819050919050565b610f8681610f73565b82525050565b6000602082019050610fa16000830184610f7d565b92915050565b600080fd5b600080fd5b610fba81610f73565b8114610fc557600080fd5b50565b600081359050610fd781610fb1565b92915050565b600060208284031215610ff357610ff2610fa7565b5b600061100184828501610fc8565b91505092915050565b60008115159050919050565b61101f8161100a565b82525050565b600060208201905061103a6000830184611016565b92915050565b600061ffff82169050919050565b61105781611040565b82525050565b6000602082019050611072600083018461104e565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006110bd6110b86110b384611078565b611098565b611078565b9050919050565b60006110cf826110a2565b9050919050565b60006110e1826110c4565b9050919050565b6110f1816110d6565b82525050565b600060208201905061110c60008301846110e8565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261113757611136611112565b5b8235905067ffffffffffffffff81111561115457611153611117565b5b6020830191508360208202830111156111705761116f61111c565b5b9250929050565b6000806000806040858703121561119157611190610fa7565b5b600085013567ffffffffffffffff8111156111af576111ae610fac565b5b6111bb87828801611121565b9450945050602085013567ffffffffffffffff8111156111de576111dd610fac565b5b6111ea87828801611121565b925092505092959194509250565b600063ffffffff82169050919050565b611211816111f8565b82525050565b600060208201905061122c6000830184611208565b92915050565b600061123d82611078565b9050919050565b61124d81611232565b811461125857600080fd5b50565b60008135905061126a81611244565b92915050565b60008190508260206008028201111561128c5761128b61111c565b5b92915050565b600080600061014084860312156112ac576112ab610fa7565b5b60006112ba86828701610fc8565b93505060206112cb8682870161125b565b92505060406112dc86828701611270565b9150509250925092565b60006112f182611078565b9050919050565b611301816112e6565b82525050565b600060208201905061131c60008301846112f8565b92915050565b6000806040838503121561133957611338610fa7565b5b600061134785828601610fc8565b925050602061135885828601610fc8565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61139781610f73565b82525050565b60006113a9838361138e565b60208301905092915050565b6000602082019050919050565b60006113cd82611362565b6113d7818561136d565b93506113e28361137e565b8060005b838110156114135781516113fa888261139d565b9750611405836113b5565b9250506001810190506113e6565b5085935050505092915050565b6000602082019050818103600083015261143a81846113c2565b905092915050565b61144b816112e6565b811461145657600080fd5b50565b60008135905061146881611442565b92915050565b60006020828403121561148457611483610fa7565b5b600061149284828501611459565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061150482610f73565b915061150f83610f73565b925082820261151d81610f73565b91508282048414831517611534576115336114ca565b5b5092915050565b60006040820190506115506000830185610f7d565b61155d6020830184610f7d565b9392505050565b600061156f82610f73565b915061157a83610f73565b9250828203905081811115611592576115916114ca565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006115d282610f73565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611604576116036114ca565b5b600182019050919050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061167c60268361160f565b915061168782611620565b604082019050919050565b600060208201905081810360008301526116ab8161166f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006116e860208361160f565b91506116f3826116b2565b602082019050919050565b60006020820190508181036000830152611717816116db565b9050919050565b60006060820190506117336000830186610f7d565b6117406020830185610f7d565b61174d6040830184610f7d565b949350505050565b600061176082610f73565b915061176b83610f73565b9250828201905080821115611783576117826114ca565b5b9291505056fea2646970667358221220f6c3084e40c3d832e80d8784a217128c00d11febcddb3c95a294a3dda6d98fcc64736f6c63430008130033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204b81af5902b9bb5e9047b4240454a3efa2d73ee95ad9c862a38fbd4c9e43533964736f6c63430008130033",
|
|
"devdoc": {
|
|
"events": {
|
|
"AdminChanged(address,address)": {
|
|
"details": "Emitted when the admin account has changed."
|
|
},
|
|
"BeaconUpgraded(address)": {
|
|
"details": "Emitted when the beacon is changed."
|
|
},
|
|
"Initialized(uint8)": {
|
|
"details": "Triggered when the contract has been initialized or reinitialized."
|
|
},
|
|
"Upgraded(address)": {
|
|
"details": "Emitted when the implementation is upgraded."
|
|
}
|
|
},
|
|
"kind": "dev",
|
|
"methods": {
|
|
"owner()": {
|
|
"details": "Returns the address of the current owner."
|
|
},
|
|
"proxiableUUID()": {
|
|
"details": "Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."
|
|
},
|
|
"renounceOwnership()": {
|
|
"details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."
|
|
},
|
|
"transferOwnership(address)": {
|
|
"details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
|
|
},
|
|
"upgradeTo(address)": {
|
|
"custom:oz-upgrades-unsafe-allow-reachable": "delegatecall",
|
|
"details": "Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."
|
|
},
|
|
"upgradeToAndCall(address,bytes)": {
|
|
"custom:oz-upgrades-unsafe-allow-reachable": "delegatecall",
|
|
"details": "Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."
|
|
}
|
|
},
|
|
"version": 1
|
|
},
|
|
"userdoc": {
|
|
"kind": "user",
|
|
"methods": {},
|
|
"version": 1
|
|
},
|
|
"storageLayout": {
|
|
"storage": [
|
|
{
|
|
"astId": 714,
|
|
"contract": "contracts/WakuRlnRegistry.sol:WakuRlnRegistry",
|
|
"label": "_initialized",
|
|
"offset": 0,
|
|
"slot": "0",
|
|
"type": "t_uint8"
|
|
},
|
|
{
|
|
"astId": 717,
|
|
"contract": "contracts/WakuRlnRegistry.sol:WakuRlnRegistry",
|
|
"label": "_initializing",
|
|
"offset": 1,
|
|
"slot": "0",
|
|
"type": "t_bool"
|
|
},
|
|
{
|
|
"astId": 1247,
|
|
"contract": "contracts/WakuRlnRegistry.sol:WakuRlnRegistry",
|
|
"label": "__gap",
|
|
"offset": 0,
|
|
"slot": "1",
|
|
"type": "t_array(t_uint256)50_storage"
|
|
},
|
|
{
|
|
"astId": 586,
|
|
"contract": "contracts/WakuRlnRegistry.sol:WakuRlnRegistry",
|
|
"label": "_owner",
|
|
"offset": 0,
|
|
"slot": "51",
|
|
"type": "t_address"
|
|
},
|
|
{
|
|
"astId": 706,
|
|
"contract": "contracts/WakuRlnRegistry.sol:WakuRlnRegistry",
|
|
"label": "__gap",
|
|
"offset": 0,
|
|
"slot": "52",
|
|
"type": "t_array(t_uint256)49_storage"
|
|
},
|
|
{
|
|
"astId": 296,
|
|
"contract": "contracts/WakuRlnRegistry.sol:WakuRlnRegistry",
|
|
"label": "nextStorageIndex",
|
|
"offset": 0,
|
|
"slot": "101",
|
|
"type": "t_uint16"
|
|
},
|
|
{
|
|
"astId": 300,
|
|
"contract": "contracts/WakuRlnRegistry.sol:WakuRlnRegistry",
|
|
"label": "storages",
|
|
"offset": 0,
|
|
"slot": "102",
|
|
"type": "t_mapping(t_uint16,t_address)"
|
|
},
|
|
{
|
|
"astId": 303,
|
|
"contract": "contracts/WakuRlnRegistry.sol:WakuRlnRegistry",
|
|
"label": "usingStorageIndex",
|
|
"offset": 0,
|
|
"slot": "103",
|
|
"type": "t_uint16"
|
|
}
|
|
],
|
|
"types": {
|
|
"t_address": {
|
|
"encoding": "inplace",
|
|
"label": "address",
|
|
"numberOfBytes": "20"
|
|
},
|
|
"t_array(t_uint256)49_storage": {
|
|
"base": "t_uint256",
|
|
"encoding": "inplace",
|
|
"label": "uint256[49]",
|
|
"numberOfBytes": "1568"
|
|
},
|
|
"t_array(t_uint256)50_storage": {
|
|
"base": "t_uint256",
|
|
"encoding": "inplace",
|
|
"label": "uint256[50]",
|
|
"numberOfBytes": "1600"
|
|
},
|
|
"t_bool": {
|
|
"encoding": "inplace",
|
|
"label": "bool",
|
|
"numberOfBytes": "1"
|
|
},
|
|
"t_mapping(t_uint16,t_address)": {
|
|
"encoding": "mapping",
|
|
"key": "t_uint16",
|
|
"label": "mapping(uint16 => address)",
|
|
"numberOfBytes": "32",
|
|
"value": "t_address"
|
|
},
|
|
"t_uint16": {
|
|
"encoding": "inplace",
|
|
"label": "uint16",
|
|
"numberOfBytes": "2"
|
|
},
|
|
"t_uint256": {
|
|
"encoding": "inplace",
|
|
"label": "uint256",
|
|
"numberOfBytes": "32"
|
|
},
|
|
"t_uint8": {
|
|
"encoding": "inplace",
|
|
"label": "uint8",
|
|
"numberOfBytes": "1"
|
|
}
|
|
}
|
|
}
|
|
}
|