ETH Price: $2,021.37 (-2.28%)

Contract

0xa1074eA92135393e695F67Fbd82B097A70296086
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PermanentStorage

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 1 of 3: PermanentStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.5;

import "./IPermanentStorage.sol";
import "./PSStorage.sol";

contract PermanentStorage is IPermanentStorage {

    // Constants do not have storage slot.
    bytes32 public constant curveTokenIndexStorageId = 0xf4c750cdce673f6c35898d215e519b86e3846b1f0532fb48b84fe9d80f6de2fc; // keccak256("curveTokenIndex")
    bytes32 public constant transactionSeenStorageId = 0x695d523b8578c6379a2121164fd8de334b9c5b6b36dff5408bd4051a6b1704d0;  // keccak256("transactionSeen")
    bytes32 public constant relayerValidStorageId = 0x2c97779b4deaf24e9d46e02ec2699240a957d92782b51165b93878b09dd66f61;  // keccak256("relayerValid")

    // Below are the variables which consume storage slots.
    address public operator;
    string public version;  // Current version of the contract
    mapping(bytes32 => mapping(address => bool)) private permission;


    /************************************************************
    *          Access control and ownership management          *
    *************************************************************/
    modifier onlyOperator() {
        require(operator == msg.sender, "PermanentStorage: not the operator");
        _;
    }

    modifier validRole(bool _enabled, address _role) {
        if (_enabled) {
            require(
                (_role == operator) || (_role == ammWrapperAddr()) || (_role == pmmAddr()),
                "PermanentStorage: not a valid role"
            );
        }
        _;
    }

    modifier isPermitted(bytes32 _storageId, address _role) {
        require(permission[_storageId][_role], "PermanentStorage: has no permission");
        _;
    }


    function transferOwnership(address _newOperator) external onlyOperator {
        require(_newOperator != address(0), "PermanentStorage: operator can not be zero address");
        operator = _newOperator;
    }

    /// @dev Set permission for entity to write certain storage.
    function setPermission(bytes32 _storageId, address _role, bool _enabled) external onlyOperator validRole(_enabled, _role) {
        permission[_storageId][_role] = _enabled;
    }


    /************************************************************
    *              Constructor and init functions               *
    *************************************************************/
    /// @dev Replacing constructor and initialize the contract. This function should only be called once.
    function initialize(address _operator) external {
        require(
            keccak256(abi.encodePacked(version)) == keccak256(abi.encodePacked("")),
            "PermanentStorage: not upgrading from default version"
        );

        version = "5.0.0";
        operator = _operator;
    }


    /************************************************************
    *                     Getter functions                      *
    *************************************************************/
    function hasPermission(bytes32 _storageId, address _role) external view returns (bool) {
        return permission[_storageId][_role];
    }

    function ammWrapperAddr() public view returns (address) {
        return PSStorage.getStorage().ammWrapperAddr;
    }

    function pmmAddr() public view returns (address) {
        return PSStorage.getStorage().pmmAddr;
    }

    function wethAddr() override external view returns (address) {
        return PSStorage.getStorage().wethAddr;
    }

    function getCurveTokenIndex(address _makerAddr, address _assetAddr) override external view returns (int128) {
        return AMMWrapperStorage.getStorage().curveTokenIndexes[_makerAddr][_assetAddr];
    }

    function isTransactionSeen(bytes32 _transactionHash) override external view returns (bool) {
        return AMMWrapperStorage.getStorage().transactionSeen[_transactionHash];
    }

    function isRelayerValid(address _relayer) override external view returns (bool) {
        return AMMWrapperStorage.getStorage().relayerValid[_relayer];
    }


    /************************************************************
    *           Management functions for Operator               *
    *************************************************************/
    /// @dev Update AMMWrapper contract address.
    function upgradeAMMWrapper(address _newAMMWrapper) external onlyOperator {
        PSStorage.getStorage().ammWrapperAddr = _newAMMWrapper;
    }

    /// @dev Update PMM contract address.
    function upgradePMM(address _newPMM) external onlyOperator {
        PSStorage.getStorage().pmmAddr = _newPMM;
    }

    /// @dev Update WETH contract address.
    function upgradeWETH(address _newWETH) external onlyOperator {
        PSStorage.getStorage().wethAddr = _newWETH;
    }


    /************************************************************
    *                   External functions                      *
    *************************************************************/
    function setCurveTokenIndex(address _makerAddr, address[] calldata _assetAddrs) override external isPermitted(curveTokenIndexStorageId, msg.sender) {
        int128 tokenLength = int128(_assetAddrs.length);
        for (int128 i = 0 ; i < tokenLength; i++) {
            address assetAddr = _assetAddrs[uint256(i)];
            AMMWrapperStorage.getStorage().curveTokenIndexes[_makerAddr][assetAddr] = i;
        }
    }

    function setTransactionSeen(bytes32 _transactionHash) override external isPermitted(transactionSeenStorageId, msg.sender) {
        AMMWrapperStorage.getStorage().transactionSeen[_transactionHash] = true;
    }

    function setRelayersValid(address[] calldata _relayers, bool[] calldata _isValids) override external isPermitted(relayerValidStorageId, msg.sender) {
        require(_relayers.length == _isValids.length, "PermanentStorage: inputs length mismatch");
        for (uint256 i = 0; i < _relayers.length; i++) {
            AMMWrapperStorage.getStorage().relayerValid[_relayers[i]] = _isValids[i];
        }
    }
}

File 2 of 3: IPermanentStorage.sol
pragma solidity ^0.6.0;

interface IPermanentStorage {
    function wethAddr() external view returns (address);
    function getCurveTokenIndex(address _makerAddr, address _assetAddr) external view returns (int128);
    function setCurveTokenIndex(address _makerAddr, address[] calldata _assetAddrs) external;
    function isTransactionSeen(bytes32 _transactionHash) external view returns (bool);
    function isRelayerValid(address _relayer) external view returns (bool);
    function setTransactionSeen(bytes32 _transactionHash) external;
    function setRelayersValid(address[] memory _relayers, bool[] memory _isValids) external;
}

File 3 of 3: PSStorage.sol
pragma solidity ^0.6.5;
pragma experimental ABIEncoderV2;

library PSStorage {
    bytes32 private constant STORAGE_SLOT = 0x92dd52b981a2dd69af37d8a3febca29ed6a974aede38ae66e4ef773173aba471;

    struct Storage {
        address ammWrapperAddr;
        address pmmAddr;
        address wethAddr;
    }

    /// @dev Get the storage bucket for this contract.
    function getStorage() internal pure returns (Storage storage stor) {
        assert(STORAGE_SLOT == bytes32(uint256(keccak256("permanent.storage.storage")) - 1));
        bytes32 slot = STORAGE_SLOT;

        // Dip into assembly to change the slot pointed to by the local
        // variable `stor`.
        // See https://solidity.readthedocs.io/en/v0.6.8/assembly.html?highlight=slot#access-to-external-variables-functions-and-libraries
        assembly { stor_slot := slot }
    }
}

library AMMWrapperStorage {
    bytes32 private constant STORAGE_SLOT = 0xd38d862c9fa97c2fa857a46e08022d272a3579c114ca4f335f1e5fcb692c045e;

    struct Storage {
        mapping(bytes32 => bool) transactionSeen;
        mapping(address => mapping(address => int128)) curveTokenIndexes;
        mapping(address => bool) relayerValid;
    }

    /// @dev Get the storage bucket for this contract.
    function getStorage() internal pure returns (Storage storage stor) {
        assert(STORAGE_SLOT == bytes32(uint256(keccak256("permanent.ammwrapper.storage")) - 1));
        bytes32 slot = STORAGE_SLOT;

        // Dip into assembly to change the slot pointed to by the local
        // variable `stor`.
        // See https://solidity.readthedocs.io/en/v0.6.8/assembly.html?highlight=slot#access-to-external-variables-functions-and-libraries
        assembly { stor_slot := slot }
    }
}

library PMMStorage {
    bytes32 private constant STORAGE_SLOT = 0xf9faf013fe1696003dca3723ade1a1b88f21762ea39d9dfa2c55c5bd9c4ae6e9;

    struct Storage {
        mapping(bytes32 => address) transactions;
    }

    /// @dev Get the storage bucket for this contract.
    function getStorage() internal pure returns (Storage storage stor) {
        assert(STORAGE_SLOT == bytes32(uint256(keccak256("permanent.pmm.storage")) - 1));
        bytes32 slot = STORAGE_SLOT;

        // Dip into assembly to change the slot pointed to by the local
        // variable `stor`.
        // See https://solidity.readthedocs.io/en/v0.6.8/assembly.html?highlight=slot#access-to-external-variables-functions-and-libraries
        assembly { stor_slot := slot }
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"name":"ammWrapperAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curveTokenIndexStorageId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_makerAddr","type":"address"},{"internalType":"address","name":"_assetAddr","type":"address"}],"name":"getCurveTokenIndex","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_storageId","type":"bytes32"},{"internalType":"address","name":"_role","type":"address"}],"name":"hasPermission","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_relayer","type":"address"}],"name":"isRelayerValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_transactionHash","type":"bytes32"}],"name":"isTransactionSeen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pmmAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"relayerValidStorageId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_makerAddr","type":"address"},{"internalType":"address[]","name":"_assetAddrs","type":"address[]"}],"name":"setCurveTokenIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_storageId","type":"bytes32"},{"internalType":"address","name":"_role","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_relayers","type":"address[]"},{"internalType":"bool[]","name":"_isValids","type":"bool[]"}],"name":"setRelayersValid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_transactionHash","type":"bytes32"}],"name":"setTransactionSeen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transactionSeenStorageId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOperator","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAMMWrapper","type":"address"}],"name":"upgradeAMMWrapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPMM","type":"address"}],"name":"upgradePMM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWETH","type":"address"}],"name":"upgradeWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wethAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b50611133806100206000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c80637ecb557a116100d8578063c4d66de81161008c578063e4e266e911610066578063e4e266e914610526578063e7cc2c8e1461052e578063f2fde38b1461055457610177565b8063c4d66de81461049e578063d1498b61146104c4578063d8dd97fb1461050957610177565b80639a69e734116100bd5780639a69e7341461040e578063a485736414610416578063b6f732ae1461049657610177565b80637ecb557a146103e05780638014bd971461040657610177565b8063570ca7351161012f578063676ff9cf11610114578063676ff9cf14610398578063723ca616146103be5780637d5aa5f4146103d857610177565b8063570ca73514610340578063599e4c701461036457610177565b806331f42f8e1161016057806331f42f8e146101e257806354f0bc79146101ff57806354fd4d50146102c357610177565b806328545c0d1461017c5780632feeea3a146101bc575b600080fd5b6101a86004803603604081101561019257600080fd5b50803590602001356001600160a01b031661057a565b604080519115158252519081900360200190f35b6101a8600480360360208110156101d257600080fd5b50356001600160a01b03166105a5565b6101a8600480360360208110156101f857600080fd5b50356105d4565b6102c16004803603604081101561021557600080fd5b81019060208101813564010000000081111561023057600080fd5b82018360208201111561024257600080fd5b8035906020019184602083028401116401000000008311171561026457600080fd5b91939092909160208101903564010000000081111561028257600080fd5b82018360208201111561029457600080fd5b803590602001918460208302840111640100000000831117156102b657600080fd5b5090925090506105f2565b005b6102cb61073b565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103055781810151838201526020016102ed565b50505050905090810190601f1680156103325780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103486107c8565b604080516001600160a01b039092168252519081900360200190f35b6102c16004803603606081101561037a57600080fd5b508035906001600160a01b03602082013516906040013515156107d7565b6102c1600480360360208110156103ae57600080fd5b50356001600160a01b03166108f1565b6103c6610967565b60408051918252519081900360200190f35b61034861098b565b6102c1600480360360208110156103f657600080fd5b50356001600160a01b03166109a7565b610348610a1a565b6103c6610a36565b6102c16004803603604081101561042c57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561045757600080fd5b82018360208201111561046957600080fd5b8035906020019184602083028401116401000000008311171561048b57600080fd5b509092509050610a5a565b610348610b9e565b6102c1600480360360208110156104b457600080fd5b50356001600160a01b0316610bb7565b6104f2600480360360408110156104da57600080fd5b506001600160a01b0381358116916020013516610ceb565b60408051600f9290920b8252519081900360200190f35b6102c16004803603602081101561051f57600080fd5b5035610d28565b6103c6610de3565b6102c16004803603602081101561054457600080fd5b50356001600160a01b0316610e07565b6102c16004803603602081101561056a57600080fd5b50356001600160a01b0316610e7d565b60009182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60006105af610f2d565b6001600160a01b03929092166000908152600290920160205250604090205460ff1690565b60006105de610f2d565b600092835260205250604090205460ff1690565b3360008181527f5d870303c431e6d36139ba5242eb8ff20cdc3a6fb8ce8e2e4557687eef8fc0d160205260409020547f2c97779b4deaf24e9d46e02ec2699240a957d92782b51165b93878b09dd66f61919060ff166106825760405162461bcd60e51b81526004018080602001828103825260238152602001806110a96023913960400191505060405180910390fd5b8483146106c05760405162461bcd60e51b81526004018080602001828103825260288152602001806110096028913960400191505060405180910390fd5b60005b85811015610732578484828181106106d757fe5b9050602002013515156106e8610f2d565b60020160008989858181106106f957fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff19169115159190911790556001016106c3565b50505050505050565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b505050505081565b6000546001600160a01b031681565b6000546001600160a01b031633146108205760405162461bcd60e51b81526004018080602001828103825260228152602001806110656022913960400191505060405180910390fd5b808281156108ba576000546001600160a01b038281169116148061085c5750610847610b9e565b6001600160a01b0316816001600160a01b0316145b8061087f575061086a610a1a565b6001600160a01b0316816001600160a01b0316145b6108ba5760405162461bcd60e51b81526004018080602001828103825260228152602001806110876022913960400191505060405180910390fd5b505060009283526002602090815260408085206001600160a01b039490941685529290529120805460ff1916911515919091179055565b6000546001600160a01b0316331461093a5760405162461bcd60e51b81526004018080602001828103825260228152602001806110656022913960400191505060405180910390fd5b80610943610f51565b60020180546001600160a01b0319166001600160a01b039290921691909117905550565b7f2c97779b4deaf24e9d46e02ec2699240a957d92782b51165b93878b09dd66f6181565b6000610995610f51565b600201546001600160a01b0316905090565b6000546001600160a01b031633146109f05760405162461bcd60e51b81526004018080602001828103825260228152602001806110656022913960400191505060405180910390fd5b806109f9610f51565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6000610a24610f51565b600101546001600160a01b0316905090565b7f695d523b8578c6379a2121164fd8de334b9c5b6b36dff5408bd4051a6b1704d081565b3360008181527f167956591df432401c2bb34aca57b58f945baf26fdec2c15edae08f4a2f06bed60205260409020547ff4c750cdce673f6c35898d215e519b86e3846b1f0532fb48b84fe9d80f6de2fc919060ff16610aea5760405162461bcd60e51b81526004018080602001828103825260238152602001806110a96023913960400191505060405180910390fd5b8260005b81600f0b81600f0b1215610732576000868683600f0b818110610b0d57fe5b905060200201356001600160a01b0316905081610b28610f2d565b6001600160a01b03808b166000908152600192830160209081526040808320969093168252949094529092208054600f9290920b6fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905501610aee565b6000610ba8610f51565b546001600160a01b0316905090565b6040805160008152602081018083528151902060018054919390920190819083906002600019610100838516150201909116048015610c2d5780601f10610c0b576101008083540402835291820191610c2d565b820191906000526020600020905b815481529060010190602001808311610c19575b50509150506040516020818303038152906040528051906020012014610c845760405162461bcd60e51b81526004018080602001828103825260348152602001806110316034913960400191505060405180910390fd5b6040805180820190915260058082527f352e302e300000000000000000000000000000000000000000000000000000006020909201918252610cc891600191610f75565b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000610cf5610f2d565b6001600160a01b0393841660009081526001919091016020908152604080832094909516825292909252502054600f0b90565b3360008181527f5a18bce76b80e4d4ce74360cf8c2ecc0cc16abd99c9fa544ea9e4efc857ede1b60205260409020547f695d523b8578c6379a2121164fd8de334b9c5b6b36dff5408bd4051a6b1704d0919060ff16610db85760405162461bcd60e51b81526004018080602001828103825260238152602001806110a96023913960400191505060405180910390fd5b6001610dc2610f2d565b60009485526020526040909320805460ff1916931515939093179092555050565b7ff4c750cdce673f6c35898d215e519b86e3846b1f0532fb48b84fe9d80f6de2fc81565b6000546001600160a01b03163314610e505760405162461bcd60e51b81526004018080602001828103825260228152602001806110656022913960400191505060405180910390fd5b80610e59610f51565b60010180546001600160a01b0319166001600160a01b039290921691909117905550565b6000546001600160a01b03163314610ec65760405162461bcd60e51b81526004018080602001828103825260228152602001806110656022913960400191505060405180910390fd5b6001600160a01b038116610f0b5760405162461bcd60e51b81526004018080602001828103825260328152602001806110cc6032913960400191505060405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b7fd38d862c9fa97c2fa857a46e08022d272a3579c114ca4f335f1e5fcb692c045e90565b7f92dd52b981a2dd69af37d8a3febca29ed6a974aede38ae66e4ef773173aba47190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610fb657805160ff1916838001178555610fe3565b82800160010185558215610fe3579182015b82811115610fe3578251825591602001919060010190610fc8565b50610fef929150610ff3565b5090565b5b80821115610fef5760008155600101610ff456fe5065726d616e656e7453746f726167653a20696e70757473206c656e677468206d69736d617463685065726d616e656e7453746f726167653a206e6f7420757067726164696e672066726f6d2064656661756c742076657273696f6e5065726d616e656e7453746f726167653a206e6f7420746865206f70657261746f725065726d616e656e7453746f726167653a206e6f7420612076616c696420726f6c655065726d616e656e7453746f726167653a20686173206e6f207065726d697373696f6e5065726d616e656e7453746f726167653a206f70657261746f722063616e206e6f74206265207a65726f2061646472657373a2646970667358221220e883adaf94028d45d769b50fa144f4912633bfc9465055968f00ed115493691064736f6c634300060c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101775760003560e01c80637ecb557a116100d8578063c4d66de81161008c578063e4e266e911610066578063e4e266e914610526578063e7cc2c8e1461052e578063f2fde38b1461055457610177565b8063c4d66de81461049e578063d1498b61146104c4578063d8dd97fb1461050957610177565b80639a69e734116100bd5780639a69e7341461040e578063a485736414610416578063b6f732ae1461049657610177565b80637ecb557a146103e05780638014bd971461040657610177565b8063570ca7351161012f578063676ff9cf11610114578063676ff9cf14610398578063723ca616146103be5780637d5aa5f4146103d857610177565b8063570ca73514610340578063599e4c701461036457610177565b806331f42f8e1161016057806331f42f8e146101e257806354f0bc79146101ff57806354fd4d50146102c357610177565b806328545c0d1461017c5780632feeea3a146101bc575b600080fd5b6101a86004803603604081101561019257600080fd5b50803590602001356001600160a01b031661057a565b604080519115158252519081900360200190f35b6101a8600480360360208110156101d257600080fd5b50356001600160a01b03166105a5565b6101a8600480360360208110156101f857600080fd5b50356105d4565b6102c16004803603604081101561021557600080fd5b81019060208101813564010000000081111561023057600080fd5b82018360208201111561024257600080fd5b8035906020019184602083028401116401000000008311171561026457600080fd5b91939092909160208101903564010000000081111561028257600080fd5b82018360208201111561029457600080fd5b803590602001918460208302840111640100000000831117156102b657600080fd5b5090925090506105f2565b005b6102cb61073b565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103055781810151838201526020016102ed565b50505050905090810190601f1680156103325780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103486107c8565b604080516001600160a01b039092168252519081900360200190f35b6102c16004803603606081101561037a57600080fd5b508035906001600160a01b03602082013516906040013515156107d7565b6102c1600480360360208110156103ae57600080fd5b50356001600160a01b03166108f1565b6103c6610967565b60408051918252519081900360200190f35b61034861098b565b6102c1600480360360208110156103f657600080fd5b50356001600160a01b03166109a7565b610348610a1a565b6103c6610a36565b6102c16004803603604081101561042c57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561045757600080fd5b82018360208201111561046957600080fd5b8035906020019184602083028401116401000000008311171561048b57600080fd5b509092509050610a5a565b610348610b9e565b6102c1600480360360208110156104b457600080fd5b50356001600160a01b0316610bb7565b6104f2600480360360408110156104da57600080fd5b506001600160a01b0381358116916020013516610ceb565b60408051600f9290920b8252519081900360200190f35b6102c16004803603602081101561051f57600080fd5b5035610d28565b6103c6610de3565b6102c16004803603602081101561054457600080fd5b50356001600160a01b0316610e07565b6102c16004803603602081101561056a57600080fd5b50356001600160a01b0316610e7d565b60009182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60006105af610f2d565b6001600160a01b03929092166000908152600290920160205250604090205460ff1690565b60006105de610f2d565b600092835260205250604090205460ff1690565b3360008181527f5d870303c431e6d36139ba5242eb8ff20cdc3a6fb8ce8e2e4557687eef8fc0d160205260409020547f2c97779b4deaf24e9d46e02ec2699240a957d92782b51165b93878b09dd66f61919060ff166106825760405162461bcd60e51b81526004018080602001828103825260238152602001806110a96023913960400191505060405180910390fd5b8483146106c05760405162461bcd60e51b81526004018080602001828103825260288152602001806110096028913960400191505060405180910390fd5b60005b85811015610732578484828181106106d757fe5b9050602002013515156106e8610f2d565b60020160008989858181106106f957fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff19169115159190911790556001016106c3565b50505050505050565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b505050505081565b6000546001600160a01b031681565b6000546001600160a01b031633146108205760405162461bcd60e51b81526004018080602001828103825260228152602001806110656022913960400191505060405180910390fd5b808281156108ba576000546001600160a01b038281169116148061085c5750610847610b9e565b6001600160a01b0316816001600160a01b0316145b8061087f575061086a610a1a565b6001600160a01b0316816001600160a01b0316145b6108ba5760405162461bcd60e51b81526004018080602001828103825260228152602001806110876022913960400191505060405180910390fd5b505060009283526002602090815260408085206001600160a01b039490941685529290529120805460ff1916911515919091179055565b6000546001600160a01b0316331461093a5760405162461bcd60e51b81526004018080602001828103825260228152602001806110656022913960400191505060405180910390fd5b80610943610f51565b60020180546001600160a01b0319166001600160a01b039290921691909117905550565b7f2c97779b4deaf24e9d46e02ec2699240a957d92782b51165b93878b09dd66f6181565b6000610995610f51565b600201546001600160a01b0316905090565b6000546001600160a01b031633146109f05760405162461bcd60e51b81526004018080602001828103825260228152602001806110656022913960400191505060405180910390fd5b806109f9610f51565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6000610a24610f51565b600101546001600160a01b0316905090565b7f695d523b8578c6379a2121164fd8de334b9c5b6b36dff5408bd4051a6b1704d081565b3360008181527f167956591df432401c2bb34aca57b58f945baf26fdec2c15edae08f4a2f06bed60205260409020547ff4c750cdce673f6c35898d215e519b86e3846b1f0532fb48b84fe9d80f6de2fc919060ff16610aea5760405162461bcd60e51b81526004018080602001828103825260238152602001806110a96023913960400191505060405180910390fd5b8260005b81600f0b81600f0b1215610732576000868683600f0b818110610b0d57fe5b905060200201356001600160a01b0316905081610b28610f2d565b6001600160a01b03808b166000908152600192830160209081526040808320969093168252949094529092208054600f9290920b6fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905501610aee565b6000610ba8610f51565b546001600160a01b0316905090565b6040805160008152602081018083528151902060018054919390920190819083906002600019610100838516150201909116048015610c2d5780601f10610c0b576101008083540402835291820191610c2d565b820191906000526020600020905b815481529060010190602001808311610c19575b50509150506040516020818303038152906040528051906020012014610c845760405162461bcd60e51b81526004018080602001828103825260348152602001806110316034913960400191505060405180910390fd5b6040805180820190915260058082527f352e302e300000000000000000000000000000000000000000000000000000006020909201918252610cc891600191610f75565b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000610cf5610f2d565b6001600160a01b0393841660009081526001919091016020908152604080832094909516825292909252502054600f0b90565b3360008181527f5a18bce76b80e4d4ce74360cf8c2ecc0cc16abd99c9fa544ea9e4efc857ede1b60205260409020547f695d523b8578c6379a2121164fd8de334b9c5b6b36dff5408bd4051a6b1704d0919060ff16610db85760405162461bcd60e51b81526004018080602001828103825260238152602001806110a96023913960400191505060405180910390fd5b6001610dc2610f2d565b60009485526020526040909320805460ff1916931515939093179092555050565b7ff4c750cdce673f6c35898d215e519b86e3846b1f0532fb48b84fe9d80f6de2fc81565b6000546001600160a01b03163314610e505760405162461bcd60e51b81526004018080602001828103825260228152602001806110656022913960400191505060405180910390fd5b80610e59610f51565b60010180546001600160a01b0319166001600160a01b039290921691909117905550565b6000546001600160a01b03163314610ec65760405162461bcd60e51b81526004018080602001828103825260228152602001806110656022913960400191505060405180910390fd5b6001600160a01b038116610f0b5760405162461bcd60e51b81526004018080602001828103825260328152602001806110cc6032913960400191505060405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b7fd38d862c9fa97c2fa857a46e08022d272a3579c114ca4f335f1e5fcb692c045e90565b7f92dd52b981a2dd69af37d8a3febca29ed6a974aede38ae66e4ef773173aba47190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610fb657805160ff1916838001178555610fe3565b82800160010185558215610fe3579182015b82811115610fe3578251825591602001919060010190610fc8565b50610fef929150610ff3565b5090565b5b80821115610fef5760008155600101610ff456fe5065726d616e656e7453746f726167653a20696e70757473206c656e677468206d69736d617463685065726d616e656e7453746f726167653a206e6f7420757067726164696e672066726f6d2064656661756c742076657273696f6e5065726d616e656e7453746f726167653a206e6f7420746865206f70657261746f725065726d616e656e7453746f726167653a206e6f7420612076616c696420726f6c655065726d616e656e7453746f726167653a20686173206e6f207065726d697373696f6e5065726d616e656e7453746f726167653a206f70657261746f722063616e206e6f74206265207a65726f2061646472657373a2646970667358221220e883adaf94028d45d769b50fa144f4912633bfc9465055968f00ed115493691064736f6c634300060c0033

Deployed Bytecode Sourcemap

119:5876:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2954:140;;;;;;;;;;;;;;;;-1:-1:-1;2954:140:2;;;;;;-1:-1:-1;;;;;2954:140:2;;:::i;:::-;;;;;;;;;;;;;;;;;;3849:157;;;;;;;;;;;;;;;;-1:-1:-1;3849:157:2;-1:-1:-1;;;;;3849:157:2;;:::i;3664:179::-;;;;;;;;;;;;;;;;-1:-1:-1;3664:179:2;;:::i;5586:407::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5586:407:2;;-1:-1:-1;5586:407:2;-1:-1:-1;5586:407:2;:::i;:::-;;767:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;738:23;;;:::i;:::-;;;;-1:-1:-1;;;;;738:23:2;;;;;;;;;;;;;;1964:179;;;;;;;;;;;;;;;;-1:-1:-1;1964:179:2;;;-1:-1:-1;;;;;1964:179:2;;;;;;;;;;;;:::i;4618:120::-;;;;;;;;;;;;;;;;-1:-1:-1;4618:120:2;-1:-1:-1;;;;;4618:120:2;;:::i;527:114::-;;;:::i;:::-;;;;;;;;;;;;;;;;3332:116;;;:::i;4261:144::-;;;;;;;;;;;;;;;;-1:-1:-1;4261:144:2;-1:-1:-1;;;;;4261:144:2;;:::i;3223:103::-;;;:::i;371:117::-;;;:::i;4944:420::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4944:420:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4944:420:2;;-1:-1:-1;4944:420:2;-1:-1:-1;4944:420:2;:::i;3100:117::-;;;:::i;2455:293::-;;;;;;;;;;;;;;;;-1:-1:-1;2455:293:2;-1:-1:-1;;;;;2455:293:2;;:::i;3454:204::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3454:204:2;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;5370:210;;;;;;;;;;;;;;;;-1:-1:-1;5370:210:2;;:::i;216:117::-;;;:::i;4453:116::-;;;;;;;;;;;;;;;;-1:-1:-1;4453:116:2;-1:-1:-1;;;;;4453:116:2;;:::i;1683:210::-;;;;;;;;;;;;;;;;-1:-1:-1;1683:210:2;-1:-1:-1;;;;;1683:210:2;;:::i;2954:140::-;3035:4;3058:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3058:29:2;;;;;;;;;;;;;;;2954:140::o;3849:157::-;3923:4;3946:30;:28;:30::i;:::-;-1:-1:-1;;;;;3946:53:2;;;;;;;;:43;;;;:53;;-1:-1:-1;3946:53:2;;;;;;;3849:157::o;3664:179::-;3749:4;3772:30;:28;:30::i;:::-;:46;:64;;;;;-1:-1:-1;3772:64:2;;;;;;;3664:179::o;5586:407::-;5722:10;5699:21;1589:29;;;:22;;:29;:22;:29;;;575:66;;5722:10;1589:29;;1581:77;;;;-1:-1:-1;;;1581:77:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5752:36;;::::1;5744:89;;;;-1:-1:-1::0;;;5744:89:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5848:9;5843:144;5863:20:::0;;::::1;5843:144;;;5964:9;;5974:1;5964:12;;;;;;;;;;;;;;;5904:30;:28;:30::i;:::-;:43;;:57;5948:9;;5958:1;5948:12;;;;;;;;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;5948:12:2::1;5904:57:::0;;-1:-1:-1;5904:57:2;::::1;::::0;;;;;;-1:-1:-1;5904:57:2;:72;;-1:-1:-1;;5904:72:2::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;5885:3:2::1;5843:144;;;;5586:407:::0;;;;;;:::o;767:21::-;;;;;;;;;;;;;;;-1:-1:-1;;767:21:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;738:23::-;;;-1:-1:-1;;;;;738:23:2;;:::o;1964:179::-;1142:8;;-1:-1:-1;;;;;1142:8:2;1154:10;1142:22;1134:69;;;;-1:-1:-1;;;1134:69:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2069:8:::1;2079:5;1290:8;1286:206;;;1349:8;::::0;-1:-1:-1;;;;;1340:17:2;;::::1;1349:8:::0;::::1;1340:17;::::0;1339:50:::1;;;1372:16;:14;:16::i;:::-;-1:-1:-1::0;;;;;1363:25:2::1;:5;-1:-1:-1::0;;;;;1363:25:2::1;;1339:50;:74;;;;1403:9;:7;:9::i;:::-;-1:-1:-1::0;;;;;1394:18:2::1;:5;-1:-1:-1::0;;;;;1394:18:2::1;;1339:74;1314:167;;;;-1:-1:-1::0;;;1314:167:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;2096:22:2::2;::::0;;;:10:::2;:22;::::0;;;;;;;-1:-1:-1;;;;;2096:29:2;;;::::2;::::0;;;;;;;:40;;-1:-1:-1;;2096:40:2::2;::::0;::::2;;::::0;;;::::2;::::0;;1964:179::o;4618:120::-;1142:8;;-1:-1:-1;;;;;1142:8:2;1154:10;1142:22;1134:69;;;;-1:-1:-1;;;1134:69:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4723:8:::1;4689:22;:20;:22::i;:::-;:31;;:42:::0;;-1:-1:-1;;;;;;4689:42:2::1;-1:-1:-1::0;;;;;4689:42:2;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;4618:120:2:o;527:114::-;575:66;527:114;:::o;3332:116::-;3384:7;3410:22;:20;:22::i;:::-;:31;;;-1:-1:-1;;;;;3410:31:2;;-1:-1:-1;3332:116:2;:::o;4261:144::-;1142:8;;-1:-1:-1;;;;;1142:8:2;1154:10;1142:22;1134:69;;;;-1:-1:-1;;;1134:69:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4384:14:::1;4344:22;:20;:22::i;:::-;:54:::0;;-1:-1:-1;;;;;;4344:54:2::1;-1:-1:-1::0;;;;;4344:54:2;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;4261:144:2:o;3223:103::-;3263:7;3289:22;:20;:22::i;:::-;:30;;;-1:-1:-1;;;;;3289:30:2;;-1:-1:-1;3223:103:2;:::o;371:117::-;422:66;371:117;:::o;4944:420::-;5080:10;5054:24;1589:29;;;:22;;:29;:22;:29;;;267:66;;5080:10;1589:29;;1581:77;;;;-1:-1:-1;;;1581:77:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5130:11;5102:18:::1;5159:199;5183:11;5179:15;;:1;:15;;;5159:199;;;5215:17;5235:11;;5255:1;5247:10;;5235:23;;;;;;;;;;;;;-1:-1:-1::0;;;;;5235:23:2::1;5215:43;;5346:1;5272:30;:28;:30::i;:::-;-1:-1:-1::0;;;;;5272:60:2;;::::1;;::::0;;;:48:::1;::::0;;::::1;:60;::::0;;;;;;;:71;;;::::1;::::0;;;;;;;;;:75;;::::1;::::0;;;::::1;;;::::0;;;::::1;::::0;;;::::1;::::0;;5196:3:::1;5159:199;;3100:117:::0;3147:7;3173:22;:20;:22::i;:::-;:37;-1:-1:-1;;;;;3173:37:2;;-1:-1:-1;3100:117:2;:::o;2455:293::-;2584:20;;;;;;;;;;;;2574:31;;;;2561:7;2544:25;;2574:31;;2561:7;;2544:25;;;;2561:7;;2544:25;-1:-1:-1;;2544:25:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2534:36;;;;;;:71;2513:170;;;;-1:-1:-1;;;2513:170:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2694:17;;;;;;;;;;;;;;;;;;;;;;;:7;;:17;:::i;:::-;-1:-1:-1;2721:8:2;:20;;-1:-1:-1;;;;;;2721:20:2;-1:-1:-1;;;;;2721:20:2;;;;;;;;;;2455:293::o;3454:204::-;3554:6;3579:30;:28;:30::i;:::-;-1:-1:-1;;;;;3579:60:2;;;;;;;:48;;;;;:60;;;;;;;;:72;;;;;;;;;;-1:-1:-1;3579:72:2;;;;;3454:204::o;5370:210::-;5480:10;5454:24;1589:29;;;:22;;:29;:22;:29;;;422:66;;5480:10;1589:29;;1581:77;;;;-1:-1:-1;;;1581:77:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5569:4:::1;5502:30;:28;:30::i;:::-;:46;:64:::0;;;::::1;::::0;;;;;:71;;-1:-1:-1;;5502:71:2::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;;5370:210:2:o;216:117::-;267:66;216:117;:::o;4453:116::-;1142:8;;-1:-1:-1;;;;;1142:8:2;1154:10;1142:22;1134:69;;;;-1:-1:-1;;;1134:69:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4555:7:::1;4522:22;:20;:22::i;:::-;:30;;:40:::0;;-1:-1:-1;;;;;;4522:40:2::1;-1:-1:-1::0;;;;;4522:40:2;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;4453:116:2:o;1683:210::-;1142:8;;-1:-1:-1;;;;;1142:8:2;1154:10;1142:22;1134:69;;;;-1:-1:-1;;;1134:69:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1772:26:2;::::1;1764:89;;;;-1:-1:-1::0;;;1764:89:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1863:8;:23:::0;;-1:-1:-1;;;;;;1863:23:2::1;-1:-1:-1::0;;;;;1863:23:2;;;::::1;::::0;;;::::1;::::0;;1683:210::o;1249:487:1:-;922:66;;1709:21::o;362:484::-;123:66;;819:21::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;

Swarm Source

ipfs://e883adaf94028d45d769b50fa144f4912633bfc9465055968f00ed1154936910

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.