ETH Price: $2,183.40 (+4.14%)

Contract

0x0485C25A5E8D7d0c5676D0E6D3Bfc4aA597Ba0B0
 

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
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.5;

import "./interface/IPermanentStorage.sol";
import "./utils/lib_storage/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;

    // Supported Curve pools
    address public constant CURVE_COMPOUND_POOL = 0xA2B47E3D5c44877cca798226B7B8118F9BFb7A56;
    address public constant CURVE_USDT_POOL = 0x52EA46506B9CC5Ef470C5bf89f17Dc28bB35D85C;
    address public constant CURVE_Y_POOL = 0x45F783CCE6B7FF23B2ab2D70e416cdb7D6055f51;
    address public constant CURVE_3_POOL = 0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7;
    address public constant CURVE_sUSD_POOL = 0xA5407eAE9Ba41422680e2e00537571bcC53efBfD;
    address public constant CURVE_BUSD_POOL = 0x79a8C46DeA5aDa233ABaFFD40F3A0A2B1e5A4F27;

    // Curve coins
    address private constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
    address private constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
    address private constant cDAI = 0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643;
    address private constant cUSDC = 0x39AA39c021dfbaE8faC545936693aC917d5E7563;
    address private constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
    address private constant TUSD = 0x0000000000085d4780B73119b644AE5ecd22b376;
    address private constant Y_POOL_yDAI = 0x16de59092dAE5CcF4A1E6439D611fd0653f0Bd01;
    address private constant Y_POOL_yUSDC = 0xd6aD7a6750A7593E092a9B218d66C0A814a3436e;
    address private constant Y_POOL_yUSDT = 0x83f798e925BcD4017Eb265844FDDAbb448f1707D;
    address private constant Y_POOL_yTUSD = 0x73a052500105205d34Daf004eAb301916DA8190f;
    address private constant sUSD = 0x57Ab1ec28D129707052df4dF418D58a2D46d5f51;
    address private constant BUSD = 0x4Fabb145d64652a948d72533023f6E7A623C7C53;
    address private constant BUSD_POOL_yDAI = 0xC2cB1040220768554cf699b0d863A3cd4324ce32;
    address private constant BUSD_POOL_yUSDC = 0x26EA744E5B887E5205727f55dFBE8685e3b21951;
    address private constant BUSD_POOL_yUSDT = 0xE6354ed5bC4b393a5Aad09f21c46E101e692d447;
    address private constant BUSD_POOL_yBUSD = 0x04bC0Ab673d88aE9dbC9DA2380cB6B79C4BCa9aE;

    /************************************************************
    *          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() external {
        require(
            keccak256(abi.encodePacked(version)) == keccak256(abi.encodePacked("5.0.0")),
            "PermanentStorage: not upgrading from 5.0.0 version"
        );

        version = "5.1.0";
        // register Compound pool
        // underlying_coins, exchange_underlying
        AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_COMPOUND_POOL][DAI] = 1;
        AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_COMPOUND_POOL][USDC] = 2;
        // coins, exchange
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_COMPOUND_POOL][cDAI] = 1;
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_COMPOUND_POOL][cUSDC] = 2;
        AMMWrapperStorage.getStorage().curveSupportGetDx[CURVE_COMPOUND_POOL] = true; // support get_dx or get_dx_underlying for quoting

        // register USDT pool
        // underlying_coins, exchange_underlying
        AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_USDT_POOL][DAI] = 1;
        AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_USDT_POOL][USDC] = 2;
        AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_USDT_POOL][USDT] = 3;
        // coins, exchange
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_USDT_POOL][cDAI] = 1;
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_USDT_POOL][cUSDC] = 2;
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_USDT_POOL][USDT] = 3;
        AMMWrapperStorage.getStorage().curveSupportGetDx[CURVE_USDT_POOL] = true;

        // register Y pool
        // underlying_coins, exchange_underlying
        AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_Y_POOL][DAI] = 1;
        AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_Y_POOL][USDC] = 2;
        AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_Y_POOL][USDT] = 3;
        AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_Y_POOL][TUSD] = 4;
        // coins, exchange
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_Y_POOL][Y_POOL_yDAI] = 1;
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_Y_POOL][Y_POOL_yUSDC] = 2;
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_Y_POOL][Y_POOL_yUSDT] = 3;
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_Y_POOL][Y_POOL_yTUSD] = 4;
        AMMWrapperStorage.getStorage().curveSupportGetDx[CURVE_Y_POOL] = true;

        // register 3 pool
        // coins, exchange
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_3_POOL][DAI] = 1;
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_3_POOL][USDC] = 2;
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_3_POOL][USDT] = 3;
        AMMWrapperStorage.getStorage().curveSupportGetDx[CURVE_3_POOL] = false; // only support get_dy and get_dy_underlying for exactly the same functionality

        // register sUSD pool
        // coins, exchange
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_sUSD_POOL][DAI] = 1;
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_sUSD_POOL][USDC] = 2;
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_sUSD_POOL][USDT] = 3;
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_sUSD_POOL][sUSD] = 4;
        AMMWrapperStorage.getStorage().curveSupportGetDx[CURVE_sUSD_POOL] = false;

        // register BUSD pool
        // underlying_coins, exchange_underlying
        AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_BUSD_POOL][DAI] = 1;
        AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_BUSD_POOL][USDC] = 2;
        AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_BUSD_POOL][USDT] = 3;
        AMMWrapperStorage.getStorage().curveTokenIndexes[CURVE_BUSD_POOL][BUSD] = 4;
        // coins, exchange
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_BUSD_POOL][BUSD_POOL_yDAI] = 1;
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_BUSD_POOL][BUSD_POOL_yUSDC] = 2;
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_BUSD_POOL][BUSD_POOL_yUSDT] = 3;
        AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[CURVE_BUSD_POOL][BUSD_POOL_yBUSD] = 4;
        AMMWrapperStorage.getStorage().curveSupportGetDx[CURVE_BUSD_POOL] = true;
    }


    /************************************************************
    *                     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 getCurvePoolInfo(address _makerAddr, address _takerAssetAddr, address _makerAssetAddr) override external view returns (int128 takerAssetIndex, int128 makerAssetIndex, uint16 swapMethod, bool supportGetDx) {
        // underlying_coins
        int128 i = AMMWrapperStorage.getStorage().curveTokenIndexes[_makerAddr][_takerAssetAddr];
        int128 j = AMMWrapperStorage.getStorage().curveTokenIndexes[_makerAddr][_makerAssetAddr];
        supportGetDx = AMMWrapperStorage.getStorage().curveSupportGetDx[_makerAddr];

        swapMethod = 0;
        if (i != 0 && j != 0) {
            // in underlying_coins list
            takerAssetIndex = i;
            makerAssetIndex = j;
            // exchange_underlying
            swapMethod = 2;
        } else {
            // in coins list
            int128 iWrapped = AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[_makerAddr][_takerAssetAddr];
            int128 jWrapped = AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[_makerAddr][_makerAssetAddr];
            if (iWrapped != 0 && jWrapped != 0) {
                takerAssetIndex = iWrapped;
                makerAssetIndex = jWrapped;
                // exchange
                swapMethod = 1;
            } else {
                revert("PermanentStorage: invalid pair");
            }
        }
        return (takerAssetIndex, makerAssetIndex, swapMethod, supportGetDx);
    }

    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 setCurvePoolInfo(address _makerAddr, address[] calldata _underlyingCoins, address[] calldata _coins, bool _supportGetDx) override external isPermitted(curveTokenIndexStorageId, msg.sender) {
        int128 underlyingCoinsLength = int128(_underlyingCoins.length);
        for (int128 i = 0 ; i < underlyingCoinsLength; i++) {
            address assetAddr = _underlyingCoins[uint256(i)];
            // underlying coins for original DAI, USDC, TUSD
            AMMWrapperStorage.getStorage().curveTokenIndexes[_makerAddr][assetAddr] = i + 1;  // Start the index from 1
        }

        int128 coinsLength = int128(_coins.length);
        for (int128 i = 0 ; i < coinsLength; i++) {
            address assetAddr = _coins[uint256(i)];
            // wrapped coins for cDAI, cUSDC, yDAI, yUSDC, yTUSD, yBUSD
            AMMWrapperStorage.getStorage().curveWrappedTokenIndexes[_makerAddr][assetAddr] = i + 1;  // Start the index from 1
        }

        AMMWrapperStorage.getStorage().curveSupportGetDx[_makerAddr] = _supportGetDx;
    }

    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];
        }
    }
}

pragma solidity ^0.6.0;

interface IPermanentStorage {
    function wethAddr() external view returns (address);
    function getCurvePoolInfo(address _makerAddr, address _takerAssetAddr, address _makerAssetAddr) external view returns (int128 takerAssetIndex, int128 makerAssetIndex, uint16 swapMethod, bool supportGetDx);
    function setCurvePoolInfo(address _makerAddr, address[] calldata _underlyingCoins, address[] calldata _coins, bool _supportGetDx) 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;
}

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;
        // curve pool => underlying token address => underlying token index
        mapping(address => mapping(address => int128)) curveTokenIndexes;
        mapping(address => bool) relayerValid;
        // 5.1.0 appended storage
        // curve pool => wrapped token address => wrapped token index
        mapping(address => mapping(address => int128)) curveWrappedTokenIndexes;
        mapping(address => bool) curveSupportGetDx;
    }

    /// @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 }
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"name":"CURVE_3_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_BUSD_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_COMPOUND_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_USDT_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_Y_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_sUSD_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"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":"_takerAssetAddr","type":"address"},{"internalType":"address","name":"_makerAssetAddr","type":"address"}],"name":"getCurvePoolInfo","outputs":[{"internalType":"int128","name":"takerAssetIndex","type":"int128"},{"internalType":"int128","name":"makerAssetIndex","type":"int128"},{"internalType":"uint16","name":"swapMethod","type":"uint16"},{"internalType":"bool","name":"supportGetDx","type":"bool"}],"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":[],"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":"_underlyingCoins","type":"address[]"},{"internalType":"address[]","name":"_coins","type":"address[]"},{"internalType":"bool","name":"_supportGetDx","type":"bool"}],"name":"setCurvePoolInfo","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"}]

608060405234801561001057600080fd5b50612557806100206000396000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c80637ecb557a116100f9578063cb4f87fd11610097578063e4e266e911610071578063e4e266e9146105ea578063e7cc2c8e146105f2578063ebe4a4c314610618578063f2fde38b14610620576101b9565b8063cb4f87fd146104f1578063d8dd97fb146104f9578063dbd1a14a14610516576101b9565b80638ab4a8cc116100d35780638ab4a8cc146104705780639a69e734146104d95780639dbea840146104e1578063b6f732ae146104e9576101b9565b80637ecb557a1461043a5780638014bd97146104605780638129fc1c14610468576101b9565b806356463d0a11610166578063676ff9cf11610140578063676ff9cf146103ea578063711fe8b614610410578063723ca616146104185780637d5aa5f414610432576101b9565b806356463d0a146103a6578063570ca735146103ae578063599e4c70146103b6576101b9565b806331f42f8e1161019757806331f42f8e1461024857806354f0bc791461026557806354fd4d5014610329576101b9565b8063241291e8146101be57806328545c0d146101e25780632feeea3a14610222575b600080fd5b6101c6610646565b604080516001600160a01b039092168252519081900360200190f35b61020e600480360360408110156101f857600080fd5b50803590602001356001600160a01b031661065e565b604080519115158252519081900360200190f35b61020e6004803603602081101561023857600080fd5b50356001600160a01b0316610689565b61020e6004803603602081101561025e57600080fd5b50356106b8565b6103276004803603604081101561027b57600080fd5b81019060208101813564010000000081111561029657600080fd5b8201836020820111156102a857600080fd5b803590602001918460208302840111640100000000831117156102ca57600080fd5b9193909290916020810190356401000000008111156102e857600080fd5b8201836020820111156102fa57600080fd5b8035906020019184602083028401116401000000008311171561031c57600080fd5b5090925090506106d6565b005b61033161081f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036b578181015183820152602001610353565b50505050905090810190601f1680156103985780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101c66108ac565b6101c66108c4565b610327600480360360608110156103cc57600080fd5b508035906001600160a01b03602082013516906040013515156108d3565b6103276004803603602081101561040057600080fd5b50356001600160a01b03166109ed565b6101c6610a70565b610420610a88565b60408051918252519081900360200190f35b6101c6610aac565b6103276004803603602081101561045057600080fd5b50356001600160a01b0316610ac8565b6101c6610b48565b610327610b64565b6104a86004803603606081101561048657600080fd5b506001600160a01b038135811691602081013582169160409091013516611ce3565b60408051600f95860b81529390940b602084015261ffff909116828401521515606082015290519081900360800190f35b610420611eab565b6101c6611ecf565b6101c6611ee7565b6101c6611f00565b6103276004803603602081101561050f57600080fd5b5035611f18565b6103276004803603608081101561052c57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561055757600080fd5b82018360208201111561056957600080fd5b8035906020019184602083028401116401000000008311171561058b57600080fd5b9193909290916020810190356401000000008111156105a957600080fd5b8201836020820111156105bb57600080fd5b803590602001918460208302840111640100000000831117156105dd57600080fd5b9193509150351515611fd3565b6104206121d7565b6103276004803603602081101561060857600080fd5b50356001600160a01b03166121fb565b6101c661227e565b6103276004803603602081101561063657600080fd5b50356001600160a01b0316612296565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c81565b60009182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000610693612353565b6001600160a01b03929092166000908152600290920160205250604090205460ff1690565b60006106c2612353565b600092835260205250604090205460ff1690565b3360008181527f5d870303c431e6d36139ba5242eb8ff20cdc3a6fb8ce8e2e4557687eef8fc0d160205260409020547f2c97779b4deaf24e9d46e02ec2699240a957d92782b51165b93878b09dd66f61919060ff166107665760405162461bcd60e51b81526004018080602001828103825260238152602001806124cd6023913960400191505060405180910390fd5b8483146107a45760405162461bcd60e51b815260040180806020018281038252602881526020018061242f6028913960400191505060405180910390fd5b60005b85811015610816578484828181106107bb57fe5b9050602002013515156107cc612353565b60020160008989858181106107dd57fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff19169115159190911790556001016107a7565b50505050505050565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108a45780601f10610879576101008083540402835291602001916108a4565b820191906000526020600020905b81548152906001019060200180831161088757829003601f168201915b505050505081565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c781565b6000546001600160a01b031681565b6000546001600160a01b0316331461091c5760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b808281156109b6576000546001600160a01b03828116911614806109585750610943611ee7565b6001600160a01b0316816001600160a01b0316145b8061097b5750610966610b48565b6001600160a01b0316816001600160a01b0316145b6109b65760405162461bcd60e51b81526004018080602001828103825260228152602001806124ab6022913960400191505060405180910390fd5b505060009283526002602090815260408085206001600160a01b039490941685529290529120805460ff1916911515919091179055565b6000546001600160a01b03163314610a365760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b80610a3f612377565b600201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905550565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f5181565b7f2c97779b4deaf24e9d46e02ec2699240a957d92782b51165b93878b09dd66f6181565b6000610ab6612377565b600201546001600160a01b0316905090565b6000546001600160a01b03163314610b115760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b80610b1a612377565b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905550565b6000610b52612377565b600101546001600160a01b0316905090565b60405160200180807f352e302e3000000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040528051906020012060016040516020018082805460018160011615610100020316600290048015610c0b5780601f10610be9576101008083540402835291820191610c0b565b820191906000526020600020905b815481529060010190602001808311610bf7575b50509150506040516020818303038152906040528051906020012014610c625760405162461bcd60e51b81526004018080602001828103825260328152602001806124576032913960400191505060405180910390fd5b6040805180820190915260058082527f352e312e300000000000000000000000000000000000000000000000000000006020909201918252610ca69160019161239b565b506001610cb1612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a56600090815260019190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002610d24612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a56600090815260019182016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155610d95612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a56600090815260039190910160209081526040808320735d3a536e4d6dbd6114cc1ead35777bab948e3643845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002610e08612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a566000908152600391909101602090815260408083207339aa39c021dfbae8fac545936693ac917d5e7563845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001610e7b612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a56600090815260049190910160205260409020805460ff19169115159190911790556001610ebb612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c600090815260019190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002610f2e612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c60009081526001919091016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556003610fa1612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c600090815260019182016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155611012612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c600090815260039190910160209081526040808320735d3a536e4d6dbd6114cc1ead35777bab948e3643845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002611085612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c60009081526003918201602090815260408083207339aa39c021dfbae8fac545936693ac917d5e7563845290915290208054600f9390930b6001600160801b03166001600160801b0319909316929092179091556110f6612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c60009081526003919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001611169612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c600090815260049190910160205260409020805460ff191691151591909117905560016111a9612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f51600090815260019190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b0319909216919091179055600261121c612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f5160009081526001919091016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9290920b6001600160801b03166001600160801b0319909216919091179055600361128f612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f5160009081526001919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556004611302612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f5160009081526001918201602090815260408083206e085d4780b73119b644ae5ecd22b376845290915290208054600f9390930b6001600160801b03166001600160801b03199093169290921790915561136e612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f516000908152600391909101602090815260408083207316de59092dae5ccf4a1e6439d611fd0653f0bd01845290915290208054600f9290920b6001600160801b03166001600160801b031990921691909117905560026113e1612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f51600090815260039182016020908152604080832073d6ad7a6750a7593e092a9b218d66c0a814a3436e845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155611452612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f516000908152600391909101602090815260408083207383f798e925bcd4017eb265844fddabb448f1707d845290915290208054600f9290920b6001600160801b03166001600160801b031990921691909117905560046114c5612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f516000908152600391909101602090815260408083207373a052500105205d34daf004eab301916da8190f845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001611538612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f51600090815260049190910160205260409020805460ff19169115159190911790556001611578612353565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600090815260039190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b031990921691909117905560026115eb612353565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600090815260039182016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9390930b6001600160801b03166001600160801b03199093169290921790915561165c612353565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c760009081526003919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915281208054600f9390930b6001600160801b03166001600160801b0319909316929092179091556116ce612353565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600090815260049190910160205260409020805460ff1916911515919091179055600161170e612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd600090815260039190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002611781612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd600090815260039182016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9390930b6001600160801b03166001600160801b0319909316929092179091556117f2612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd60009081526003919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556004611865612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd6000908152600391909101602090815260408083207357ab1ec28d129707052df4df418d58a2d46d5f51845290915281208054600f9390930b6001600160801b03166001600160801b0319909316929092179091556118d7612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd600090815260049190910160205260409020805460ff19169115159190911790556001611917612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f27600090815260019190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b0319909216919091179055600261198a612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526001919091016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9290920b6001600160801b03166001600160801b031990921691909117905560036119fd612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526001919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556004611a70612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f276000908152600191820160209081526040808320734fabb145d64652a948d72533023f6e7a623c7c53845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155611ae1612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526003919091016020908152604080832073c2cb1040220768554cf699b0d863a3cd4324ce32845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002611b54612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526003918201602090815260408083207326ea744e5b887e5205727f55dfbe8685e3b21951845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155611bc5612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526003919091016020908152604080832073e6354ed5bc4b393a5aad09f21c46e101e692d447845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556004611c38612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f276000908152600391909101602090815260408083207304bc0ab673d88ae9dbc9da2380cb6b79c4bca9ae845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001611cab612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f27600090815260049190910160205260409020805460ff1916911515919091179055565b6000806000806000611cf3612353565b6001600160a01b03808a16600090815260019290920160209081526040808420928b168452919052812054600f0b9150611d2b612353565b6001600160a01b03808b16600090815260019290920160209081526040808420928b168452919052902054600f0b9050611d63612353565b6001600160a01b038a166000908152600491909101602052604081205490945060ff169250600f82900b15801590611d9f575080600f0b600014155b15611db35781955080945060029350611ea0565b6000611dbd612353565b6001600160a01b03808c16600090815260039290920160209081526040808420928d168452919052812054600f0b9150611df5612353565b6001600160a01b03808d16600090815260039290920160209081526040808420928d168452919052902054600f90810b915082900b15801590611e3c575080600f0b600014155b15611e505781975080965060019550611e9d565b6040805162461bcd60e51b815260206004820152601e60248201527f5065726d616e656e7453746f726167653a20696e76616c696420706169720000604482015290519081900360640190fd5b50505b505093509350935093565b7f695d523b8578c6379a2121164fd8de334b9c5b6b36dff5408bd4051a6b1704d081565b73a5407eae9ba41422680e2e00537571bcc53efbfd81565b6000611ef1612377565b546001600160a01b0316905090565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a5681565b3360008181527f5a18bce76b80e4d4ce74360cf8c2ecc0cc16abd99c9fa544ea9e4efc857ede1b60205260409020547f695d523b8578c6379a2121164fd8de334b9c5b6b36dff5408bd4051a6b1704d0919060ff16611fa85760405162461bcd60e51b81526004018080602001828103825260238152602001806124cd6023913960400191505060405180910390fd5b6001611fb2612353565b60009485526020526040909320805460ff1916931515939093179092555050565b3360008181527f167956591df432401c2bb34aca57b58f945baf26fdec2c15edae08f4a2f06bed60205260409020547ff4c750cdce673f6c35898d215e519b86e3846b1f0532fb48b84fe9d80f6de2fc919060ff166120635760405162461bcd60e51b81526004018080602001828103825260238152602001806124cd6023913960400191505060405180910390fd5b8560005b81600f0b81600f0b12156120f9576000898983600f0b81811061208657fe5b905060200201356001600160a01b03169050816001016120a4612353565b6001600160a01b03808e166000908152600192830160209081526040808320969093168252949094529092208054600f9290920b6001600160801b03166001600160801b031990921691909117905501612067565b508460005b81600f0b81600f0b1215612194576000888883600f0b81811061211d57fe5b905060200201356001600160a01b031690508160010161213b612353565b6001600160a01b03808f1660009081526003929092016020908152604080842095909216835293909352919091208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001016120fe565b508461219e612353565b6001600160a01b039b909b1660009081526004909b016020526040909a20805460ff19169a15159a909a17909955505050505050505050565b7ff4c750cdce673f6c35898d215e519b86e3846b1f0532fb48b84fe9d80f6de2fc81565b6000546001600160a01b031633146122445760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b8061224d612377565b600101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905550565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2781565b6000546001600160a01b031633146122df5760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b6001600160a01b0381166123245760405162461bcd60e51b81526004018080602001828103825260328152602001806124f06032913960400191505060405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b7fd38d862c9fa97c2fa857a46e08022d272a3579c114ca4f335f1e5fcb692c045e90565b7f92dd52b981a2dd69af37d8a3febca29ed6a974aede38ae66e4ef773173aba47190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123dc57805160ff1916838001178555612409565b82800160010185558215612409579182015b828111156124095782518255916020019190600101906123ee565b50612415929150612419565b5090565b5b80821115612415576000815560010161241a56fe5065726d616e656e7453746f726167653a20696e70757473206c656e677468206d69736d617463685065726d616e656e7453746f726167653a206e6f7420757067726164696e672066726f6d20352e302e302076657273696f6e5065726d616e656e7453746f726167653a206e6f7420746865206f70657261746f725065726d616e656e7453746f726167653a206e6f7420612076616c696420726f6c655065726d616e656e7453746f726167653a20686173206e6f207065726d697373696f6e5065726d616e656e7453746f726167653a206f70657261746f722063616e206e6f74206265207a65726f2061646472657373a2646970667358221220c5fb24b30a44467caa0ce170211c13d79ff765fb317f95bb991fba827a08110664736f6c634300060c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101b95760003560e01c80637ecb557a116100f9578063cb4f87fd11610097578063e4e266e911610071578063e4e266e9146105ea578063e7cc2c8e146105f2578063ebe4a4c314610618578063f2fde38b14610620576101b9565b8063cb4f87fd146104f1578063d8dd97fb146104f9578063dbd1a14a14610516576101b9565b80638ab4a8cc116100d35780638ab4a8cc146104705780639a69e734146104d95780639dbea840146104e1578063b6f732ae146104e9576101b9565b80637ecb557a1461043a5780638014bd97146104605780638129fc1c14610468576101b9565b806356463d0a11610166578063676ff9cf11610140578063676ff9cf146103ea578063711fe8b614610410578063723ca616146104185780637d5aa5f414610432576101b9565b806356463d0a146103a6578063570ca735146103ae578063599e4c70146103b6576101b9565b806331f42f8e1161019757806331f42f8e1461024857806354f0bc791461026557806354fd4d5014610329576101b9565b8063241291e8146101be57806328545c0d146101e25780632feeea3a14610222575b600080fd5b6101c6610646565b604080516001600160a01b039092168252519081900360200190f35b61020e600480360360408110156101f857600080fd5b50803590602001356001600160a01b031661065e565b604080519115158252519081900360200190f35b61020e6004803603602081101561023857600080fd5b50356001600160a01b0316610689565b61020e6004803603602081101561025e57600080fd5b50356106b8565b6103276004803603604081101561027b57600080fd5b81019060208101813564010000000081111561029657600080fd5b8201836020820111156102a857600080fd5b803590602001918460208302840111640100000000831117156102ca57600080fd5b9193909290916020810190356401000000008111156102e857600080fd5b8201836020820111156102fa57600080fd5b8035906020019184602083028401116401000000008311171561031c57600080fd5b5090925090506106d6565b005b61033161081f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036b578181015183820152602001610353565b50505050905090810190601f1680156103985780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101c66108ac565b6101c66108c4565b610327600480360360608110156103cc57600080fd5b508035906001600160a01b03602082013516906040013515156108d3565b6103276004803603602081101561040057600080fd5b50356001600160a01b03166109ed565b6101c6610a70565b610420610a88565b60408051918252519081900360200190f35b6101c6610aac565b6103276004803603602081101561045057600080fd5b50356001600160a01b0316610ac8565b6101c6610b48565b610327610b64565b6104a86004803603606081101561048657600080fd5b506001600160a01b038135811691602081013582169160409091013516611ce3565b60408051600f95860b81529390940b602084015261ffff909116828401521515606082015290519081900360800190f35b610420611eab565b6101c6611ecf565b6101c6611ee7565b6101c6611f00565b6103276004803603602081101561050f57600080fd5b5035611f18565b6103276004803603608081101561052c57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561055757600080fd5b82018360208201111561056957600080fd5b8035906020019184602083028401116401000000008311171561058b57600080fd5b9193909290916020810190356401000000008111156105a957600080fd5b8201836020820111156105bb57600080fd5b803590602001918460208302840111640100000000831117156105dd57600080fd5b9193509150351515611fd3565b6104206121d7565b6103276004803603602081101561060857600080fd5b50356001600160a01b03166121fb565b6101c661227e565b6103276004803603602081101561063657600080fd5b50356001600160a01b0316612296565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c81565b60009182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000610693612353565b6001600160a01b03929092166000908152600290920160205250604090205460ff1690565b60006106c2612353565b600092835260205250604090205460ff1690565b3360008181527f5d870303c431e6d36139ba5242eb8ff20cdc3a6fb8ce8e2e4557687eef8fc0d160205260409020547f2c97779b4deaf24e9d46e02ec2699240a957d92782b51165b93878b09dd66f61919060ff166107665760405162461bcd60e51b81526004018080602001828103825260238152602001806124cd6023913960400191505060405180910390fd5b8483146107a45760405162461bcd60e51b815260040180806020018281038252602881526020018061242f6028913960400191505060405180910390fd5b60005b85811015610816578484828181106107bb57fe5b9050602002013515156107cc612353565b60020160008989858181106107dd57fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff19169115159190911790556001016107a7565b50505050505050565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108a45780601f10610879576101008083540402835291602001916108a4565b820191906000526020600020905b81548152906001019060200180831161088757829003601f168201915b505050505081565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c781565b6000546001600160a01b031681565b6000546001600160a01b0316331461091c5760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b808281156109b6576000546001600160a01b03828116911614806109585750610943611ee7565b6001600160a01b0316816001600160a01b0316145b8061097b5750610966610b48565b6001600160a01b0316816001600160a01b0316145b6109b65760405162461bcd60e51b81526004018080602001828103825260228152602001806124ab6022913960400191505060405180910390fd5b505060009283526002602090815260408085206001600160a01b039490941685529290529120805460ff1916911515919091179055565b6000546001600160a01b03163314610a365760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b80610a3f612377565b600201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905550565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f5181565b7f2c97779b4deaf24e9d46e02ec2699240a957d92782b51165b93878b09dd66f6181565b6000610ab6612377565b600201546001600160a01b0316905090565b6000546001600160a01b03163314610b115760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b80610b1a612377565b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905550565b6000610b52612377565b600101546001600160a01b0316905090565b60405160200180807f352e302e3000000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040528051906020012060016040516020018082805460018160011615610100020316600290048015610c0b5780601f10610be9576101008083540402835291820191610c0b565b820191906000526020600020905b815481529060010190602001808311610bf7575b50509150506040516020818303038152906040528051906020012014610c625760405162461bcd60e51b81526004018080602001828103825260328152602001806124576032913960400191505060405180910390fd5b6040805180820190915260058082527f352e312e300000000000000000000000000000000000000000000000000000006020909201918252610ca69160019161239b565b506001610cb1612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a56600090815260019190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002610d24612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a56600090815260019182016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155610d95612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a56600090815260039190910160209081526040808320735d3a536e4d6dbd6114cc1ead35777bab948e3643845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002610e08612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a566000908152600391909101602090815260408083207339aa39c021dfbae8fac545936693ac917d5e7563845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001610e7b612353565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a56600090815260049190910160205260409020805460ff19169115159190911790556001610ebb612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c600090815260019190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002610f2e612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c60009081526001919091016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556003610fa1612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c600090815260019182016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155611012612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c600090815260039190910160209081526040808320735d3a536e4d6dbd6114cc1ead35777bab948e3643845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002611085612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c60009081526003918201602090815260408083207339aa39c021dfbae8fac545936693ac917d5e7563845290915290208054600f9390930b6001600160801b03166001600160801b0319909316929092179091556110f6612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c60009081526003919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001611169612353565b7352ea46506b9cc5ef470c5bf89f17dc28bb35d85c600090815260049190910160205260409020805460ff191691151591909117905560016111a9612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f51600090815260019190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b0319909216919091179055600261121c612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f5160009081526001919091016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9290920b6001600160801b03166001600160801b0319909216919091179055600361128f612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f5160009081526001919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556004611302612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f5160009081526001918201602090815260408083206e085d4780b73119b644ae5ecd22b376845290915290208054600f9390930b6001600160801b03166001600160801b03199093169290921790915561136e612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f516000908152600391909101602090815260408083207316de59092dae5ccf4a1e6439d611fd0653f0bd01845290915290208054600f9290920b6001600160801b03166001600160801b031990921691909117905560026113e1612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f51600090815260039182016020908152604080832073d6ad7a6750a7593e092a9b218d66c0a814a3436e845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155611452612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f516000908152600391909101602090815260408083207383f798e925bcd4017eb265844fddabb448f1707d845290915290208054600f9290920b6001600160801b03166001600160801b031990921691909117905560046114c5612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f516000908152600391909101602090815260408083207373a052500105205d34daf004eab301916da8190f845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001611538612353565b7345f783cce6b7ff23b2ab2d70e416cdb7d6055f51600090815260049190910160205260409020805460ff19169115159190911790556001611578612353565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600090815260039190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b031990921691909117905560026115eb612353565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600090815260039182016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9390930b6001600160801b03166001600160801b03199093169290921790915561165c612353565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c760009081526003919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915281208054600f9390930b6001600160801b03166001600160801b0319909316929092179091556116ce612353565b73bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600090815260049190910160205260409020805460ff1916911515919091179055600161170e612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd600090815260039190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002611781612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd600090815260039182016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9390930b6001600160801b03166001600160801b0319909316929092179091556117f2612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd60009081526003919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556004611865612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd6000908152600391909101602090815260408083207357ab1ec28d129707052df4df418d58a2d46d5f51845290915281208054600f9390930b6001600160801b03166001600160801b0319909316929092179091556118d7612353565b73a5407eae9ba41422680e2e00537571bcc53efbfd600090815260049190910160205260409020805460ff19169115159190911790556001611917612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f27600090815260019190910160209081526040808320736b175474e89094c44da98b954eedeac495271d0f845290915290208054600f9290920b6001600160801b03166001600160801b0319909216919091179055600261198a612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526001919091016020908152604080832073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48845290915290208054600f9290920b6001600160801b03166001600160801b031990921691909117905560036119fd612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526001919091016020908152604080832073dac17f958d2ee523a2206206994597c13d831ec7845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556004611a70612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f276000908152600191820160209081526040808320734fabb145d64652a948d72533023f6e7a623c7c53845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155611ae1612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526003919091016020908152604080832073c2cb1040220768554cf699b0d863a3cd4324ce32845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556002611b54612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526003918201602090815260408083207326ea744e5b887e5205727f55dfbe8685e3b21951845290915290208054600f9390930b6001600160801b03166001600160801b031990931692909217909155611bc5612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2760009081526003919091016020908152604080832073e6354ed5bc4b393a5aad09f21c46e101e692d447845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556004611c38612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f276000908152600391909101602090815260408083207304bc0ab673d88ae9dbc9da2380cb6b79c4bca9ae845290915290208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001611cab612353565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f27600090815260049190910160205260409020805460ff1916911515919091179055565b6000806000806000611cf3612353565b6001600160a01b03808a16600090815260019290920160209081526040808420928b168452919052812054600f0b9150611d2b612353565b6001600160a01b03808b16600090815260019290920160209081526040808420928b168452919052902054600f0b9050611d63612353565b6001600160a01b038a166000908152600491909101602052604081205490945060ff169250600f82900b15801590611d9f575080600f0b600014155b15611db35781955080945060029350611ea0565b6000611dbd612353565b6001600160a01b03808c16600090815260039290920160209081526040808420928d168452919052812054600f0b9150611df5612353565b6001600160a01b03808d16600090815260039290920160209081526040808420928d168452919052902054600f90810b915082900b15801590611e3c575080600f0b600014155b15611e505781975080965060019550611e9d565b6040805162461bcd60e51b815260206004820152601e60248201527f5065726d616e656e7453746f726167653a20696e76616c696420706169720000604482015290519081900360640190fd5b50505b505093509350935093565b7f695d523b8578c6379a2121164fd8de334b9c5b6b36dff5408bd4051a6b1704d081565b73a5407eae9ba41422680e2e00537571bcc53efbfd81565b6000611ef1612377565b546001600160a01b0316905090565b73a2b47e3d5c44877cca798226b7b8118f9bfb7a5681565b3360008181527f5a18bce76b80e4d4ce74360cf8c2ecc0cc16abd99c9fa544ea9e4efc857ede1b60205260409020547f695d523b8578c6379a2121164fd8de334b9c5b6b36dff5408bd4051a6b1704d0919060ff16611fa85760405162461bcd60e51b81526004018080602001828103825260238152602001806124cd6023913960400191505060405180910390fd5b6001611fb2612353565b60009485526020526040909320805460ff1916931515939093179092555050565b3360008181527f167956591df432401c2bb34aca57b58f945baf26fdec2c15edae08f4a2f06bed60205260409020547ff4c750cdce673f6c35898d215e519b86e3846b1f0532fb48b84fe9d80f6de2fc919060ff166120635760405162461bcd60e51b81526004018080602001828103825260238152602001806124cd6023913960400191505060405180910390fd5b8560005b81600f0b81600f0b12156120f9576000898983600f0b81811061208657fe5b905060200201356001600160a01b03169050816001016120a4612353565b6001600160a01b03808e166000908152600192830160209081526040808320969093168252949094529092208054600f9290920b6001600160801b03166001600160801b031990921691909117905501612067565b508460005b81600f0b81600f0b1215612194576000888883600f0b81811061211d57fe5b905060200201356001600160a01b031690508160010161213b612353565b6001600160a01b03808f1660009081526003929092016020908152604080842095909216835293909352919091208054600f9290920b6001600160801b03166001600160801b03199092169190911790556001016120fe565b508461219e612353565b6001600160a01b039b909b1660009081526004909b016020526040909a20805460ff19169a15159a909a17909955505050505050505050565b7ff4c750cdce673f6c35898d215e519b86e3846b1f0532fb48b84fe9d80f6de2fc81565b6000546001600160a01b031633146122445760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b8061224d612377565b600101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905550565b7379a8c46dea5ada233abaffd40f3a0a2b1e5a4f2781565b6000546001600160a01b031633146122df5760405162461bcd60e51b81526004018080602001828103825260228152602001806124896022913960400191505060405180910390fd5b6001600160a01b0381166123245760405162461bcd60e51b81526004018080602001828103825260328152602001806124f06032913960400191505060405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b7fd38d862c9fa97c2fa857a46e08022d272a3579c114ca4f335f1e5fcb692c045e90565b7f92dd52b981a2dd69af37d8a3febca29ed6a974aede38ae66e4ef773173aba47190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123dc57805160ff1916838001178555612409565b82800160010185558215612409579182015b828111156124095782518255916020019190600101906123ee565b50612415929150612419565b5090565b5b80821115612415576000815560010161241a56fe5065726d616e656e7453746f726167653a20696e70757473206c656e677468206d69736d617463685065726d616e656e7453746f726167653a206e6f7420757067726164696e672066726f6d20352e302e302076657273696f6e5065726d616e656e7453746f726167653a206e6f7420746865206f70657261746f725065726d616e656e7453746f726167653a206e6f7420612076616c696420726f6c655065726d616e656e7453746f726167653a20686173206e6f207065726d697373696f6e5065726d616e656e7453746f726167653a206f70657261746f722063616e206e6f74206265207a65726f2061646472657373a2646970667358221220c5fb24b30a44467caa0ce170211c13d79ff765fb317f95bb991fba827a08110664736f6c634300060c0033

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.