ETH Price: $2,871.38 (-10.88%)
Gas: 14 Gwei

Contract

0x045e507925d2e05D114534D0810a1abD94aca8d6
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Transfer130337432021-08-16 3:07:081054 days ago1629083228IN
Synthetix: L2 Bridge
0 ETH0.0016724276.51298337
Initiate Deposit125734032021-06-05 8:28:081125 days ago1622881688IN
Synthetix: L2 Bridge
0 ETH0.0003121513
Initiate Deposit125287102021-05-29 10:29:551132 days ago1622284195IN
Synthetix: L2 Bridge
0 ETH0.00043218
Initiate Deposit125272812021-05-29 5:04:191133 days ago1622264659IN
Synthetix: L2 Bridge
0 ETH0.0004820
Initiate Deposit124572332021-05-18 8:13:301143 days ago1621325610IN
Synthetix: L2 Bridge
0 ETH0.001416759
Accept Ownership124098292021-05-11 0:11:441151 days ago1620691904IN
Synthetix: L2 Bridge
0 ETH0.004899267.72
Initiate Deposit124084452021-05-10 19:07:091151 days ago1620673629IN
Synthetix: L2 Bridge
0 ETH0.08466815235
Initiate Escrow ...124031632021-05-09 23:39:191152 days ago1620603559IN
Synthetix: L2 Bridge
0 ETH0.05183501101
Initiate Deposit124031562021-05-09 23:37:441152 days ago1620603464IN
Synthetix: L2 Bridge
0 ETH0.0327874891
Initiate Deposit124026902021-05-09 21:53:181152 days ago1620597198IN
Synthetix: L2 Bridge
0 ETH0.0302633584
Initiate Deposit124011912021-05-09 16:18:341152 days ago1620577114IN
Synthetix: L2 Bridge
0 ETH0.0349492997
Initiate Deposit124010812021-05-09 15:56:171152 days ago1620575777IN
Synthetix: L2 Bridge
0 ETH0.0342286995
Initiate Escrow ...124010382021-05-09 15:47:181152 days ago1620575238IN
Synthetix: L2 Bridge
0 ETH0.05743983109
Initiate Deposit123952342021-05-08 18:16:221153 days ago1620497782IN
Synthetix: L2 Bridge
0 ETH0.06881768191
Initiate Deposit123933092021-05-08 11:07:341153 days ago1620472054IN
Synthetix: L2 Bridge
0 ETH0.0172944948
Initiate Deposit123932592021-05-08 10:58:461153 days ago1620471526IN
Synthetix: L2 Bridge
0 ETH0.0201769156
Initiate Escrow ...123918582021-05-08 5:47:161153 days ago1620452836IN
Synthetix: L2 Bridge
0 ETH0.0549337363
Initiate Deposit123902202021-05-07 23:43:181154 days ago1620430998IN
Synthetix: L2 Bridge
0 ETH0.0136914738
Initiate Deposit123900242021-05-07 23:01:351154 days ago1620428495IN
Synthetix: L2 Bridge
0 ETH0.0176542149
Initiate Deposit123898662021-05-07 22:26:501154 days ago1620426410IN
Synthetix: L2 Bridge
0 ETH0.0176542149
Initiate Deposit123891852021-05-07 19:53:191154 days ago1620417199IN
Synthetix: L2 Bridge
0 ETH0.0201762456
Initiate Deposit123886532021-05-07 18:04:171154 days ago1620410657IN
Synthetix: L2 Bridge
0 ETH0.0342264195
Initiate Escrow ...123885812021-05-07 17:48:231154 days ago1620409703IN
Synthetix: L2 Bridge
0 ETH0.08724632101
Initiate Deposit123885672021-05-07 17:45:081154 days ago1620409508IN
Synthetix: L2 Bridge
0 ETH0.04359654121
Initiate Escrow ...123884822021-05-07 17:23:311154 days ago1620408211IN
Synthetix: L2 Bridge
0 ETH0.0037229991
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SynthetixBridgeToOptimism

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-01-14
*/

/*
   ____            __   __        __   _
  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __
 _\ \ / // // _ \/ __// _ \/ -_)/ __// / \ \ /
/___/ \_, //_//_/\__//_//_/\__/ \__//_/ /_\_\
     /___/

* Synthetix: SynthetixBridgeToOptimism.sol
*
* Latest source (may be newer): https://github.com/Synthetixio/synthetix/blob/master/contracts/SynthetixBridgeToOptimism.sol
* Docs: https://docs.synthetix.io/contracts/SynthetixBridgeToOptimism
*
* Contract Dependencies: 
*	- IAddressResolver
*	- ISynthetixBridgeToOptimism
*	- MixinResolver
*	- MixinSystemSettings
*	- Owned
* Libraries: 
*	- VestingEntries
*
* MIT License
* ===========
*
* Copyright (c) 2021 Synthetix
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
*/



pragma solidity ^0.5.16;


// https://docs.synthetix.io/contracts/source/contracts/owned
contract Owned {
    address public owner;
    address public nominatedOwner;

    constructor(address _owner) public {
        require(_owner != address(0), "Owner address cannot be 0");
        owner = _owner;
        emit OwnerChanged(address(0), _owner);
    }

    function nominateNewOwner(address _owner) external onlyOwner {
        nominatedOwner = _owner;
        emit OwnerNominated(_owner);
    }

    function acceptOwnership() external {
        require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership");
        emit OwnerChanged(owner, nominatedOwner);
        owner = nominatedOwner;
        nominatedOwner = address(0);
    }

    modifier onlyOwner {
        _onlyOwner();
        _;
    }

    function _onlyOwner() private view {
        require(msg.sender == owner, "Only the contract owner may perform this action");
    }

    event OwnerNominated(address newOwner);
    event OwnerChanged(address oldOwner, address newOwner);
}


// https://docs.synthetix.io/contracts/source/interfaces/iaddressresolver
interface IAddressResolver {
    function getAddress(bytes32 name) external view returns (address);

    function getSynth(bytes32 key) external view returns (address);

    function requireAndGetAddress(bytes32 name, string calldata reason) external view returns (address);
}


// https://docs.synthetix.io/contracts/source/interfaces/isynth
interface ISynth {
    // Views
    function currencyKey() external view returns (bytes32);

    function transferableSynths(address account) external view returns (uint);

    // Mutative functions
    function transferAndSettle(address to, uint value) external returns (bool);

    function transferFromAndSettle(
        address from,
        address to,
        uint value
    ) external returns (bool);

    // Restricted: used internally to Synthetix
    function burn(address account, uint amount) external;

    function issue(address account, uint amount) external;
}


// https://docs.synthetix.io/contracts/source/interfaces/iissuer
interface IIssuer {
    // Views
    function anySynthOrSNXRateIsInvalid() external view returns (bool anyRateInvalid);

    function availableCurrencyKeys() external view returns (bytes32[] memory);

    function availableSynthCount() external view returns (uint);

    function availableSynths(uint index) external view returns (ISynth);

    function canBurnSynths(address account) external view returns (bool);

    function collateral(address account) external view returns (uint);

    function collateralisationRatio(address issuer) external view returns (uint);

    function collateralisationRatioAndAnyRatesInvalid(address _issuer)
        external
        view
        returns (uint cratio, bool anyRateIsInvalid);

    function debtBalanceOf(address issuer, bytes32 currencyKey) external view returns (uint debtBalance);

    function issuanceRatio() external view returns (uint);

    function lastIssueEvent(address account) external view returns (uint);

    function maxIssuableSynths(address issuer) external view returns (uint maxIssuable);

    function minimumStakeTime() external view returns (uint);

    function remainingIssuableSynths(address issuer)
        external
        view
        returns (
            uint maxIssuable,
            uint alreadyIssued,
            uint totalSystemDebt
        );

    function synths(bytes32 currencyKey) external view returns (ISynth);

    function getSynths(bytes32[] calldata currencyKeys) external view returns (ISynth[] memory);

    function synthsByAddress(address synthAddress) external view returns (bytes32);

    function totalIssuedSynths(bytes32 currencyKey, bool excludeEtherCollateral) external view returns (uint);

    function transferableSynthetixAndAnyRateIsInvalid(address account, uint balance)
        external
        view
        returns (uint transferable, bool anyRateIsInvalid);

    // Restricted: used internally to Synthetix
    function issueSynths(address from, uint amount) external;

    function issueSynthsOnBehalf(
        address issueFor,
        address from,
        uint amount
    ) external;

    function issueMaxSynths(address from) external;

    function issueMaxSynthsOnBehalf(address issueFor, address from) external;

    function burnSynths(address from, uint amount) external;

    function burnSynthsOnBehalf(
        address burnForAddress,
        address from,
        uint amount
    ) external;

    function burnSynthsToTarget(address from) external;

    function burnSynthsToTargetOnBehalf(address burnForAddress, address from) external;

    function liquidateDelinquentAccount(
        address account,
        uint susdAmount,
        address liquidator
    ) external returns (uint totalRedeemed, uint amountToLiquidate);
}


// Inheritance


// Internal references


// https://docs.synthetix.io/contracts/source/contracts/addressresolver
contract AddressResolver is Owned, IAddressResolver {
    mapping(bytes32 => address) public repository;

    constructor(address _owner) public Owned(_owner) {}

    /* ========== RESTRICTED FUNCTIONS ========== */

    function importAddresses(bytes32[] calldata names, address[] calldata destinations) external onlyOwner {
        require(names.length == destinations.length, "Input lengths must match");

        for (uint i = 0; i < names.length; i++) {
            bytes32 name = names[i];
            address destination = destinations[i];
            repository[name] = destination;
            emit AddressImported(name, destination);
        }
    }

    /* ========= PUBLIC FUNCTIONS ========== */

    function rebuildCaches(MixinResolver[] calldata destinations) external {
        for (uint i = 0; i < destinations.length; i++) {
            destinations[i].rebuildCache();
        }
    }

    /* ========== VIEWS ========== */

    function areAddressesImported(bytes32[] calldata names, address[] calldata destinations) external view returns (bool) {
        for (uint i = 0; i < names.length; i++) {
            if (repository[names[i]] != destinations[i]) {
                return false;
            }
        }
        return true;
    }

    function getAddress(bytes32 name) external view returns (address) {
        return repository[name];
    }

    function requireAndGetAddress(bytes32 name, string calldata reason) external view returns (address) {
        address _foundAddress = repository[name];
        require(_foundAddress != address(0), reason);
        return _foundAddress;
    }

    function getSynth(bytes32 key) external view returns (address) {
        IIssuer issuer = IIssuer(repository["Issuer"]);
        require(address(issuer) != address(0), "Cannot find Issuer address");
        return address(issuer.synths(key));
    }

    /* ========== EVENTS ========== */

    event AddressImported(bytes32 name, address destination);
}


// solhint-disable payable-fallback

// https://docs.synthetix.io/contracts/source/contracts/readproxy
contract ReadProxy is Owned {
    address public target;

    constructor(address _owner) public Owned(_owner) {}

    function setTarget(address _target) external onlyOwner {
        target = _target;
        emit TargetUpdated(target);
    }

    function() external {
        // The basics of a proxy read call
        // Note that msg.sender in the underlying will always be the address of this contract.
        assembly {
            calldatacopy(0, 0, calldatasize)

            // Use of staticcall - this will revert if the underlying function mutates state
            let result := staticcall(gas, sload(target_slot), 0, calldatasize, 0, 0)
            returndatacopy(0, 0, returndatasize)

            if iszero(result) {
                revert(0, returndatasize)
            }
            return(0, returndatasize)
        }
    }

    event TargetUpdated(address newTarget);
}


// Inheritance


// Internal references


// https://docs.synthetix.io/contracts/source/contracts/mixinresolver
contract MixinResolver {
    AddressResolver public resolver;

    mapping(bytes32 => address) private addressCache;

    constructor(address _resolver) internal {
        resolver = AddressResolver(_resolver);
    }

    /* ========== INTERNAL FUNCTIONS ========== */

    function combineArrays(bytes32[] memory first, bytes32[] memory second)
        internal
        pure
        returns (bytes32[] memory combination)
    {
        combination = new bytes32[](first.length + second.length);

        for (uint i = 0; i < first.length; i++) {
            combination[i] = first[i];
        }

        for (uint j = 0; j < second.length; j++) {
            combination[first.length + j] = second[j];
        }
    }

    /* ========== PUBLIC FUNCTIONS ========== */

    // Note: this function is public not external in order for it to be overridden and invoked via super in subclasses
    function resolverAddressesRequired() public view returns (bytes32[] memory addresses) {}

    function rebuildCache() public {
        bytes32[] memory requiredAddresses = resolverAddressesRequired();
        // The resolver must call this function whenver it updates its state
        for (uint i = 0; i < requiredAddresses.length; i++) {
            bytes32 name = requiredAddresses[i];
            // Note: can only be invoked once the resolver has all the targets needed added
            address destination = resolver.requireAndGetAddress(
                name,
                string(abi.encodePacked("Resolver missing target: ", name))
            );
            addressCache[name] = destination;
            emit CacheUpdated(name, destination);
        }
    }

    /* ========== VIEWS ========== */

    function isResolverCached() external view returns (bool) {
        bytes32[] memory requiredAddresses = resolverAddressesRequired();
        for (uint i = 0; i < requiredAddresses.length; i++) {
            bytes32 name = requiredAddresses[i];
            // false if our cache is invalid or if the resolver doesn't have the required address
            if (resolver.getAddress(name) != addressCache[name] || addressCache[name] == address(0)) {
                return false;
            }
        }

        return true;
    }

    /* ========== INTERNAL FUNCTIONS ========== */

    function requireAndGetAddress(bytes32 name) internal view returns (address) {
        address _foundAddress = addressCache[name];
        require(_foundAddress != address(0), string(abi.encodePacked("Missing address: ", name)));
        return _foundAddress;
    }

    /* ========== EVENTS ========== */

    event CacheUpdated(bytes32 name, address destination);
}


// https://docs.synthetix.io/contracts/source/interfaces/iflexiblestorage
interface IFlexibleStorage {
    // Views
    function getUIntValue(bytes32 contractName, bytes32 record) external view returns (uint);

    function getUIntValues(bytes32 contractName, bytes32[] calldata records) external view returns (uint[] memory);

    function getIntValue(bytes32 contractName, bytes32 record) external view returns (int);

    function getIntValues(bytes32 contractName, bytes32[] calldata records) external view returns (int[] memory);

    function getAddressValue(bytes32 contractName, bytes32 record) external view returns (address);

    function getAddressValues(bytes32 contractName, bytes32[] calldata records) external view returns (address[] memory);

    function getBoolValue(bytes32 contractName, bytes32 record) external view returns (bool);

    function getBoolValues(bytes32 contractName, bytes32[] calldata records) external view returns (bool[] memory);

    function getBytes32Value(bytes32 contractName, bytes32 record) external view returns (bytes32);

    function getBytes32Values(bytes32 contractName, bytes32[] calldata records) external view returns (bytes32[] memory);

    // Mutative functions
    function deleteUIntValue(bytes32 contractName, bytes32 record) external;

    function deleteIntValue(bytes32 contractName, bytes32 record) external;

    function deleteAddressValue(bytes32 contractName, bytes32 record) external;

    function deleteBoolValue(bytes32 contractName, bytes32 record) external;

    function deleteBytes32Value(bytes32 contractName, bytes32 record) external;

    function setUIntValue(
        bytes32 contractName,
        bytes32 record,
        uint value
    ) external;

    function setUIntValues(
        bytes32 contractName,
        bytes32[] calldata records,
        uint[] calldata values
    ) external;

    function setIntValue(
        bytes32 contractName,
        bytes32 record,
        int value
    ) external;

    function setIntValues(
        bytes32 contractName,
        bytes32[] calldata records,
        int[] calldata values
    ) external;

    function setAddressValue(
        bytes32 contractName,
        bytes32 record,
        address value
    ) external;

    function setAddressValues(
        bytes32 contractName,
        bytes32[] calldata records,
        address[] calldata values
    ) external;

    function setBoolValue(
        bytes32 contractName,
        bytes32 record,
        bool value
    ) external;

    function setBoolValues(
        bytes32 contractName,
        bytes32[] calldata records,
        bool[] calldata values
    ) external;

    function setBytes32Value(
        bytes32 contractName,
        bytes32 record,
        bytes32 value
    ) external;

    function setBytes32Values(
        bytes32 contractName,
        bytes32[] calldata records,
        bytes32[] calldata values
    ) external;
}


// Internal references


// https://docs.synthetix.io/contracts/source/contracts/mixinsystemsettings
contract MixinSystemSettings is MixinResolver {
    bytes32 internal constant SETTING_CONTRACT_NAME = "SystemSettings";

    bytes32 internal constant SETTING_WAITING_PERIOD_SECS = "waitingPeriodSecs";
    bytes32 internal constant SETTING_PRICE_DEVIATION_THRESHOLD_FACTOR = "priceDeviationThresholdFactor";
    bytes32 internal constant SETTING_ISSUANCE_RATIO = "issuanceRatio";
    bytes32 internal constant SETTING_FEE_PERIOD_DURATION = "feePeriodDuration";
    bytes32 internal constant SETTING_TARGET_THRESHOLD = "targetThreshold";
    bytes32 internal constant SETTING_LIQUIDATION_DELAY = "liquidationDelay";
    bytes32 internal constant SETTING_LIQUIDATION_RATIO = "liquidationRatio";
    bytes32 internal constant SETTING_LIQUIDATION_PENALTY = "liquidationPenalty";
    bytes32 internal constant SETTING_RATE_STALE_PERIOD = "rateStalePeriod";
    bytes32 internal constant SETTING_EXCHANGE_FEE_RATE = "exchangeFeeRate";
    bytes32 internal constant SETTING_MINIMUM_STAKE_TIME = "minimumStakeTime";
    bytes32 internal constant SETTING_AGGREGATOR_WARNING_FLAGS = "aggregatorWarningFlags";
    bytes32 internal constant SETTING_TRADING_REWARDS_ENABLED = "tradingRewardsEnabled";
    bytes32 internal constant SETTING_DEBT_SNAPSHOT_STALE_TIME = "debtSnapshotStaleTime";
    bytes32 internal constant SETTING_CROSS_DOMAIN_DEPOSIT_GAS_LIMIT = "crossDomainDepositGasLimit";
    bytes32 internal constant SETTING_CROSS_DOMAIN_ESCROW_GAS_LIMIT = "crossDomainEscrowGasLimit";
    bytes32 internal constant SETTING_CROSS_DOMAIN_REWARD_GAS_LIMIT = "crossDomainRewardGasLimit";
    bytes32 internal constant SETTING_CROSS_DOMAIN_WITHDRAWAL_GAS_LIMIT = "crossDomainWithdrawalGasLimit";

    bytes32 internal constant CONTRACT_FLEXIBLESTORAGE = "FlexibleStorage";

    enum CrossDomainMessageGasLimits {Deposit, Escrow, Reward, Withdrawal}

    constructor(address _resolver) internal MixinResolver(_resolver) {}

    function resolverAddressesRequired() public view returns (bytes32[] memory addresses) {
        addresses = new bytes32[](1);
        addresses[0] = CONTRACT_FLEXIBLESTORAGE;
    }

    function flexibleStorage() internal view returns (IFlexibleStorage) {
        return IFlexibleStorage(requireAndGetAddress(CONTRACT_FLEXIBLESTORAGE));
    }

    function _getGasLimitSetting(CrossDomainMessageGasLimits gasLimitType) internal pure returns (bytes32) {
        if (gasLimitType == CrossDomainMessageGasLimits.Deposit) {
            return SETTING_CROSS_DOMAIN_DEPOSIT_GAS_LIMIT;
        } else if (gasLimitType == CrossDomainMessageGasLimits.Escrow) {
            return SETTING_CROSS_DOMAIN_ESCROW_GAS_LIMIT;
        } else if (gasLimitType == CrossDomainMessageGasLimits.Reward) {
            return SETTING_CROSS_DOMAIN_REWARD_GAS_LIMIT;
        } else if (gasLimitType == CrossDomainMessageGasLimits.Withdrawal) {
            return SETTING_CROSS_DOMAIN_WITHDRAWAL_GAS_LIMIT;
        } else {
            revert("Unknown gas limit type");
        }
    }

    function getCrossDomainMessageGasLimit(CrossDomainMessageGasLimits gasLimitType) internal view returns (uint) {
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, _getGasLimitSetting(gasLimitType));
    }

    function getTradingRewardsEnabled() internal view returns (bool) {
        return flexibleStorage().getBoolValue(SETTING_CONTRACT_NAME, SETTING_TRADING_REWARDS_ENABLED);
    }

    function getWaitingPeriodSecs() internal view returns (uint) {
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_WAITING_PERIOD_SECS);
    }

    function getPriceDeviationThresholdFactor() internal view returns (uint) {
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_PRICE_DEVIATION_THRESHOLD_FACTOR);
    }

    function getIssuanceRatio() internal view returns (uint) {
        // lookup on flexible storage directly for gas savings (rather than via SystemSettings)
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_ISSUANCE_RATIO);
    }

    function getFeePeriodDuration() internal view returns (uint) {
        // lookup on flexible storage directly for gas savings (rather than via SystemSettings)
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_FEE_PERIOD_DURATION);
    }

    function getTargetThreshold() internal view returns (uint) {
        // lookup on flexible storage directly for gas savings (rather than via SystemSettings)
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_TARGET_THRESHOLD);
    }

    function getLiquidationDelay() internal view returns (uint) {
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_LIQUIDATION_DELAY);
    }

    function getLiquidationRatio() internal view returns (uint) {
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_LIQUIDATION_RATIO);
    }

    function getLiquidationPenalty() internal view returns (uint) {
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_LIQUIDATION_PENALTY);
    }

    function getRateStalePeriod() internal view returns (uint) {
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_RATE_STALE_PERIOD);
    }

    function getExchangeFeeRate(bytes32 currencyKey) internal view returns (uint) {
        return
            flexibleStorage().getUIntValue(
                SETTING_CONTRACT_NAME,
                keccak256(abi.encodePacked(SETTING_EXCHANGE_FEE_RATE, currencyKey))
            );
    }

    function getMinimumStakeTime() internal view returns (uint) {
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_MINIMUM_STAKE_TIME);
    }

    function getAggregatorWarningFlags() internal view returns (address) {
        return flexibleStorage().getAddressValue(SETTING_CONTRACT_NAME, SETTING_AGGREGATOR_WARNING_FLAGS);
    }

    function getDebtSnapshotStaleTime() internal view returns (uint) {
        return flexibleStorage().getUIntValue(SETTING_CONTRACT_NAME, SETTING_DEBT_SNAPSHOT_STALE_TIME);
    }
}


pragma experimental ABIEncoderV2;


interface ISynthetixBridgeToOptimism {
    // Invoked by the relayer on L1
    function completeWithdrawal(address account, uint amount) external;

    // The following functions can be invoked by users on L1
    function initiateDeposit(uint amount) external;

    function initiateEscrowMigration(uint256[][] calldata entryIDs) external;

    function initiateRewardDeposit(uint amount) external;

    function depositAndMigrateEscrow(uint256 depositAmount, uint256[][] calldata entryIDs) external;
}


interface IVirtualSynth {
    // Views
    function balanceOfUnderlying(address account) external view returns (uint);

    function rate() external view returns (uint);

    function readyToSettle() external view returns (bool);

    function secsLeftInWaitingPeriod() external view returns (uint);

    function settled() external view returns (bool);

    function synth() external view returns (ISynth);

    // Mutative functions
    function settle(address account) external;
}


// https://docs.synthetix.io/contracts/source/interfaces/isynthetix
interface ISynthetix {
    // Views
    function anySynthOrSNXRateIsInvalid() external view returns (bool anyRateInvalid);

    function availableCurrencyKeys() external view returns (bytes32[] memory);

    function availableSynthCount() external view returns (uint);

    function availableSynths(uint index) external view returns (ISynth);

    function collateral(address account) external view returns (uint);

    function collateralisationRatio(address issuer) external view returns (uint);

    function debtBalanceOf(address issuer, bytes32 currencyKey) external view returns (uint);

    function isWaitingPeriod(bytes32 currencyKey) external view returns (bool);

    function maxIssuableSynths(address issuer) external view returns (uint maxIssuable);

    function remainingIssuableSynths(address issuer)
        external
        view
        returns (
            uint maxIssuable,
            uint alreadyIssued,
            uint totalSystemDebt
        );

    function synths(bytes32 currencyKey) external view returns (ISynth);

    function synthsByAddress(address synthAddress) external view returns (bytes32);

    function totalIssuedSynths(bytes32 currencyKey) external view returns (uint);

    function totalIssuedSynthsExcludeEtherCollateral(bytes32 currencyKey) external view returns (uint);

    function transferableSynthetix(address account) external view returns (uint transferable);

    // Mutative Functions
    function burnSynths(uint amount) external;

    function burnSynthsOnBehalf(address burnForAddress, uint amount) external;

    function burnSynthsToTarget() external;

    function burnSynthsToTargetOnBehalf(address burnForAddress) external;

    function exchange(
        bytes32 sourceCurrencyKey,
        uint sourceAmount,
        bytes32 destinationCurrencyKey
    ) external returns (uint amountReceived);

    function exchangeOnBehalf(
        address exchangeForAddress,
        bytes32 sourceCurrencyKey,
        uint sourceAmount,
        bytes32 destinationCurrencyKey
    ) external returns (uint amountReceived);

    function exchangeWithTracking(
        bytes32 sourceCurrencyKey,
        uint sourceAmount,
        bytes32 destinationCurrencyKey,
        address originator,
        bytes32 trackingCode
    ) external returns (uint amountReceived);

    function exchangeOnBehalfWithTracking(
        address exchangeForAddress,
        bytes32 sourceCurrencyKey,
        uint sourceAmount,
        bytes32 destinationCurrencyKey,
        address originator,
        bytes32 trackingCode
    ) external returns (uint amountReceived);

    function exchangeWithVirtual(
        bytes32 sourceCurrencyKey,
        uint sourceAmount,
        bytes32 destinationCurrencyKey,
        bytes32 trackingCode
    ) external returns (uint amountReceived, IVirtualSynth vSynth);

    function issueMaxSynths() external;

    function issueMaxSynthsOnBehalf(address issueForAddress) external;

    function issueSynths(uint amount) external;

    function issueSynthsOnBehalf(address issueForAddress, uint amount) external;

    function mint() external returns (bool);

    function settle(bytes32 currencyKey)
        external
        returns (
            uint reclaimed,
            uint refunded,
            uint numEntries
        );

    // Liquidations
    function liquidateDelinquentAccount(address account, uint susdAmount) external returns (bool);

    // Restricted Functions

    function mintSecondary(address account, uint amount) external;

    function mintSecondaryRewards(uint amount) external;

    function burnSecondary(address account, uint amount) external;
}


// https://docs.synthetix.io/contracts/source/interfaces/ierc20
interface IERC20 {
    // ERC20 Optional Views
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    // Views
    function totalSupply() external view returns (uint);

    function balanceOf(address owner) external view returns (uint);

    function allowance(address owner, address spender) external view returns (uint);

    // Mutative functions
    function transfer(address to, uint value) external returns (bool);

    function approve(address spender, uint value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint value
    ) external returns (bool);

    // Events
    event Transfer(address indexed from, address indexed to, uint value);

    event Approval(address indexed owner, address indexed spender, uint value);
}


library VestingEntries {
    struct VestingEntry {
        uint64 endTime;
        uint256 escrowAmount;
    }
    struct VestingEntryWithID {
        uint64 endTime;
        uint256 escrowAmount;
        uint256 entryID;
    }
}


interface IRewardEscrowV2 {
    // Views
    function balanceOf(address account) external view returns (uint);

    function numVestingEntries(address account) external view returns (uint);

    function totalEscrowedAccountBalance(address account) external view returns (uint);

    function totalVestedAccountBalance(address account) external view returns (uint);

    function getVestingQuantity(address account, uint256[] calldata entryIDs) external view returns (uint);

    function getVestingSchedules(
        address account,
        uint256 index,
        uint256 pageSize
    ) external view returns (VestingEntries.VestingEntryWithID[] memory);

    function getAccountVestingEntryIDs(
        address account,
        uint256 index,
        uint256 pageSize
    ) external view returns (uint256[] memory);

    function getVestingEntryClaimable(address account, uint256 entryID) external view returns (uint);

    function getVestingEntry(address account, uint256 entryID) external view returns (uint64, uint256);

    // Mutative functions
    function vest(uint256[] calldata entryIDs) external;

    function createEscrowEntry(
        address beneficiary,
        uint256 deposit,
        uint256 duration
    ) external;

    function appendVestingEntry(
        address account,
        uint256 quantity,
        uint256 duration
    ) external;

    function migrateVestingSchedule(address _addressToMigrate) external;

    function migrateAccountEscrowBalances(
        address[] calldata accounts,
        uint256[] calldata escrowBalances,
        uint256[] calldata vestedBalances
    ) external;

    // Account Merging
    function startMergingWindow() external;

    function mergeAccount(address accountToMerge, uint256[] calldata entryIDs) external;

    function nominateAccountToMerge(address account) external;

    function accountMergingIsOpen() external view returns (bool);

    // L2 Migration
    function importVestingEntries(
        address account,
        uint256 escrowedAmount,
        VestingEntries.VestingEntry[] calldata vestingEntries
    ) external;

    // Return amount of SNX transfered to SynthetixBridgeToOptimism deposit contract
    function burnForMigration(address account, uint256[] calldata entryIDs)
        external
        returns (uint256 escrowedAccountBalance, VestingEntries.VestingEntry[] memory vestingEntries);
}


interface ISynthetixBridgeToBase {
    // invoked by users on L2
    function initiateWithdrawal(uint amount) external;

    //  // The following functions can only be invoked by the xDomain messenger on L2
    function completeDeposit(address account, uint depositAmount) external;

    // invoked by the xDomain messenger on L2
    function completeEscrowMigration(
        address account,
        uint256 escrowedAmount,
        VestingEntries.VestingEntry[] calldata vestingEntries
    ) external;

    // invoked by the xDomain messenger on L2
    function completeRewardDeposit(uint amount) external;
}


// SPDX-License-Identifier: UNLICENSED


/**
 * @title iOVM_BaseCrossDomainMessenger
 */
interface iOVM_BaseCrossDomainMessenger {
    /**********************
     * Contract Variables *
     **********************/
    function xDomainMessageSender() external view returns (address);

    /********************
     * Public Functions *
     ********************/

    /**
     * Sends a cross domain message to the target messenger.
     * @param _target Target contract address.
     * @param _message Message to send to the target.
     * @param _gasLimit Gas limit for the provided message.
     */
    function sendMessage(
        address _target,
        bytes calldata _message,
        uint32 _gasLimit
    ) external;
}


// Inheritance


// Internal references


// solhint-disable indent


contract SynthetixBridgeToOptimism is Owned, MixinSystemSettings, ISynthetixBridgeToOptimism {
    /* ========== ADDRESS RESOLVER CONFIGURATION ========== */
    bytes32 private constant CONTRACT_EXT_MESSENGER = "ext:Messenger";
    bytes32 private constant CONTRACT_SYNTHETIX = "Synthetix";
    bytes32 private constant CONTRACT_ISSUER = "Issuer";
    bytes32 private constant CONTRACT_REWARDSDISTRIBUTION = "RewardsDistribution";
    bytes32 private constant CONTRACT_REWARDESCROW = "RewardEscrowV2";
    bytes32 private constant CONTRACT_OVM_SYNTHETIXBRIDGETOBASE = "ovm:SynthetixBridgeToBase";

    uint8 private constant MAX_ENTRIES_MIGRATED_PER_MESSAGE = 26;

    bool public activated;

    // ========== CONSTRUCTOR ==========

    constructor(address _owner, address _resolver) public Owned(_owner) MixinSystemSettings(_resolver) {
        activated = true;
    }

    //
    // ========== INTERNALS ============

    function messenger() internal view returns (iOVM_BaseCrossDomainMessenger) {
        return iOVM_BaseCrossDomainMessenger(requireAndGetAddress(CONTRACT_EXT_MESSENGER));
    }

    function synthetix() internal view returns (ISynthetix) {
        return ISynthetix(requireAndGetAddress(CONTRACT_SYNTHETIX));
    }

    function synthetixERC20() internal view returns (IERC20) {
        return IERC20(requireAndGetAddress(CONTRACT_SYNTHETIX));
    }

    function issuer() internal view returns (IIssuer) {
        return IIssuer(requireAndGetAddress(CONTRACT_ISSUER));
    }

    function rewardsDistribution() internal view returns (address) {
        return requireAndGetAddress(CONTRACT_REWARDSDISTRIBUTION);
    }

    function rewardEscrowV2() internal view returns (IRewardEscrowV2) {
        return IRewardEscrowV2(requireAndGetAddress(CONTRACT_REWARDESCROW));
    }

    function synthetixBridgeToBase() internal view returns (address) {
        return requireAndGetAddress(CONTRACT_OVM_SYNTHETIXBRIDGETOBASE);
    }

    function isActive() internal view {
        require(activated, "Function deactivated");
    }

    function hasZeroDebt() internal view {
        require(issuer().debtBalanceOf(msg.sender, "sUSD") == 0, "Cannot deposit or migrate with debt");
    }

    /* ========== VIEWS ========== */

    function resolverAddressesRequired() public view returns (bytes32[] memory addresses) {
        bytes32[] memory existingAddresses = MixinSystemSettings.resolverAddressesRequired();
        bytes32[] memory newAddresses = new bytes32[](6);
        newAddresses[0] = CONTRACT_EXT_MESSENGER;
        newAddresses[1] = CONTRACT_SYNTHETIX;
        newAddresses[2] = CONTRACT_ISSUER;
        newAddresses[3] = CONTRACT_REWARDSDISTRIBUTION;
        newAddresses[4] = CONTRACT_OVM_SYNTHETIXBRIDGETOBASE;
        newAddresses[5] = CONTRACT_REWARDESCROW;
        addresses = combineArrays(existingAddresses, newAddresses);
    }

    // ========== MODIFIERS ============

    modifier requireActive() {
        isActive();
        _;
    }

    modifier requireZeroDebt() {
        hasZeroDebt();
        _;
    }

    // ========== PUBLIC FUNCTIONS =========

    function initiateDeposit(uint256 depositAmount) external requireActive requireZeroDebt {
        _initiateDeposit(depositAmount);
    }

    function initiateEscrowMigration(uint256[][] memory entryIDs) public requireActive requireZeroDebt {
        _initiateEscrowMigration(entryIDs);
    }

    // invoked by a generous user on L1
    function initiateRewardDeposit(uint amount) external requireActive {
        // move the SNX into this contract
        synthetixERC20().transferFrom(msg.sender, address(this), amount);

        _initiateRewardDeposit(amount);
    }

    // ========= RESTRICTED FUNCTIONS ==============

    // invoked by Messenger on L1 after L2 waiting period elapses
    function completeWithdrawal(address account, uint256 amount) external requireActive {
        // ensure function only callable from L2 Bridge via messenger (aka relayer)
        require(msg.sender == address(messenger()), "Only the relayer can call this");
        require(messenger().xDomainMessageSender() == synthetixBridgeToBase(), "Only the L2 bridge can invoke");

        // transfer amount back to user
        synthetixERC20().transfer(account, amount);

        // no escrow actions - escrow remains on L2
        emit WithdrawalCompleted(account, amount);
    }

    // invoked by the owner for migrating the contract to the new version that will allow for withdrawals
    function migrateBridge(address newBridge) external onlyOwner requireActive {
        require(newBridge != address(0), "Cannot migrate to address 0");
        activated = false;

        IERC20 ERC20Synthetix = synthetixERC20();
        // get the current contract balance and transfer it to the new SynthetixL1ToL2Bridge contract
        uint256 contractBalance = ERC20Synthetix.balanceOf(address(this));
        ERC20Synthetix.transfer(newBridge, contractBalance);

        emit BridgeMigrated(address(this), newBridge, contractBalance);
    }

    // invoked by RewardsDistribution on L1 (takes SNX)
    function notifyRewardAmount(uint256 amount) external requireActive {
        require(msg.sender == address(rewardsDistribution()), "Caller is not RewardsDistribution contract");

        // to be here means I've been given an amount of SNX to distribute onto L2
        _initiateRewardDeposit(amount);
    }

    function depositAndMigrateEscrow(uint256 depositAmount, uint256[][] memory entryIDs)
        public
        requireActive
        requireZeroDebt
    {
        if (entryIDs.length > 0) {
            _initiateEscrowMigration(entryIDs);
        }

        if (depositAmount > 0) {
            _initiateDeposit(depositAmount);
        }
    }

    // ========== PRIVATE/INTERNAL FUNCTIONS =========

    function _initiateRewardDeposit(uint256 _amount) internal {
        // create message payload for L2
        ISynthetixBridgeToBase bridgeToBase;
        bytes memory messageData = abi.encodeWithSelector(bridgeToBase.completeRewardDeposit.selector, _amount);

        // relay the message to this contract on L2 via L1 Messenger
        messenger().sendMessage(
            synthetixBridgeToBase(),
            messageData,
            uint32(getCrossDomainMessageGasLimit(CrossDomainMessageGasLimits.Reward))
        );

        emit RewardDeposit(msg.sender, _amount);
    }

    function _initiateDeposit(uint256 _depositAmount) private {
        // Transfer SNX to L2
        // First, move the SNX into this contract
        synthetixERC20().transferFrom(msg.sender, address(this), _depositAmount);
        // create message payload for L2
        ISynthetixBridgeToBase bridgeToBase;
        bytes memory messageData = abi.encodeWithSelector(bridgeToBase.completeDeposit.selector, msg.sender, _depositAmount);

        // relay the message to this contract on L2 via L1 Messenger
        messenger().sendMessage(
            synthetixBridgeToBase(),
            messageData,
            uint32(getCrossDomainMessageGasLimit(CrossDomainMessageGasLimits.Deposit))
        );
        emit Deposit(msg.sender, _depositAmount);
    }

    function _initiateEscrowMigration(uint256[][] memory _entryIDs) private {
        // loop through the entryID array
        for (uint256 i = 0; i < _entryIDs.length; i++) {
            // Cannot send more than MAX_ENTRIES_MIGRATED_PER_MESSAGE entries due to ovm gas restrictions
            require(_entryIDs[i].length <= MAX_ENTRIES_MIGRATED_PER_MESSAGE, "Exceeds max entries per migration");
            // Burn their reward escrow first
            // Note: escrowSummary would lose the fidelity of the weekly escrows, so this may not be sufficient
            uint256 escrowedAccountBalance;
            VestingEntries.VestingEntry[] memory vestingEntries;
            (escrowedAccountBalance, vestingEntries) = rewardEscrowV2().burnForMigration(msg.sender, _entryIDs[i]);
            // if there is an escrow amount to be migrated
            if (escrowedAccountBalance > 0) {
                // create message payload for L2
                ISynthetixBridgeToBase bridgeToBase;
                bytes memory messageData = abi.encodeWithSelector(
                    bridgeToBase.completeEscrowMigration.selector,
                    msg.sender,
                    escrowedAccountBalance,
                    vestingEntries
                );
                // relay the message to this contract on L2 via L1 Messenger
                messenger().sendMessage(
                    synthetixBridgeToBase(),
                    messageData,
                    uint32(getCrossDomainMessageGasLimit(CrossDomainMessageGasLimits.Escrow))
                );
                emit ExportedVestingEntries(msg.sender, escrowedAccountBalance, vestingEntries);
            }
        }
    }

    // ========== EVENTS ==========

    event BridgeMigrated(address oldBridge, address newBridge, uint256 amount);
    event Deposit(address indexed account, uint256 amount);
    event ExportedVestingEntries(
        address indexed account,
        uint256 escrowedAccountBalance,
        VestingEntries.VestingEntry[] vestingEntries
    );
    event RewardDeposit(address indexed account, uint256 amount);
    event WithdrawalCompleted(address indexed account, uint256 amount);
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_resolver","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldBridge","type":"address"},{"indexed":false,"internalType":"address","name":"newBridge","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BridgeMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"name","type":"bytes32"},{"indexed":false,"internalType":"address","name":"destination","type":"address"}],"name":"CacheUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"escrowedAccountBalance","type":"uint256"},{"components":[{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint256","name":"escrowAmount","type":"uint256"}],"indexed":false,"internalType":"struct VestingEntries.VestingEntry[]","name":"vestingEntries","type":"tuple[]"}],"name":"ExportedVestingEntries","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawalCompleted","type":"event"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"activated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"completeWithdrawal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256[][]","name":"entryIDs","type":"uint256[][]"}],"name":"depositAndMigrateEscrow","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"}],"name":"initiateDeposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256[][]","name":"entryIDs","type":"uint256[][]"}],"name":"initiateEscrowMigration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"initiateRewardDeposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isResolverCached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newBridge","type":"address"}],"name":"migrateBridge","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"rebuildCache","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"resolver","outputs":[{"internalType":"contract AddressResolver","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"resolverAddressesRequired","outputs":[{"internalType":"bytes32[]","name":"addresses","type":"bytes32[]"}],"payable":false,"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200237438038062002374833981016040819052620000349162000108565b8080836001600160a01b038116620000695760405162461bcd60e51b81526004016200006090620001c4565b60405180910390fd5b600080546001600160a01b0319166001600160a01b0383161781556040517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91620000b69184906200019e565b60405180910390a150600280546001600160a01b0319166001600160a01b039290921691909117905550506004805460ff19166001179055506200021f565b8051620001028162000205565b92915050565b600080604083850312156200011c57600080fd5b60006200012a8585620000f5565b92505060206200013d85828601620000f5565b9150509250929050565b6200015281620001f1565b82525050565b6200015281620001df565b600062000172601983620001d6565b7f4f776e657220616464726573732063616e6e6f74206265203000000000000000815260200192915050565b60408101620001ae828562000147565b620001bd602083018462000158565b9392505050565b60208082528101620001028162000163565b90815260200190565b60006001600160a01b03821662000102565b6000620001028260006200010282620001df565b6200021081620001df565b81146200021c57600080fd5b50565b612145806200022f6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806379ba509711610097578063cb82747411610066578063cb827474146101d0578063ccce9506146101e3578063d7f5b359146101f6578063e2ff2d431461020957610100565b806379ba509714610198578063899ffef4146101a05780638da5cb5b146101b5578063a18e2307146101bd57610100565b80633c6b16ab116100d35780633c6b16ab1461015557806353a47bb7146101685780636bfd78351461017d578063741853601461019057610100565b806304f3bcec146101055780631627540c14610123578063186601ca146101385780632af64bd31461014d575b600080fd5b61010d61021c565b60405161011a9190611f1f565b60405180910390f35b6101366101313660046116fe565b61022b565b005b610140610289565b60405161011a9190611ec7565b610140610292565b6101366101633660046117cf565b6103aa565b6101706103ff565b60405161011a9190611d96565b61013661018b36600461177c565b61040e565b610136610427565b61013661057d565b6101a8610619565b60405161011a9190611eb6565b610170610760565b6101366101cb36600461180b565b61076f565b6101366101de3660046117cf565b61079e565b6101366101f13660046117cf565b6107b7565b6101366102043660046116fe565b610852565b610136610217366004611742565b6109e0565b6002546001600160a01b031681565b610233610b9c565b600180546001600160a01b0319166001600160a01b0383161790556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229061027e908390611d96565b60405180910390a150565b60045460ff1681565b6000606061029e610619565b905060005b81518110156103a05760008282815181106102ba57fe5b602090810291909101810151600081815260039092526040918290205460025492516321f8a72160e01b81529193506001600160a01b039081169216906321f8a7219061030b908590600401611ed5565b60206040518083038186803b15801561032357600080fd5b505afa158015610337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061035b9190810190611724565b6001600160a01b031614158061038657506000818152600360205260409020546001600160a01b0316155b1561039757600093505050506103a7565b506001016102a3565b5060019150505b90565b6103b2610bc8565b6103ba610bea565b6001600160a01b0316336001600160a01b0316146103f35760405162461bcd60e51b81526004016103ea90611fae565b60405180910390fd5b6103fc81610c10565b50565b6001546001600160a01b031681565b610416610bc8565b61041e610d23565b6103fc81610dc3565b6060610431610619565b905060005b815181101561057957600082828151811061044d57fe5b602002602001015190506000600260009054906101000a90046001600160a01b03166001600160a01b031663dacb2d01838460405160200161048f9190611d8b565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016104bb929190611eff565b60206040518083038186803b1580156104d357600080fd5b505afa1580156104e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061050b9190810190611724565b6000838152600360205260409081902080546001600160a01b0319166001600160a01b038416179055519091507f88a93678a3692f6789d9546fc621bf7234b101ddb7d4fe479455112831b8aa68906105679084908490611ee3565b60405180910390a15050600101610436565b5050565b6001546001600160a01b031633146105a75760405162461bcd60e51b81526004016103ea90611f3e565b6000546001546040517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c926105ea926001600160a01b0391821692911690611e5e565b60405180910390a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b606080610624610fd5565b60408051600680825260e08201909252919250606091906020820160c0803883390190505090506c32bc3a1d26b2b9b9b2b733b2b960991b8160008151811061066957fe5b602002602001018181525050680a6f2dce8d0cae8d2f60bb1b8160018151811061068f57fe5b6020026020010181815250506524b9b9bab2b960d11b816002815181106106b257fe5b602002602001018181525050722932bbb0b93239a234b9ba3934b13aba34b7b760691b816003815181106106e257fe5b602002602001018181525050786f766d3a53796e746865746978427269646765546f4261736560381b8160048151811061071857fe5b6020026020010181815250506d2932bbb0b93222b9b1b937bbab1960911b8160058151811061074357fe5b6020026020010181815250506107598282611026565b9250505090565b6000546001600160a01b031681565b610777610bc8565b61077f610d23565b80511561078f5761078f81610dc3565b811561057957610579826110e2565b6107a6610bc8565b6107ae610d23565b6103fc816110e2565b6107bf610bc8565b6107c7611274565b6001600160a01b03166323b872dd3330846040518463ffffffff1660e01b81526004016107f693929190611da4565b602060405180830381600087803b15801561081057600080fd5b505af1158015610824573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061084891908101906117b1565b506103fc81610c10565b61085a610b9c565b610862610bc8565b6001600160a01b0381166108885760405162461bcd60e51b81526004016103ea90611fbe565b6004805460ff19169055600061089c611274565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016108cc9190611d96565b60206040518083038186803b1580156108e457600080fd5b505afa1580156108f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061091c91908101906117ed565b60405163a9059cbb60e01b81529091506001600160a01b0383169063a9059cbb9061094d9086908590600401611e06565b602060405180830381600087803b15801561096757600080fd5b505af115801561097b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061099f91908101906117b1565b507fa1bbeeb6860c5db529c582b6bdbc57a2e9862ef771e5bed3a082f7d9da54904a3084836040516109d393929190611e79565b60405180910390a1505050565b6109e8610bc8565b6109f061128b565b6001600160a01b0316336001600160a01b031614610a205760405162461bcd60e51b81526004016103ea90611f9e565b610a286112a6565b6001600160a01b0316610a3961128b565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b158015610a7157600080fd5b505afa158015610a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610aa99190810190611724565b6001600160a01b031614610acf5760405162461bcd60e51b81526004016103ea90611f4e565b610ad7611274565b6001600160a01b031663a9059cbb83836040518363ffffffff1660e01b8152600401610b04929190611e06565b602060405180830381600087803b158015610b1e57600080fd5b505af1158015610b32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b5691908101906117b1565b50816001600160a01b03167f1a39b9c5044b9f0ff56c5951e30c1ebe24911353aafcceb9250e83a24fe158c482604051610b909190611ed5565b60405180910390a25050565b6000546001600160a01b03163314610bc65760405162461bcd60e51b81526004016103ea90611f8e565b565b60045460ff16610bc65760405162461bcd60e51b81526004016103ea90611f6e565b6000610c0b722932bbb0b93239a234b9ba3934b13aba34b7b760691b6112c9565b905090565b60405160009060609063f69053c560e01b90610c30908590602401611ed5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050610c6c61128b565b6001600160a01b0316633dbb202b610c826112a6565b83610c8d600261132f565b6040518463ffffffff1660e01b8152600401610cab93929190611e87565b600060405180830381600087803b158015610cc557600080fd5b505af1158015610cd9573d6000803e3d6000fd5b50505050336001600160a01b03167f95bf5847357310d24f8d03d8bad76c8ee329dfd3a3cb200df21c7bd1619e93bd84604051610d169190611ed5565b60405180910390a2505050565b610d2b6113d5565b6001600160a01b031663d37c4d8b336040518263ffffffff1660e01b8152600401610d569190611dec565b60206040518083038186803b158015610d6e57600080fd5b505afa158015610d82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610da691908101906117ed565b15610bc65760405162461bcd60e51b81526004016103ea90611f7e565b60005b815181101561057957601a60ff16828281518110610de057fe5b6020026020010151511115610e075760405162461bcd60e51b81526004016103ea90611f5e565b60006060610e136113e9565b6001600160a01b03166380d46f5833868681518110610e2e57fe5b60200260200101516040518363ffffffff1660e01b8152600401610e53929190611dcc565b600060405180830381600087803b158015610e6d57600080fd5b505af1158015610e81573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ea99190810190611853565b90925090508115610fcb5760405160009060609063355bf0e160e11b90610ed890339087908790602401611e28565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050610f1461128b565b6001600160a01b0316633dbb202b610f2a6112a6565b83610f35600161132f565b6040518463ffffffff1660e01b8152600401610f5393929190611e87565b600060405180830381600087803b158015610f6d57600080fd5b505af1158015610f81573d6000803e3d6000fd5b50505050336001600160a01b03167f4dc5956ab6218a4dfa2cc5e5c50d98d039dde03aabfc504c54b601b6f56226968585604051610fc0929190611fde565b60405180910390a250505b5050600101610dc6565b604080516001808252818301909252606091602080830190803883390190505090506e466c657869626c6553746f7261676560881b8160008151811061101757fe5b60200260200101818152505090565b60608151835101604051908082528060200260200182016040528015611056578160200160208202803883390190505b50905060005b83518110156110985783818151811061107157fe5b602002602001015182828151811061108557fe5b602090810291909101015260010161105c565b5060005b82518110156110db578281815181106110b157fe5b60200260200101518282865101815181106110c857fe5b602090810291909101015260010161109c565b5092915050565b6110ea611274565b6001600160a01b03166323b872dd3330846040518463ffffffff1660e01b815260040161111993929190611da4565b602060405180830381600087803b15801561113357600080fd5b505af1158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061116b91908101906117b1565b506040516000906060906309853aff60e11b9061118e9033908690602401611e06565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290506111ca61128b565b6001600160a01b0316633dbb202b6111e06112a6565b836111eb600061132f565b6040518463ffffffff1660e01b815260040161120993929190611e87565b600060405180830381600087803b15801561122357600080fd5b505af1158015611237573d6000803e3d6000fd5b50505050336001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c84604051610d169190611ed5565b6000610c0b680a6f2dce8d0cae8d2f60bb1b6112c9565b6000610c0b6c32bc3a1d26b2b9b9b2b733b2b960991b6112c9565b6000610c0b786f766d3a53796e746865746978427269646765546f4261736560381b5b60008181526003602090815260408083205490516001600160a01b0390911691821515916112f991869101611d6b565b604051602081830303815290604052906113265760405162461bcd60e51b81526004016103ea9190611f2d565b5090505b919050565b6000611339611405565b6001600160a01b03166323257c2b6d53797374656d53657474696e677360901b61136285611422565b6040518363ffffffff1660e01b815260040161137f929190611ef1565b60206040518083038186803b15801561139757600080fd5b505afa1580156113ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113cf91908101906117ed565b92915050565b6000610c0b6524b9b9bab2b960d11b6112c9565b6000610c0b6d2932bbb0b93222b9b1b937bbab1960911b6112c9565b6000610c0b6e466c657869626c6553746f7261676560881b6112c9565b60008082600381111561143157fe5b141561145e57507f63726f7373446f6d61696e4465706f7369744761734c696d697400000000000061132a565b600182600381111561146c57fe5b141561149957507f63726f7373446f6d61696e457363726f774761734c696d69740000000000000061132a565b60028260038111156114a757fe5b14156114d457507f63726f7373446f6d61696e5265776172644761734c696d69740000000000000061132a565b60038260038111156114e257fe5b141561150f57507f63726f7373446f6d61696e5769746864726177616c4761734c696d697400000061132a565b60405162461bcd60e51b81526004016103ea90611fce565b80356113cf816120d3565b80516113cf816120d3565b600082601f83011261154e57600080fd5b813561156161155c82612025565b611ffe565b81815260209384019390925082018360005b8381101561159f5781358601611589888261161b565b8452506020928301929190910190600101611573565b5050505092915050565b600082601f8301126115ba57600080fd5b81516115c861155c82612025565b915081818352602084019350602081019050838560408402820111156115ed57600080fd5b60005b8381101561159f57816116038882611696565b845250602090920191604091909101906001016115f0565b600082601f83011261162c57600080fd5b813561163a61155c82612025565b9150818183526020840193506020810190508385602084028201111561165f57600080fd5b60005b8381101561159f578161167588826116dd565b8452506020928301929190910190600101611662565b80516113cf816120e7565b6000604082840312156116a857600080fd5b6116b26040611ffe565b905060006116c084846116f3565b82525060206116d1848483016116e8565b60208301525092915050565b80356113cf816120f0565b80516113cf816120f0565b80516113cf816120f9565b60006020828403121561171057600080fd5b600061171c8484611527565b949350505050565b60006020828403121561173657600080fd5b600061171c8484611532565b6000806040838503121561175557600080fd5b60006117618585611527565b9250506020611772858286016116dd565b9150509250929050565b60006020828403121561178e57600080fd5b813567ffffffffffffffff8111156117a557600080fd5b61171c8482850161153d565b6000602082840312156117c357600080fd5b600061171c848461168b565b6000602082840312156117e157600080fd5b600061171c84846116dd565b6000602082840312156117ff57600080fd5b600061171c84846116e8565b6000806040838503121561181e57600080fd5b600061182a85856116dd565b925050602083013567ffffffffffffffff81111561184757600080fd5b6117728582860161153d565b6000806040838503121561186657600080fd5b600061187285856116e8565b925050602083015167ffffffffffffffff81111561188f57600080fd5b611772858286016115a9565b60006118a783836119d9565b505060200190565b60006118bb8383611d2f565b505060400190565b6118cc8161208b565b82525050565b6118cc81612059565b60006118e68261204c565b6118f08185612050565b93506118fb83612046565b8060005b83811015611929578151611913888261189b565b975061191e83612046565b9250506001016118ff565b509495945050505050565b600061193f8261204c565b6119498185612050565b935061195483612046565b8060005b8381101561192957815161196c88826118af565b975061197783612046565b925050600101611958565b600061198d8261204c565b6119978185612050565b93506119a283612046565b8060005b838110156119295781516119ba888261189b565b97506119c583612046565b9250506001016119a6565b6118cc81612064565b6118cc816103a7565b6118cc6119ee826103a7565b6103a7565b60006119fe8261204c565b611a088185612050565b9350611a1881856020860161209d565b611a21816120c9565b9093019392505050565b6118cc81612092565b6000611a41603583612050565b7f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7581527402063616e20616363657074206f776e65727368697605c1b602082015260400192915050565b6000611a98601d83612050565b7f4f6e6c7920746865204c32206272696467652063616e20696e766f6b65000000815260200192915050565b6000611ad1602183612050565b7f45786365656473206d617820656e747269657320706572206d6967726174696f8152603760f91b602082015260400192915050565b6000611b14601483612050565b73119d5b98dd1a5bdb8819195858dd1a5d985d195960621b815260200192915050565b6000611b4460118361132a565b70026b4b9b9b4b7339030b2323932b9b99d1607d1b815260110192915050565b6000611b71602383612050565b7f43616e6e6f74206465706f736974206f72206d6967726174652077697468206481526219589d60ea1b602082015260400192915050565b6000611bb6602f83612050565b7f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726681526e37b936903a3434b99030b1ba34b7b760891b602082015260400192915050565b631cd554d160e21b9052565b6000611c13601e83612050565b7f4f6e6c79207468652072656c617965722063616e2063616c6c20746869730000815260200192915050565b6000611c4c60198361132a565b7f5265736f6c766572206d697373696e67207461726765743a2000000000000000815260190192915050565b6000611c85602a83612050565b7f43616c6c6572206973206e6f742052657761726473446973747269627574696f8152691b8818dbdb9d1c9858dd60b21b602082015260400192915050565b6000611cd1601b83612050565b7f43616e6e6f74206d69677261746520746f206164647265737320300000000000815260200192915050565b6000611d0a601683612050565b75556e6b6e6f776e20676173206c696d6974207479706560501b815260200192915050565b80516040830190611d408482611d62565b506020820151611d5360208501826119d9565b50505050565b6118cc81612075565b6118cc8161207e565b6000611d7682611b37565b9150611d8282846119e2565b50602001919050565b6000611d7682611c3f565b602081016113cf82846118d2565b60608101611db282866118c3565b611dbf60208301856118d2565b61171c60408301846119d9565b60408101611dda82856118c3565b818103602083015261171c8184611982565b60408101611dfa82846118c3565b6113cf60208301611bfa565b60408101611e1482856118d2565b611e2160208301846119d9565b9392505050565b60608101611e3682866118d2565b611e4360208301856119d9565b8181036040830152611e558184611934565b95945050505050565b60408101611e6c82856118d2565b611e2160208301846118d2565b60608101611db282866118d2565b60608101611e9582866118d2565b8181036020830152611ea781856119f3565b905061171c6040830184611d59565b60208082528101611e2181846118db565b602081016113cf82846119d0565b602081016113cf82846119d9565b60408101611e6c82856119d9565b60408101611e1482856119d9565b60408101611f0d82856119d9565b818103602083015261171c81846119f3565b602081016113cf8284611a2b565b60208082528101611e2181846119f3565b602080825281016113cf81611a34565b602080825281016113cf81611a8b565b602080825281016113cf81611ac4565b602080825281016113cf81611b07565b602080825281016113cf81611b64565b602080825281016113cf81611ba9565b602080825281016113cf81611c06565b602080825281016113cf81611c78565b602080825281016113cf81611cc4565b602080825281016113cf81611cfd565b60408101611fec82856119d9565b818103602083015261171c8184611934565b60405181810167ffffffffffffffff8111828210171561201d57600080fd5b604052919050565b600067ffffffffffffffff82111561203c57600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b60006113cf82612069565b151590565b6001600160a01b031690565b63ffffffff1690565b67ffffffffffffffff1690565b60006113cf825b60006113cf82612059565b60005b838110156120b85781810151838201526020016120a0565b83811115611d535750506000910152565b601f01601f191690565b6120dc81612059565b81146103fc57600080fd5b6120dc81612064565b6120dc816103a7565b6120dc8161207e56fea365627a7a723158200d11a8cff7227cbc4528143740c418a2f4d7185f28be3065ea838f7a9c1a75806c6578706572696d656e74616cf564736f6c63430005100040000000000000000000000000de910777c787903f78c89e7a0bf7f4c435cbb1fe0000000000000000000000004e3b31eb0e5cb73641ee1e65e7dcefe520ba3ef2

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101005760003560e01c806379ba509711610097578063cb82747411610066578063cb827474146101d0578063ccce9506146101e3578063d7f5b359146101f6578063e2ff2d431461020957610100565b806379ba509714610198578063899ffef4146101a05780638da5cb5b146101b5578063a18e2307146101bd57610100565b80633c6b16ab116100d35780633c6b16ab1461015557806353a47bb7146101685780636bfd78351461017d578063741853601461019057610100565b806304f3bcec146101055780631627540c14610123578063186601ca146101385780632af64bd31461014d575b600080fd5b61010d61021c565b60405161011a9190611f1f565b60405180910390f35b6101366101313660046116fe565b61022b565b005b610140610289565b60405161011a9190611ec7565b610140610292565b6101366101633660046117cf565b6103aa565b6101706103ff565b60405161011a9190611d96565b61013661018b36600461177c565b61040e565b610136610427565b61013661057d565b6101a8610619565b60405161011a9190611eb6565b610170610760565b6101366101cb36600461180b565b61076f565b6101366101de3660046117cf565b61079e565b6101366101f13660046117cf565b6107b7565b6101366102043660046116fe565b610852565b610136610217366004611742565b6109e0565b6002546001600160a01b031681565b610233610b9c565b600180546001600160a01b0319166001600160a01b0383161790556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229061027e908390611d96565b60405180910390a150565b60045460ff1681565b6000606061029e610619565b905060005b81518110156103a05760008282815181106102ba57fe5b602090810291909101810151600081815260039092526040918290205460025492516321f8a72160e01b81529193506001600160a01b039081169216906321f8a7219061030b908590600401611ed5565b60206040518083038186803b15801561032357600080fd5b505afa158015610337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061035b9190810190611724565b6001600160a01b031614158061038657506000818152600360205260409020546001600160a01b0316155b1561039757600093505050506103a7565b506001016102a3565b5060019150505b90565b6103b2610bc8565b6103ba610bea565b6001600160a01b0316336001600160a01b0316146103f35760405162461bcd60e51b81526004016103ea90611fae565b60405180910390fd5b6103fc81610c10565b50565b6001546001600160a01b031681565b610416610bc8565b61041e610d23565b6103fc81610dc3565b6060610431610619565b905060005b815181101561057957600082828151811061044d57fe5b602002602001015190506000600260009054906101000a90046001600160a01b03166001600160a01b031663dacb2d01838460405160200161048f9190611d8b565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016104bb929190611eff565b60206040518083038186803b1580156104d357600080fd5b505afa1580156104e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061050b9190810190611724565b6000838152600360205260409081902080546001600160a01b0319166001600160a01b038416179055519091507f88a93678a3692f6789d9546fc621bf7234b101ddb7d4fe479455112831b8aa68906105679084908490611ee3565b60405180910390a15050600101610436565b5050565b6001546001600160a01b031633146105a75760405162461bcd60e51b81526004016103ea90611f3e565b6000546001546040517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c926105ea926001600160a01b0391821692911690611e5e565b60405180910390a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b606080610624610fd5565b60408051600680825260e08201909252919250606091906020820160c0803883390190505090506c32bc3a1d26b2b9b9b2b733b2b960991b8160008151811061066957fe5b602002602001018181525050680a6f2dce8d0cae8d2f60bb1b8160018151811061068f57fe5b6020026020010181815250506524b9b9bab2b960d11b816002815181106106b257fe5b602002602001018181525050722932bbb0b93239a234b9ba3934b13aba34b7b760691b816003815181106106e257fe5b602002602001018181525050786f766d3a53796e746865746978427269646765546f4261736560381b8160048151811061071857fe5b6020026020010181815250506d2932bbb0b93222b9b1b937bbab1960911b8160058151811061074357fe5b6020026020010181815250506107598282611026565b9250505090565b6000546001600160a01b031681565b610777610bc8565b61077f610d23565b80511561078f5761078f81610dc3565b811561057957610579826110e2565b6107a6610bc8565b6107ae610d23565b6103fc816110e2565b6107bf610bc8565b6107c7611274565b6001600160a01b03166323b872dd3330846040518463ffffffff1660e01b81526004016107f693929190611da4565b602060405180830381600087803b15801561081057600080fd5b505af1158015610824573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061084891908101906117b1565b506103fc81610c10565b61085a610b9c565b610862610bc8565b6001600160a01b0381166108885760405162461bcd60e51b81526004016103ea90611fbe565b6004805460ff19169055600061089c611274565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016108cc9190611d96565b60206040518083038186803b1580156108e457600080fd5b505afa1580156108f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061091c91908101906117ed565b60405163a9059cbb60e01b81529091506001600160a01b0383169063a9059cbb9061094d9086908590600401611e06565b602060405180830381600087803b15801561096757600080fd5b505af115801561097b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061099f91908101906117b1565b507fa1bbeeb6860c5db529c582b6bdbc57a2e9862ef771e5bed3a082f7d9da54904a3084836040516109d393929190611e79565b60405180910390a1505050565b6109e8610bc8565b6109f061128b565b6001600160a01b0316336001600160a01b031614610a205760405162461bcd60e51b81526004016103ea90611f9e565b610a286112a6565b6001600160a01b0316610a3961128b565b6001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b158015610a7157600080fd5b505afa158015610a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610aa99190810190611724565b6001600160a01b031614610acf5760405162461bcd60e51b81526004016103ea90611f4e565b610ad7611274565b6001600160a01b031663a9059cbb83836040518363ffffffff1660e01b8152600401610b04929190611e06565b602060405180830381600087803b158015610b1e57600080fd5b505af1158015610b32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b5691908101906117b1565b50816001600160a01b03167f1a39b9c5044b9f0ff56c5951e30c1ebe24911353aafcceb9250e83a24fe158c482604051610b909190611ed5565b60405180910390a25050565b6000546001600160a01b03163314610bc65760405162461bcd60e51b81526004016103ea90611f8e565b565b60045460ff16610bc65760405162461bcd60e51b81526004016103ea90611f6e565b6000610c0b722932bbb0b93239a234b9ba3934b13aba34b7b760691b6112c9565b905090565b60405160009060609063f69053c560e01b90610c30908590602401611ed5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050610c6c61128b565b6001600160a01b0316633dbb202b610c826112a6565b83610c8d600261132f565b6040518463ffffffff1660e01b8152600401610cab93929190611e87565b600060405180830381600087803b158015610cc557600080fd5b505af1158015610cd9573d6000803e3d6000fd5b50505050336001600160a01b03167f95bf5847357310d24f8d03d8bad76c8ee329dfd3a3cb200df21c7bd1619e93bd84604051610d169190611ed5565b60405180910390a2505050565b610d2b6113d5565b6001600160a01b031663d37c4d8b336040518263ffffffff1660e01b8152600401610d569190611dec565b60206040518083038186803b158015610d6e57600080fd5b505afa158015610d82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610da691908101906117ed565b15610bc65760405162461bcd60e51b81526004016103ea90611f7e565b60005b815181101561057957601a60ff16828281518110610de057fe5b6020026020010151511115610e075760405162461bcd60e51b81526004016103ea90611f5e565b60006060610e136113e9565b6001600160a01b03166380d46f5833868681518110610e2e57fe5b60200260200101516040518363ffffffff1660e01b8152600401610e53929190611dcc565b600060405180830381600087803b158015610e6d57600080fd5b505af1158015610e81573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ea99190810190611853565b90925090508115610fcb5760405160009060609063355bf0e160e11b90610ed890339087908790602401611e28565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050610f1461128b565b6001600160a01b0316633dbb202b610f2a6112a6565b83610f35600161132f565b6040518463ffffffff1660e01b8152600401610f5393929190611e87565b600060405180830381600087803b158015610f6d57600080fd5b505af1158015610f81573d6000803e3d6000fd5b50505050336001600160a01b03167f4dc5956ab6218a4dfa2cc5e5c50d98d039dde03aabfc504c54b601b6f56226968585604051610fc0929190611fde565b60405180910390a250505b5050600101610dc6565b604080516001808252818301909252606091602080830190803883390190505090506e466c657869626c6553746f7261676560881b8160008151811061101757fe5b60200260200101818152505090565b60608151835101604051908082528060200260200182016040528015611056578160200160208202803883390190505b50905060005b83518110156110985783818151811061107157fe5b602002602001015182828151811061108557fe5b602090810291909101015260010161105c565b5060005b82518110156110db578281815181106110b157fe5b60200260200101518282865101815181106110c857fe5b602090810291909101015260010161109c565b5092915050565b6110ea611274565b6001600160a01b03166323b872dd3330846040518463ffffffff1660e01b815260040161111993929190611da4565b602060405180830381600087803b15801561113357600080fd5b505af1158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061116b91908101906117b1565b506040516000906060906309853aff60e11b9061118e9033908690602401611e06565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290506111ca61128b565b6001600160a01b0316633dbb202b6111e06112a6565b836111eb600061132f565b6040518463ffffffff1660e01b815260040161120993929190611e87565b600060405180830381600087803b15801561122357600080fd5b505af1158015611237573d6000803e3d6000fd5b50505050336001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c84604051610d169190611ed5565b6000610c0b680a6f2dce8d0cae8d2f60bb1b6112c9565b6000610c0b6c32bc3a1d26b2b9b9b2b733b2b960991b6112c9565b6000610c0b786f766d3a53796e746865746978427269646765546f4261736560381b5b60008181526003602090815260408083205490516001600160a01b0390911691821515916112f991869101611d6b565b604051602081830303815290604052906113265760405162461bcd60e51b81526004016103ea9190611f2d565b5090505b919050565b6000611339611405565b6001600160a01b03166323257c2b6d53797374656d53657474696e677360901b61136285611422565b6040518363ffffffff1660e01b815260040161137f929190611ef1565b60206040518083038186803b15801561139757600080fd5b505afa1580156113ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113cf91908101906117ed565b92915050565b6000610c0b6524b9b9bab2b960d11b6112c9565b6000610c0b6d2932bbb0b93222b9b1b937bbab1960911b6112c9565b6000610c0b6e466c657869626c6553746f7261676560881b6112c9565b60008082600381111561143157fe5b141561145e57507f63726f7373446f6d61696e4465706f7369744761734c696d697400000000000061132a565b600182600381111561146c57fe5b141561149957507f63726f7373446f6d61696e457363726f774761734c696d69740000000000000061132a565b60028260038111156114a757fe5b14156114d457507f63726f7373446f6d61696e5265776172644761734c696d69740000000000000061132a565b60038260038111156114e257fe5b141561150f57507f63726f7373446f6d61696e5769746864726177616c4761734c696d697400000061132a565b60405162461bcd60e51b81526004016103ea90611fce565b80356113cf816120d3565b80516113cf816120d3565b600082601f83011261154e57600080fd5b813561156161155c82612025565b611ffe565b81815260209384019390925082018360005b8381101561159f5781358601611589888261161b565b8452506020928301929190910190600101611573565b5050505092915050565b600082601f8301126115ba57600080fd5b81516115c861155c82612025565b915081818352602084019350602081019050838560408402820111156115ed57600080fd5b60005b8381101561159f57816116038882611696565b845250602090920191604091909101906001016115f0565b600082601f83011261162c57600080fd5b813561163a61155c82612025565b9150818183526020840193506020810190508385602084028201111561165f57600080fd5b60005b8381101561159f578161167588826116dd565b8452506020928301929190910190600101611662565b80516113cf816120e7565b6000604082840312156116a857600080fd5b6116b26040611ffe565b905060006116c084846116f3565b82525060206116d1848483016116e8565b60208301525092915050565b80356113cf816120f0565b80516113cf816120f0565b80516113cf816120f9565b60006020828403121561171057600080fd5b600061171c8484611527565b949350505050565b60006020828403121561173657600080fd5b600061171c8484611532565b6000806040838503121561175557600080fd5b60006117618585611527565b9250506020611772858286016116dd565b9150509250929050565b60006020828403121561178e57600080fd5b813567ffffffffffffffff8111156117a557600080fd5b61171c8482850161153d565b6000602082840312156117c357600080fd5b600061171c848461168b565b6000602082840312156117e157600080fd5b600061171c84846116dd565b6000602082840312156117ff57600080fd5b600061171c84846116e8565b6000806040838503121561181e57600080fd5b600061182a85856116dd565b925050602083013567ffffffffffffffff81111561184757600080fd5b6117728582860161153d565b6000806040838503121561186657600080fd5b600061187285856116e8565b925050602083015167ffffffffffffffff81111561188f57600080fd5b611772858286016115a9565b60006118a783836119d9565b505060200190565b60006118bb8383611d2f565b505060400190565b6118cc8161208b565b82525050565b6118cc81612059565b60006118e68261204c565b6118f08185612050565b93506118fb83612046565b8060005b83811015611929578151611913888261189b565b975061191e83612046565b9250506001016118ff565b509495945050505050565b600061193f8261204c565b6119498185612050565b935061195483612046565b8060005b8381101561192957815161196c88826118af565b975061197783612046565b925050600101611958565b600061198d8261204c565b6119978185612050565b93506119a283612046565b8060005b838110156119295781516119ba888261189b565b97506119c583612046565b9250506001016119a6565b6118cc81612064565b6118cc816103a7565b6118cc6119ee826103a7565b6103a7565b60006119fe8261204c565b611a088185612050565b9350611a1881856020860161209d565b611a21816120c9565b9093019392505050565b6118cc81612092565b6000611a41603583612050565b7f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7581527402063616e20616363657074206f776e65727368697605c1b602082015260400192915050565b6000611a98601d83612050565b7f4f6e6c7920746865204c32206272696467652063616e20696e766f6b65000000815260200192915050565b6000611ad1602183612050565b7f45786365656473206d617820656e747269657320706572206d6967726174696f8152603760f91b602082015260400192915050565b6000611b14601483612050565b73119d5b98dd1a5bdb8819195858dd1a5d985d195960621b815260200192915050565b6000611b4460118361132a565b70026b4b9b9b4b7339030b2323932b9b99d1607d1b815260110192915050565b6000611b71602383612050565b7f43616e6e6f74206465706f736974206f72206d6967726174652077697468206481526219589d60ea1b602082015260400192915050565b6000611bb6602f83612050565b7f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726681526e37b936903a3434b99030b1ba34b7b760891b602082015260400192915050565b631cd554d160e21b9052565b6000611c13601e83612050565b7f4f6e6c79207468652072656c617965722063616e2063616c6c20746869730000815260200192915050565b6000611c4c60198361132a565b7f5265736f6c766572206d697373696e67207461726765743a2000000000000000815260190192915050565b6000611c85602a83612050565b7f43616c6c6572206973206e6f742052657761726473446973747269627574696f8152691b8818dbdb9d1c9858dd60b21b602082015260400192915050565b6000611cd1601b83612050565b7f43616e6e6f74206d69677261746520746f206164647265737320300000000000815260200192915050565b6000611d0a601683612050565b75556e6b6e6f776e20676173206c696d6974207479706560501b815260200192915050565b80516040830190611d408482611d62565b506020820151611d5360208501826119d9565b50505050565b6118cc81612075565b6118cc8161207e565b6000611d7682611b37565b9150611d8282846119e2565b50602001919050565b6000611d7682611c3f565b602081016113cf82846118d2565b60608101611db282866118c3565b611dbf60208301856118d2565b61171c60408301846119d9565b60408101611dda82856118c3565b818103602083015261171c8184611982565b60408101611dfa82846118c3565b6113cf60208301611bfa565b60408101611e1482856118d2565b611e2160208301846119d9565b9392505050565b60608101611e3682866118d2565b611e4360208301856119d9565b8181036040830152611e558184611934565b95945050505050565b60408101611e6c82856118d2565b611e2160208301846118d2565b60608101611db282866118d2565b60608101611e9582866118d2565b8181036020830152611ea781856119f3565b905061171c6040830184611d59565b60208082528101611e2181846118db565b602081016113cf82846119d0565b602081016113cf82846119d9565b60408101611e6c82856119d9565b60408101611e1482856119d9565b60408101611f0d82856119d9565b818103602083015261171c81846119f3565b602081016113cf8284611a2b565b60208082528101611e2181846119f3565b602080825281016113cf81611a34565b602080825281016113cf81611a8b565b602080825281016113cf81611ac4565b602080825281016113cf81611b07565b602080825281016113cf81611b64565b602080825281016113cf81611ba9565b602080825281016113cf81611c06565b602080825281016113cf81611c78565b602080825281016113cf81611cc4565b602080825281016113cf81611cfd565b60408101611fec82856119d9565b818103602083015261171c8184611934565b60405181810167ffffffffffffffff8111828210171561201d57600080fd5b604052919050565b600067ffffffffffffffff82111561203c57600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b60006113cf82612069565b151590565b6001600160a01b031690565b63ffffffff1690565b67ffffffffffffffff1690565b60006113cf825b60006113cf82612059565b60005b838110156120b85781810151838201526020016120a0565b83811115611d535750506000910152565b601f01601f191690565b6120dc81612059565b81146103fc57600080fd5b6120dc81612064565b6120dc816103a7565b6120dc8161207e56fea365627a7a723158200d11a8cff7227cbc4528143740c418a2f4d7185f28be3065ea838f7a9c1a75806c6578706572696d656e74616cf564736f6c63430005100040

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000de910777c787903f78c89e7a0bf7f4c435cbb1fe0000000000000000000000004e3b31eb0e5cb73641ee1e65e7dcefe520ba3ef2

-----Decoded View---------------
Arg [0] : _owner (address): 0xDe910777C787903F78C89e7a0bf7F4C435cBB1Fe
Arg [1] : _resolver (address): 0x4E3b31eB0E5CB73641EE1E65E7dCEFe520bA3ef2

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000de910777c787903f78c89e7a0bf7f4c435cbb1fe
Arg [1] : 0000000000000000000000004e3b31eb0e5cb73641ee1e65e7dcefe520ba3ef2


Libraries Used


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

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.