Contract Information

This contract is a proxy and the implementation details are not yet known.
More Info

Proxy Source Code

{{ "language": "Solidity", "settings": { "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "optimizer": { "enabled": true, "runs": 200 } }, "sources": { "contracts/Proxy.sol": { "content": "pragma solidity ^0.5.0;\n\nimport \"./Ownable.sol\";\nimport \"./Upgradeable.sol\";\nimport \"./UpgradeableMaster.sol\";\n\n\n/// @title Proxy Contract\n/// @dev NOTICE: Proxy must implement UpgradeableMaster interface to prevent calling some function of it not by master of proxy\n/// @author Matter Labs\ncontract Proxy is Upgradeable, UpgradeableMaster, Ownable {\n\n /// @notice Storage position of \"target\" (actual implementation address: keccak256('eip1967.proxy.implementation') - 1)\n bytes32 private constant targetPosition = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /// @notice Contract constructor\n /// @dev Calls Ownable contract constructor and initialize target\n /// @param target Initial implementation address\n /// @param targetInitializationParameters Target initialization parameters\n constructor(address target, bytes memory targetInitializationParameters) Ownable(msg.sender) public {\n setTarget(target);\n (bool initializationSuccess, ) = getTarget().delegatecall(\n abi.encodeWithSignature(\"initialize(bytes)\", targetInitializationParameters)\n );\n require(initializationSuccess, \"uin11\"); // uin11 - target initialization failed\n }\n\n /// @notice Intercepts initialization calls\n function initialize(bytes calldata) external pure {\n revert(\"ini11\"); // ini11 - interception of initialization call\n }\n\n /// @notice Intercepts upgrade calls\n function upgrade(bytes calldata) external pure {\n revert(\"upg11\"); // upg11 - interception of upgrade call\n }\n\n /// @notice Returns target of contract\n /// @return Actual implementation address\n function getTarget() public view returns (address target) {\n bytes32 position = targetPosition;\n assembly {\n target := sload(position)\n }\n }\n\n /// @notice Sets new target of contract\n /// @param _newTarget New actual implementation address\n function setTarget(address _newTarget) internal {\n bytes32 position = targetPosition;\n assembly {\n sstore(position, _newTarget)\n }\n }\n\n /// @notice Upgrades target\n /// @param newTarget New target\n /// @param newTargetUpgradeParameters New target upgrade parameters\n function upgradeTarget(address newTarget, bytes calldata newTargetUpgradeParameters) external {\n requireMaster(msg.sender);\n\n setTarget(newTarget);\n (bool upgradeSuccess, ) = getTarget().delegatecall(\n abi.encodeWithSignature(\"upgrade(bytes)\", newTargetUpgradeParameters)\n );\n require(upgradeSuccess, \"ufu11\"); // ufu11 - target upgrade failed\n }\n\n /// @notice Performs a delegatecall to the contract implementation\n /// @dev Fallback function allowing to perform a delegatecall to the given implementation\n /// This function will return whatever the implementation call returns\n function() external payable {\n address _target = getTarget();\n assembly {\n // The pointer to the free memory slot\n let ptr := mload(0x40)\n // Copy function signature and arguments from calldata at zero position into memory at pointer position\n calldatacopy(ptr, 0x0, calldatasize)\n // Delegatecall method of the implementation contract, returns 0 on error\n let result := delegatecall(\n gas,\n _target,\n ptr,\n calldatasize,\n 0x0,\n 0\n )\n // Get the size of the last return data\n let size := returndatasize\n // Copy the size length of bytes from return data at zero position to pointer position\n returndatacopy(ptr, 0x0, size)\n // Depending on result value\n switch result\n case 0 {\n // End execution and revert state changes\n revert(ptr, size)\n }\n default {\n // Return data with length of size at pointers position\n return(ptr, size)\n }\n }\n }\n\n /// UpgradeableMaster functions\n\n /// @notice Notice period before activation preparation status of upgrade mode\n function getNoticePeriod() external returns (uint) {\n (bool success, bytes memory result) = getTarget().delegatecall(abi.encodeWithSignature(\"getNoticePeriod()\"));\n require(success, \"unp11\"); // unp11 - upgradeNoticePeriod delegatecall failed\n return abi.decode(result, (uint));\n }\n\n /// @notice Notifies proxy contract that notice period started\n function upgradeNoticePeriodStarted() external {\n requireMaster(msg.sender);\n (bool success, ) = getTarget().delegatecall(abi.encodeWithSignature(\"upgradeNoticePeriodStarted()\"));\n require(success, \"nps11\"); // nps11 - upgradeNoticePeriodStarted delegatecall failed\n }\n\n /// @notice Notifies proxy contract that upgrade preparation status is activated\n function upgradePreparationStarted() external {\n requireMaster(msg.sender);\n (bool success, ) = getTarget().delegatecall(abi.encodeWithSignature(\"upgradePreparationStarted()\"));\n require(success, \"ups11\"); // ups11 - upgradePreparationStarted delegatecall failed\n }\n\n /// @notice Notifies proxy contract that upgrade canceled\n function upgradeCanceled() external {\n requireMaster(msg.sender);\n (bool success, ) = getTarget().delegatecall(abi.encodeWithSignature(\"upgradeCanceled()\"));\n require(success, \"puc11\"); // puc11 - upgradeCanceled delegatecall failed\n }\n\n /// @notice Notifies proxy contract that upgrade finishes\n function upgradeFinishes() external {\n requireMaster(msg.sender);\n (bool success, ) = getTarget().delegatecall(abi.encodeWithSignature(\"upgradeFinishes()\"));\n require(success, \"puf11\"); // puf11 - upgradeFinishes delegatecall failed\n }\n\n /// @notice Checks that contract is ready for upgrade\n /// @return bool flag indicating that contract is ready for upgrade\n function isReadyForUpgrade() external returns (bool) {\n (bool success, bytes memory result) = getTarget().delegatecall(abi.encodeWithSignature(\"isReadyForUpgrade()\"));\n require(success, \"rfu11\"); // rfu11 - readyForUpgrade delegatecall failed\n return abi.decode(result, (bool));\n }\n\n}\n" }, "contracts/Ownable.sol": { "content": "pragma solidity ^0.5.0;\n\n/// @title Ownable Contract\n/// @author Matter Labs\ncontract Ownable {\n\n /// @notice Storage position of the masters address (keccak256('eip1967.proxy.admin') - 1)\n bytes32 private constant masterPosition = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /// @notice Contract constructor\n /// @dev Sets msg sender address as masters address\n /// @param masterAddress Master address\n constructor(address masterAddress) public {\n setMaster(masterAddress);\n }\n\n /// @notice Check if specified address is master\n /// @param _address Address to check\n function requireMaster(address _address) internal view {\n require(_address == getMaster(), \"oro11\"); // oro11 - only by master\n }\n\n /// @notice Returns contract masters address\n /// @return Masters address\n function getMaster() public view returns (address master) {\n bytes32 position = masterPosition;\n assembly {\n master := sload(position)\n }\n }\n\n /// @notice Sets new masters address\n /// @param _newMaster New masters address\n function setMaster(address _newMaster) internal {\n bytes32 position = masterPosition;\n assembly {\n sstore(position, _newMaster)\n }\n }\n\n /// @notice Transfer mastership of the contract to new master\n /// @param _newMaster New masters address\n function transferMastership(address _newMaster) external {\n requireMaster(msg.sender);\n require(_newMaster != address(0), \"otp11\"); // otp11 - new masters address can't be zero address\n setMaster(_newMaster);\n }\n\n}\n" }, "contracts/Upgradeable.sol": { "content": "pragma solidity ^0.5.0;\n\n\n/// @title Interface of the upgradeable contract\n/// @author Matter Labs\ninterface Upgradeable {\n\n /// @notice Upgrades target of upgradeable contract\n /// @param newTarget New target\n /// @param newTargetInitializationParameters New target initialization parameters\n function upgradeTarget(address newTarget, bytes calldata newTargetInitializationParameters) external;\n\n}\n" }, "contracts/UpgradeableMaster.sol": { "content": "pragma solidity ^0.5.0;\n\n\n/// @title Interface of the upgradeable master contract (defines notice period duration and allows finish upgrade during preparation of it)\n/// @author Matter Labs\ninterface UpgradeableMaster {\n\n /// @notice Notice period before activation preparation status of upgrade mode\n function getNoticePeriod() external returns (uint);\n\n /// @notice Notifies contract that notice period started\n function upgradeNoticePeriodStarted() external;\n\n /// @notice Notifies contract that upgrade preparation status is activated\n function upgradePreparationStarted() external;\n\n /// @notice Notifies contract that upgrade canceled\n function upgradeCanceled() external;\n\n /// @notice Notifies contract that upgrade finishes\n function upgradeFinishes() external;\n\n /// @notice Checks that contract is ready for upgrade\n /// @return bool flag indicating that contract is ready for upgrade\n function isReadyForUpgrade() external returns (bool);\n\n}\n" } } }}
< {{
  "language": "Solidity",
  "settings": {
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "abi"
        ]
      }
    },
    "optimizer": {
      "enabled": true,
      "runs": 200
    }
  },
  "sources": {
    "contracts/Proxy.sol": {
      "content": "pragma solidity ^0.5.0;\n\nimport \"./Ownable.sol\";\nimport \"./Upgradeable.sol\";\nimport \"./UpgradeableMaster.sol\";\n\n\n/// @title Proxy Contract\n/// @dev NOTICE: Proxy must implement UpgradeableMaster interface to prevent calling some function of it not by master of proxy\n/// @author Matter Labs\ncontract Proxy is Upgradeable, UpgradeableMaster, Ownable {\n\n    /// @notice Storage position of \"target\" (actual implementation address: keccak256('eip1967.proxy.implementation') - 1)\n    bytes32 private constant targetPosition = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n    /// @notice Contract constructor\n    /// @dev Calls Ownable contract constructor and initialize target\n    /// @param target Initial implementation address\n    /// @param targetInitializationParameters Target initialization parameters\n    constructor(address target, bytes memory targetInitializationParameters) Ownable(msg.sender) public {\n        setTarget(target);\n        (bool initializationSuccess, ) = getTarget().delegatecall(\n            abi.encodeWithSignature(\"initialize(bytes)\", targetInitializationParameters)\n        );\n        require(initializationSuccess, \"uin11\"); // uin11 - target initialization failed\n    }\n\n    /// @notice Intercepts initialization calls\n    function initialize(bytes calldata) external pure {\n        revert(\"ini11\"); // ini11 - interception of initialization call\n    }\n\n    /// @notice Intercepts upgrade calls\n    function upgrade(bytes calldata) external pure {\n        revert(\"upg11\"); // upg11 - interception of upgrade call\n    }\n\n    /// @notice Returns target of contract\n    /// @return Actual implementation address\n    function getTarget() public view returns (address target) {\n        bytes32 position = targetPosition;\n        assembly {\n            target := sload(position)\n        }\n    }\n\n    /// @notice Sets new target of contract\n    /// @param _newTarget New actual implementation address\n    function setTarget(address _newTarget) internal {\n        bytes32 position = targetPosition;\n        assembly {\n            sstore(position, _newTarget)\n        }\n    }\n\n    /// @notice Upgrades target\n    /// @param newTarget New target\n    /// @param newTargetUpgradeParameters New target upgrade parameters\n    function upgradeTarget(address newTarget, bytes calldata newTargetUpgradeParameters) external {\n        requireMaster(msg.sender);\n\n        setTarget(newTarget);\n        (bool upgradeSuccess, ) = getTarget().delegatecall(\n            abi.encodeWithSignature(\"upgrade(bytes)\", newTargetUpgradeParameters)\n        );\n        require(upgradeSuccess, \"ufu11\"); // ufu11 - target upgrade failed\n    }\n\n    /// @notice Performs a delegatecall to the contract implementation\n    /// @dev Fallback function allowing to perform a delegatecall to the given implementation\n    /// This function will return whatever the implementation call returns\n    function() external payable {\n        address _target = getTarget();\n        assembly {\n            // The pointer to the free memory slot\n            let ptr := mload(0x40)\n            // Copy function signature and arguments from calldata at zero position into memory at pointer position\n            calldatacopy(ptr, 0x0, calldatasize)\n            // Delegatecall method of the implementation contract, returns 0 on error\n            let result := delegatecall(\n                gas,\n                _target,\n                ptr,\n                calldatasize,\n                0x0,\n                0\n            )\n            // Get the size of the last return data\n            let size := returndatasize\n            // Copy the size length of bytes from return data at zero position to pointer position\n            returndatacopy(ptr, 0x0, size)\n            // Depending on result value\n            switch result\n            case 0 {\n                // End execution and revert state changes\n                revert(ptr, size)\n            }\n            default {\n                // Return data with length of size at pointers position\n                return(ptr, size)\n            }\n        }\n    }\n\n    /// UpgradeableMaster functions\n\n    /// @notice Notice period before activation preparation status of upgrade mode\n    function getNoticePeriod() external returns (uint) {\n        (bool success, bytes memory result) = getTarget().delegatecall(abi.encodeWithSignature(\"getNoticePeriod()\"));\n        require(success, \"unp11\"); // unp11 - upgradeNoticePeriod delegatecall failed\n        return abi.decode(result, (uint));\n    }\n\n    /// @notice Notifies proxy contract that notice period started\n    function upgradeNoticePeriodStarted() external {\n        requireMaster(msg.sender);\n        (bool success, ) = getTarget().delegatecall(abi.encodeWithSignature(\"upgradeNoticePeriodStarted()\"));\n        require(success, \"nps11\"); // nps11 - upgradeNoticePeriodStarted delegatecall failed\n    }\n\n    /// @notice Notifies proxy contract that upgrade preparation status is activated\n    function upgradePreparationStarted() external {\n        requireMaster(msg.sender);\n        (bool success, ) = getTarget().delegatecall(abi.encodeWithSignature(\"upgradePreparationStarted()\"));\n        require(success, \"ups11\"); // ups11 - upgradePreparationStarted delegatecall failed\n    }\n\n    /// @notice Notifies proxy contract that upgrade canceled\n    function upgradeCanceled() external {\n        requireMaster(msg.sender);\n        (bool success, ) = getTarget().delegatecall(abi.encodeWithSignature(\"upgradeCanceled()\"));\n        require(success, \"puc11\"); // puc11 - upgradeCanceled delegatecall failed\n    }\n\n    /// @notice Notifies proxy contract that upgrade finishes\n    function upgradeFinishes() external {\n        requireMaster(msg.sender);\n        (bool success, ) = getTarget().delegatecall(abi.encodeWithSignature(\"upgradeFinishes()\"));\n        require(success, \"puf11\"); // puf11 - upgradeFinishes delegatecall failed\n    }\n\n    /// @notice Checks that contract is ready for upgrade\n    /// @return bool flag indicating that contract is ready for upgrade\n    function isReadyForUpgrade() external returns (bool) {\n        (bool success, bytes memory result) = getTarget().delegatecall(abi.encodeWithSignature(\"isReadyForUpgrade()\"));\n        require(success, \"rfu11\"); // rfu11 - readyForUpgrade delegatecall failed\n        return abi.decode(result, (bool));\n    }\n\n}\n"
    },
    "contracts/Ownable.sol": {
      "content": "pragma solidity ^0.5.0;\n\n/// @title Ownable Contract\n/// @author Matter Labs\ncontract Ownable {\n\n    /// @notice Storage position of the masters address (keccak256('eip1967.proxy.admin') - 1)\n    bytes32 private constant masterPosition = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n    /// @notice Contract constructor\n    /// @dev Sets msg sender address as masters address\n    /// @param masterAddress Master address\n    constructor(address masterAddress) public {\n        setMaster(masterAddress);\n    }\n\n    /// @notice Check if specified address is master\n    /// @param _address Address to check\n    function requireMaster(address _address) internal view {\n        require(_address == getMaster(), \"oro11\"); // oro11 - only by master\n    }\n\n    /// @notice Returns contract masters address\n    /// @return Masters address\n    function getMaster() public view returns (address master) {\n        bytes32 position = masterPosition;\n        assembly {\n            master := sload(position)\n        }\n    }\n\n    /// @notice Sets new masters address\n    /// @param _newMaster New masters address\n    function setMaster(address _newMaster) internal {\n        bytes32 position = masterPosition;\n        assembly {\n            sstore(position, _newMaster)\n        }\n    }\n\n    /// @notice Transfer mastership of the contract to new master\n    /// @param _newMaster New masters address\n    function transferMastership(address _newMaster) external {\n        requireMaster(msg.sender);\n        require(_newMaster != address(0), \"otp11\"); // otp11 - new masters address can't be zero address\n        setMaster(_newMaster);\n    }\n\n}\n"
    },
    "contracts/Upgradeable.sol": {
      "content": "pragma solidity ^0.5.0;\n\n\n/// @title Interface of the upgradeable contract\n/// @author Matter Labs\ninterface Upgradeable {\n\n    /// @notice Upgrades target of upgradeable contract\n    /// @param newTarget New target\n    /// @param newTargetInitializationParameters New target initialization parameters\n    function upgradeTarget(address newTarget, bytes calldata newTargetInitializationParameters) external;\n\n}\n"
    },
    "contracts/UpgradeableMaster.sol": {
      "content": "pragma solidity ^0.5.0;\n\n\n/// @title Interface of the upgradeable master contract (defines notice period duration and allows finish upgrade during preparation of it)\n/// @author Matter Labs\ninterface UpgradeableMaster {\n\n    /// @notice Notice period before activation preparation status of upgrade mode\n    function getNoticePeriod() external returns (uint);\n\n    /// @notice Notifies contract that notice period started\n    function upgradeNoticePeriodStarted() external;\n\n    /// @notice Notifies contract that upgrade preparation status is activated\n    function upgradePreparationStarted() external;\n\n    /// @notice Notifies contract that upgrade canceled\n    function upgradeCanceled() external;\n\n    /// @notice Notifies contract that upgrade finishes\n    function upgradeFinishes() external;\n\n    /// @notice Checks that contract is ready for upgrade\n    /// @return bool flag indicating that contract is ready for upgrade\n    function isReadyForUpgrade() external returns (bool);\n\n}\n"
    }
  }
}} < 

Proxy ABI

[{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"targetInitializationParameters","type":"bytes"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"getMaster","outputs":[{"internalType":"address","name":"master","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"getNoticePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTarget","outputs":[{"internalType":"address","name":"target","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"isReadyForUpgrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newMaster","type":"address"}],"name":"transferMastership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"upgrade","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"upgradeCanceled","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"upgradeFinishes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"upgradeNoticePeriodStarted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"upgradePreparationStarted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newTarget","type":"address"},{"internalType":"bytes","name":"newTargetUpgradeParameters","type":"bytes"}],"name":"upgradeTarget","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
[{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"targetInitializationParameters","type":"bytes"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"getMaster","outputs":[{"internalType":"address","name":"master","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"getNoticePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTarget","outputs":[{"internalType":"address","name":"target","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"isReadyForUpgrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newMaster","type":"address"}],"name":"transferMastership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"upgrade","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"upgradeCanceled","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"upgradeFinishes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"upgradeNoticePeriodStarted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"upgradePreparationStarted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newTarget","type":"address"},{"internalType":"bytes","name":"newTargetUpgradeParameters","type":"bytes"}],"name":"upgradeTarget","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

Proxy Bytecode

60806040523480156200001157600080fd5b506040516200109338038062001093833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b50604052505050336200010681620002b660201b60201c565b506200011b826001600160e01b03620002da16565b6000620001306001600160e01b03620002ed16565b6001600160a01b0316826040516024018080602001828103825283818151815260200191508051906020019080838360005b838110156200017c57818101518382015260200162000162565b50505050905090810190601f168015620001aa5780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180516001600160e01b031663439fab9160e01b178152905182519295509350839250908083835b60208310620002075780518252601f199092019160209182019101620001e6565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d806000811462000269576040519150601f19603f3d011682016040523d82523d6000602084013e6200026e565b606091505b5050905080620002ad576040805162461bcd60e51b815260206004820152600560248201526475696e313160d81b604482015290519081900360640190fd5b50505062000301565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6000805160206200107383398151915255565b600080516020620010738339815191525490565b610d6280620003116000396000f3fe6080604052600436106100a75760003560e01c806378b91e701161006457806378b91e70146102ce578063871b8ff1146102e35780638773334c146102f8578063b269b9ae14610321578063c3f5968714610336578063f00e6a2a14610369576100a7565b806325394645146100d85780632a3174f4146101575780633b154b731461017e578063439fab91146101935780635a99719e146102105780636fc4914014610241575b60006100b161037a565b905060405136600082376000803683855af43d806000843e8180156100d4578184f35b8184fd5b3480156100e457600080fd5b50610155600480360360208110156100fb57600080fd5b81019060208101813564010000000081111561011657600080fd5b82018360208201111561012857600080fd5b8035906020019184600183028401116401000000008311171561014a57600080fd5b50909250905061039f565b005b34801561016357600080fd5b5061016c6103d4565b60408051918252519081900360200190f35b34801561018a57600080fd5b50610155610506565b34801561019f57600080fd5b50610155600480360360208110156101b657600080fd5b8101906020810181356401000000008111156101d157600080fd5b8201836020820111156101e357600080fd5b8035906020019184600183028401116401000000008311171561020557600080fd5b509092509050610622565b34801561021c57600080fd5b50610225610657565b604080516001600160a01b039092168252519081900360200190f35b34801561024d57600080fd5b506101556004803603604081101561026457600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561028f57600080fd5b8201836020820111156102a157600080fd5b803590602001918460018302840111640100000000831117156102c357600080fd5b50909250905061067c565b3480156102da57600080fd5b506101556107dc565b3480156102ef57600080fd5b506101556108f5565b34801561030457600080fd5b5061030d610a0e565b604080519115158252519081900360200190f35b34801561032d57600080fd5b50610155610b22565b34801561034257600080fd5b506101556004803603602081101561035957600080fd5b50356001600160a01b0316610c3b565b34801561037557600080fd5b506102255b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6040805162461bcd60e51b8152602060048201526005602482015264757067313160d81b604482015290519081900360640190fd5b60008060606103e161037a565b60408051600481526024810182526020810180516001600160e01b0316630a8c5d3d60e21b178152915181516001600160a01b039490941693919290918291908083835b602083106104445780518252601f199092019160209182019101610425565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146104a4576040519150601f19603f3d011682016040523d82523d6000602084013e6104a9565b606091505b5091509150816104e8576040805162461bcd60e51b8152602060048201526005602482015264756e70313160d81b604482015290519081900360640190fd5b8080602001905160208110156104fd57600080fd5b50519250505090565b61050f33610c90565b600061051961037a565b60408051600481526024810182526020810180516001600160e01b0316633b154b7360e01b178152915181516001600160a01b039490941693919290918291908083835b6020831061057c5780518252601f19909201916020918201910161055d565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146105dc576040519150601f19603f3d011682016040523d82523d6000602084013e6105e1565b606091505b505090508061061f576040805162461bcd60e51b81526020600482015260056024820152646e7073313160d81b604482015290519081900360640190fd5b50565b6040805162461bcd60e51b8152602060048201526005602482015264696e69313160d81b604482015290519081900360640190fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b61068533610c90565b61068e83610ce5565b600061069861037a565b6001600160a01b031683836040516024018080602001828103825284848281815260200192508082843760008382015260408051601f909201601f1990811690940182810390940182529283526020810180516001600160e01b0316632539464560e01b17815292518151919750955085945091925081905083835b602083106107335780518252601f199092019160209182019101610714565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610793576040519150601f19603f3d011682016040523d82523d6000602084013e610798565b606091505b50509050806107d6576040805162461bcd60e51b8152602060048201526005602482015264756675313160d81b604482015290519081900360640190fd5b50505050565b6107e533610c90565b60006107ef61037a565b60408051600481526024810182526020810180516001600160e01b031663078b91e760e41b178152915181516001600160a01b039490941693919290918291908083835b602083106108525780518252601f199092019160209182019101610833565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146108b2576040519150601f19603f3d011682016040523d82523d6000602084013e6108b7565b606091505b505090508061061f576040805162461bcd60e51b8152602060048201526005602482015264757073313160d81b604482015290519081900360640190fd5b6108fe33610c90565b600061090861037a565b60408051600481526024810182526020810180516001600160e01b031663871b8ff160e01b178152915181516001600160a01b039490941693919290918291908083835b6020831061096b5780518252601f19909201916020918201910161094c565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146109cb576040519150601f19603f3d011682016040523d82523d6000602084013e6109d0565b606091505b505090508061061f576040805162461bcd60e51b8152602060048201526005602482015264707563313160d81b604482015290519081900360640190fd5b6000806060610a1b61037a565b60408051600481526024810182526020810180516001600160e01b03166321dcccd360e21b178152915181516001600160a01b039490941693919290918291908083835b60208310610a7e5780518252601f199092019160209182019101610a5f565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610ade576040519150601f19603f3d011682016040523d82523d6000602084013e610ae3565b606091505b5091509150816104e8576040805162461bcd60e51b8152602060048201526005602482015264726675313160d81b604482015290519081900360640190fd5b610b2b33610c90565b6000610b3561037a565b60408051600481526024810182526020810180516001600160e01b0316635934dcd760e11b178152915181516001600160a01b039490941693919290918291908083835b60208310610b985780518252601f199092019160209182019101610b79565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610bf8576040519150601f19603f3d011682016040523d82523d6000602084013e610bfd565b606091505b505090508061061f576040805162461bcd60e51b8152602060048201526005602482015264707566313160d81b604482015290519081900360640190fd5b610c4433610c90565b6001600160a01b038116610c87576040805162461bcd60e51b81526020600482015260056024820152646f7470313160d81b604482015290519081900360640190fd5b61061f81610d09565b610c98610657565b6001600160a01b0316816001600160a01b03161461061f576040805162461bcd60e51b81526020600482015260056024820152646f726f313160d81b604482015290519081900360640190fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035556fea265627a7a72315820e35c5cfa91cad67252199f8138df65c2cd9e57899d2525068cf6a0790639b42464736f6c63430005100032360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc00000000000000000000000056153eb06ff6ee8b777dc073c4a84727161ca1050000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000034460c0eb5074c29a9f6fe13b8e7e23a0d08af010000000000000000000000005290e9582b4fb706eadf87bb1c129e897e04d06d097953812ba8f7575e9074bc0fd0ee7bee839a634a9f3f79c4e72a6df0caf00f
60806040523480156200001157600080fd5b506040516200109338038062001093833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b50604052505050336200010681620002b660201b60201c565b506200011b826001600160e01b03620002da16565b6000620001306001600160e01b03620002ed16565b6001600160a01b0316826040516024018080602001828103825283818151815260200191508051906020019080838360005b838110156200017c57818101518382015260200162000162565b50505050905090810190601f168015620001aa5780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180516001600160e01b031663439fab9160e01b178152905182519295509350839250908083835b60208310620002075780518252601f199092019160209182019101620001e6565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d806000811462000269576040519150601f19603f3d011682016040523d82523d6000602084013e6200026e565b606091505b5050905080620002ad576040805162461bcd60e51b815260206004820152600560248201526475696e313160d81b604482015290519081900360640190fd5b50505062000301565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6000805160206200107383398151915255565b600080516020620010738339815191525490565b610d6280620003116000396000f3fe6080604052600436106100a75760003560e01c806378b91e701161006457806378b91e70146102ce578063871b8ff1146102e35780638773334c146102f8578063b269b9ae14610321578063c3f5968714610336578063f00e6a2a14610369576100a7565b806325394645146100d85780632a3174f4146101575780633b154b731461017e578063439fab91146101935780635a99719e146102105780636fc4914014610241575b60006100b161037a565b905060405136600082376000803683855af43d806000843e8180156100d4578184f35b8184fd5b3480156100e457600080fd5b50610155600480360360208110156100fb57600080fd5b81019060208101813564010000000081111561011657600080fd5b82018360208201111561012857600080fd5b8035906020019184600183028401116401000000008311171561014a57600080fd5b50909250905061039f565b005b34801561016357600080fd5b5061016c6103d4565b60408051918252519081900360200190f35b34801561018a57600080fd5b50610155610506565b34801561019f57600080fd5b50610155600480360360208110156101b657600080fd5b8101906020810181356401000000008111156101d157600080fd5b8201836020820111156101e357600080fd5b8035906020019184600183028401116401000000008311171561020557600080fd5b509092509050610622565b34801561021c57600080fd5b50610225610657565b604080516001600160a01b039092168252519081900360200190f35b34801561024d57600080fd5b506101556004803603604081101561026457600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561028f57600080fd5b8201836020820111156102a157600080fd5b803590602001918460018302840111640100000000831117156102c357600080fd5b50909250905061067c565b3480156102da57600080fd5b506101556107dc565b3480156102ef57600080fd5b506101556108f5565b34801561030457600080fd5b5061030d610a0e565b604080519115158252519081900360200190f35b34801561032d57600080fd5b50610155610b22565b34801561034257600080fd5b506101556004803603602081101561035957600080fd5b50356001600160a01b0316610c3b565b34801561037557600080fd5b506102255b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6040805162461bcd60e51b8152602060048201526005602482015264757067313160d81b604482015290519081900360640190fd5b60008060606103e161037a565b60408051600481526024810182526020810180516001600160e01b0316630a8c5d3d60e21b178152915181516001600160a01b039490941693919290918291908083835b602083106104445780518252601f199092019160209182019101610425565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146104a4576040519150601f19603f3d011682016040523d82523d6000602084013e6104a9565b606091505b5091509150816104e8576040805162461bcd60e51b8152602060048201526005602482015264756e70313160d81b604482015290519081900360640190fd5b8080602001905160208110156104fd57600080fd5b50519250505090565b61050f33610c90565b600061051961037a565b60408051600481526024810182526020810180516001600160e01b0316633b154b7360e01b178152915181516001600160a01b039490941693919290918291908083835b6020831061057c5780518252601f19909201916020918201910161055d565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146105dc576040519150601f19603f3d011682016040523d82523d6000602084013e6105e1565b606091505b505090508061061f576040805162461bcd60e51b81526020600482015260056024820152646e7073313160d81b604482015290519081900360640190fd5b50565b6040805162461bcd60e51b8152602060048201526005602482015264696e69313160d81b604482015290519081900360640190fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b61068533610c90565b61068e83610ce5565b600061069861037a565b6001600160a01b031683836040516024018080602001828103825284848281815260200192508082843760008382015260408051601f909201601f1990811690940182810390940182529283526020810180516001600160e01b0316632539464560e01b17815292518151919750955085945091925081905083835b602083106107335780518252601f199092019160209182019101610714565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610793576040519150601f19603f3d011682016040523d82523d6000602084013e610798565b606091505b50509050806107d6576040805162461bcd60e51b8152602060048201526005602482015264756675313160d81b604482015290519081900360640190fd5b50505050565b6107e533610c90565b60006107ef61037a565b60408051600481526024810182526020810180516001600160e01b031663078b91e760e41b178152915181516001600160a01b039490941693919290918291908083835b602083106108525780518252601f199092019160209182019101610833565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146108b2576040519150601f19603f3d011682016040523d82523d6000602084013e6108b7565b606091505b505090508061061f576040805162461bcd60e51b8152602060048201526005602482015264757073313160d81b604482015290519081900360640190fd5b6108fe33610c90565b600061090861037a565b60408051600481526024810182526020810180516001600160e01b031663871b8ff160e01b178152915181516001600160a01b039490941693919290918291908083835b6020831061096b5780518252601f19909201916020918201910161094c565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146109cb576040519150601f19603f3d011682016040523d82523d6000602084013e6109d0565b606091505b505090508061061f576040805162461bcd60e51b8152602060048201526005602482015264707563313160d81b604482015290519081900360640190fd5b6000806060610a1b61037a565b60408051600481526024810182526020810180516001600160e01b03166321dcccd360e21b178152915181516001600160a01b039490941693919290918291908083835b60208310610a7e5780518252601f199092019160209182019101610a5f565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610ade576040519150601f19603f3d011682016040523d82523d6000602084013e610ae3565b606091505b5091509150816104e8576040805162461bcd60e51b8152602060048201526005602482015264726675313160d81b604482015290519081900360640190fd5b610b2b33610c90565b6000610b3561037a565b60408051600481526024810182526020810180516001600160e01b0316635934dcd760e11b178152915181516001600160a01b039490941693919290918291908083835b60208310610b985780518252601f199092019160209182019101610b79565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610bf8576040519150601f19603f3d011682016040523d82523d6000602084013e610bfd565b606091505b505090508061061f576040805162461bcd60e51b8152602060048201526005602482015264707566313160d81b604482015290519081900360640190fd5b610c4433610c90565b6001600160a01b038116610c87576040805162461bcd60e51b81526020600482015260056024820152646f7470313160d81b604482015290519081900360640190fd5b61061f81610d09565b610c98610657565b6001600160a01b0316816001600160a01b03161461061f576040805162461bcd60e51b81526020600482015260056024820152646f726f313160d81b604482015290519081900360640190fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035556fea265627a7a72315820e35c5cfa91cad67252199f8138df65c2cd9e57899d2525068cf6a0790639b42464736f6c63430005100032360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc00000000000000000000000056153eb06ff6ee8b777dc073c4a84727161ca1050000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000034460c0eb5074c29a9f6fe13b8e7e23a0d08af010000000000000000000000005290e9582b4fb706eadf87bb1c129e897e04d06d097953812ba8f7575e9074bc0fd0ee7bee839a634a9f3f79c4e72a6df0caf00f

Check out more smart contracts

Build blockchain magic with Alchemy

Alchemy combines the most powerful web3 developer products and tools with resources, community and legendary support.