ETH Price: $3,352.29 (+2.74%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Upgrade Old110735922020-10-17 12:56:061567 days ago1602939366IN
0xCFF01c40...7958Be486
0 ETH0.1076467422
Upgrade Old110735572020-10-17 12:49:231567 days ago1602938963IN
0xCFF01c40...7958Be486
0 ETH0.1130845223.1
Upgrade Old110470662020-10-13 11:37:071571 days ago1602589027IN
0xCFF01c40...7958Be486
0 ETH0.254777652.0001
Upgrade Old110408152020-10-12 12:36:151572 days ago1602506175IN
0xCFF01c40...7958Be486
0 ETH0.2060626142.0001
Upgrade Old110408072020-10-12 12:34:491572 days ago1602506089IN
0xCFF01c40...7958Be486
0 ETH0.2061201542.0001
Upgrade Old110408062020-10-12 12:34:471572 days ago1602506087IN
0xCFF01c40...7958Be486
0 ETH0.2106187442.0001
Upgrade Old110407612020-10-12 12:24:231572 days ago1602505463IN
0xCFF01c40...7958Be486
0 ETH0.2060626342.000001
Upgrade Old110349092020-10-11 15:05:141572 days ago1602428714IN
0xCFF01c40...7958Be486
0 ETH0.267547854
Upgrade Old110307292020-10-10 23:27:591573 days ago1602372479IN
0xCFF01c40...7958Be486
0 ETH0.1535722331
Upgrade Old110177122020-10-08 23:08:121575 days ago1602198492IN
0xCFF01c40...7958Be486
0 ETH0.2030998941
Upgrade Old109783662020-10-02 19:11:421581 days ago1601665902IN
0xCFF01c40...7958Be486
0 ETH0.4935313399
Upgrade Old107310702020-08-25 17:55:501619 days ago1598378150IN
0xCFF01c40...7958Be486
0 ETH0.75914462168
Upgrade Old106667572020-08-15 20:21:401629 days ago1597522900IN
0xCFF01c40...7958Be486
0 ETH0.3607513782
Upgrade Old106394912020-08-11 15:50:271633 days ago1597161027IN
0xCFF01c40...7958Be486
0 ETH0.00353384153
Upgrade Old106018432020-08-05 20:13:281639 days ago1596658408IN
0xCFF01c40...7958Be486
0 ETH0.154631535
Upgrade Old105702292020-07-31 22:59:221644 days ago1596236362IN
0xCFF01c40...7958Be486
0 ETH0.1988951345.00001
Upgrade Old105693912020-07-31 20:00:251644 days ago1596225625IN
0xCFF01c40...7958Be486
0 ETH0.2034059445.00001
Upgrade Old105687662020-07-31 17:35:231644 days ago1596216923IN
0xCFF01c40...7958Be486
0 ETH0.2870782665.00001
Upgrade Old105679242020-07-31 14:35:591644 days ago1596206159IN
0xCFF01c40...7958Be486
0 ETH0.3975501190.00001
Accept Ownership105672392020-07-31 12:06:091645 days ago1596197169IN
0xCFF01c40...7958Be486
0 ETH0.0020404692
Transfer Ownersh...105669242020-07-31 10:54:091645 days ago1596192849IN
0xCFF01c40...7958Be486
0 ETH0.0038921187

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ConverterUpgrader

Compiler Version
v0.4.26+commit.4563c3fc

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-07-31
*/

// File: solidity/contracts/utility/interfaces/IOwned.sol

pragma solidity 0.4.26;

/*
    Owned contract interface
*/
contract IOwned {
    // this function isn't abstract since the compiler emits automatically generated getter functions as external
    function owner() public view returns (address) {this;}

    function transferOwnership(address _newOwner) public;
    function acceptOwnership() public;
}

// File: solidity/contracts/token/interfaces/IERC20Token.sol

pragma solidity 0.4.26;

/*
    ERC20 Standard Token interface
*/
contract IERC20Token {
    // these functions aren't abstract since the compiler emits automatically generated getter functions as external
    function name() public view returns (string) {this;}
    function symbol() public view returns (string) {this;}
    function decimals() public view returns (uint8) {this;}
    function totalSupply() public view returns (uint256) {this;}
    function balanceOf(address _owner) public view returns (uint256) {_owner; this;}
    function allowance(address _owner, address _spender) public view returns (uint256) {_owner; _spender; this;}

    function transfer(address _to, uint256 _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
    function approve(address _spender, uint256 _value) public returns (bool success);
}

// File: solidity/contracts/utility/interfaces/ITokenHolder.sol

pragma solidity 0.4.26;



/*
    Token Holder interface
*/
contract ITokenHolder is IOwned {
    function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public;
}

// File: solidity/contracts/converter/interfaces/IConverterAnchor.sol

pragma solidity 0.4.26;



/*
    Converter Anchor interface
*/
contract IConverterAnchor is IOwned, ITokenHolder {
}

// File: solidity/contracts/utility/interfaces/IWhitelist.sol

pragma solidity 0.4.26;

/*
    Whitelist interface
*/
contract IWhitelist {
    function isWhitelisted(address _address) public view returns (bool);
}

// File: solidity/contracts/converter/interfaces/IConverter.sol

pragma solidity 0.4.26;





/*
    Converter interface
*/
contract IConverter is IOwned {
    function converterType() public pure returns (uint16);
    function anchor() public view returns (IConverterAnchor) {this;}
    function isActive() public view returns (bool);

    function targetAmountAndFee(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount) public view returns (uint256, uint256);
    function convert(IERC20Token _sourceToken,
                     IERC20Token _targetToken,
                     uint256 _amount,
                     address _trader,
                     address _beneficiary) public payable returns (uint256);

    function conversionWhitelist() public view returns (IWhitelist) {this;}
    function conversionFee() public view returns (uint32) {this;}
    function maxConversionFee() public view returns (uint32) {this;}
    function reserveBalance(IERC20Token _reserveToken) public view returns (uint256);
    function() external payable;

    function transferAnchorOwnership(address _newOwner) public;
    function acceptAnchorOwnership() public;
    function setConversionFee(uint32 _conversionFee) public;
    function setConversionWhitelist(IWhitelist _whitelist) public;
    function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public;
    function withdrawETH(address _to) public;
    function addReserve(IERC20Token _token, uint32 _ratio) public;

    // deprecated, backward compatibility
    function token() public view returns (IConverterAnchor);
    function transferTokenOwnership(address _newOwner) public;
    function acceptTokenOwnership() public;
    function connectors(address _address) public view returns (uint256, uint32, bool, bool, bool);
    function getConnectorBalance(IERC20Token _connectorToken) public view returns (uint256);
    function connectorTokens(uint256 _index) public view returns (IERC20Token);
    function connectorTokenCount() public view returns (uint16);
}

// File: solidity/contracts/converter/interfaces/IConverterUpgrader.sol

pragma solidity 0.4.26;

/*
    Converter Upgrader interface
*/
contract IConverterUpgrader {
    function upgrade(bytes32 _version) public;
    function upgrade(uint16 _version) public;
}

// File: solidity/contracts/converter/interfaces/ITypedConverterCustomFactory.sol

pragma solidity 0.4.26;

/*
    Typed Converter Custom Factory interface
*/
contract ITypedConverterCustomFactory {
    function converterType() public pure returns (uint16);
}

// File: solidity/contracts/utility/interfaces/IContractRegistry.sol

pragma solidity 0.4.26;

/*
    Contract Registry interface
*/
contract IContractRegistry {
    function addressOf(bytes32 _contractName) public view returns (address);

    // deprecated, backward compatibility
    function getAddress(bytes32 _contractName) public view returns (address);
}

// File: solidity/contracts/converter/interfaces/IConverterFactory.sol

pragma solidity 0.4.26;





/*
    Converter Factory interface
*/
contract IConverterFactory {
    function createAnchor(uint16 _type, string _name, string _symbol, uint8 _decimals) public returns (IConverterAnchor);
    function createConverter(uint16 _type, IConverterAnchor _anchor, IContractRegistry _registry, uint32 _maxConversionFee) public returns (IConverter);

    function customFactories(uint16 _type) public view returns (ITypedConverterCustomFactory) { _type; this; }
}

// File: solidity/contracts/utility/Owned.sol

pragma solidity 0.4.26;


/**
  * @dev Provides support and utilities for contract ownership
*/
contract Owned is IOwned {
    address public owner;
    address public newOwner;

    /**
      * @dev triggered when the owner is updated
      *
      * @param _prevOwner previous owner
      * @param _newOwner  new owner
    */
    event OwnerUpdate(address indexed _prevOwner, address indexed _newOwner);

    /**
      * @dev initializes a new Owned instance
    */
    constructor() public {
        owner = msg.sender;
    }

    // allows execution by the owner only
    modifier ownerOnly {
        _ownerOnly();
        _;
    }

    // error message binary size optimization
    function _ownerOnly() internal view {
        require(msg.sender == owner, "ERR_ACCESS_DENIED");
    }

    /**
      * @dev allows transferring the contract ownership
      * the new owner still needs to accept the transfer
      * can only be called by the contract owner
      *
      * @param _newOwner    new contract owner
    */
    function transferOwnership(address _newOwner) public ownerOnly {
        require(_newOwner != owner, "ERR_SAME_OWNER");
        newOwner = _newOwner;
    }

    /**
      * @dev used by a new owner to accept an ownership transfer
    */
    function acceptOwnership() public {
        require(msg.sender == newOwner, "ERR_ACCESS_DENIED");
        emit OwnerUpdate(owner, newOwner);
        owner = newOwner;
        newOwner = address(0);
    }
}

// File: solidity/contracts/utility/Utils.sol

pragma solidity 0.4.26;

/**
  * @dev Utilities & Common Modifiers
*/
contract Utils {
    // verifies that a value is greater than zero
    modifier greaterThanZero(uint256 _value) {
        _greaterThanZero(_value);
        _;
    }

    // error message binary size optimization
    function _greaterThanZero(uint256 _value) internal pure {
        require(_value > 0, "ERR_ZERO_VALUE");
    }

    // validates an address - currently only checks that it isn't null
    modifier validAddress(address _address) {
        _validAddress(_address);
        _;
    }

    // error message binary size optimization
    function _validAddress(address _address) internal pure {
        require(_address != address(0), "ERR_INVALID_ADDRESS");
    }

    // verifies that the address is different than this contract address
    modifier notThis(address _address) {
        _notThis(_address);
        _;
    }

    // error message binary size optimization
    function _notThis(address _address) internal view {
        require(_address != address(this), "ERR_ADDRESS_IS_SELF");
    }
}

// File: solidity/contracts/utility/ContractRegistryClient.sol

pragma solidity 0.4.26;




/**
  * @dev Base contract for ContractRegistry clients
*/
contract ContractRegistryClient is Owned, Utils {
    bytes32 internal constant CONTRACT_REGISTRY = "ContractRegistry";
    bytes32 internal constant BANCOR_NETWORK = "BancorNetwork";
    bytes32 internal constant BANCOR_FORMULA = "BancorFormula";
    bytes32 internal constant CONVERTER_FACTORY = "ConverterFactory";
    bytes32 internal constant CONVERSION_PATH_FINDER = "ConversionPathFinder";
    bytes32 internal constant CONVERTER_UPGRADER = "BancorConverterUpgrader";
    bytes32 internal constant CONVERTER_REGISTRY = "BancorConverterRegistry";
    bytes32 internal constant CONVERTER_REGISTRY_DATA = "BancorConverterRegistryData";
    bytes32 internal constant BNT_TOKEN = "BNTToken";
    bytes32 internal constant BANCOR_X = "BancorX";
    bytes32 internal constant BANCOR_X_UPGRADER = "BancorXUpgrader";
    bytes32 internal constant CHAINLINK_ORACLE_WHITELIST = "ChainlinkOracleWhitelist";

    IContractRegistry public registry;      // address of the current contract-registry
    IContractRegistry public prevRegistry;  // address of the previous contract-registry
    bool public onlyOwnerCanUpdateRegistry; // only an owner can update the contract-registry

    /**
      * @dev verifies that the caller is mapped to the given contract name
      *
      * @param _contractName    contract name
    */
    modifier only(bytes32 _contractName) {
        _only(_contractName);
        _;
    }

    // error message binary size optimization
    function _only(bytes32 _contractName) internal view {
        require(msg.sender == addressOf(_contractName), "ERR_ACCESS_DENIED");
    }

    /**
      * @dev initializes a new ContractRegistryClient instance
      *
      * @param  _registry   address of a contract-registry contract
    */
    constructor(IContractRegistry _registry) internal validAddress(_registry) {
        registry = IContractRegistry(_registry);
        prevRegistry = IContractRegistry(_registry);
    }

    /**
      * @dev updates to the new contract-registry
     */
    function updateRegistry() public {
        // verify that this function is permitted
        require(msg.sender == owner || !onlyOwnerCanUpdateRegistry, "ERR_ACCESS_DENIED");

        // get the new contract-registry
        IContractRegistry newRegistry = IContractRegistry(addressOf(CONTRACT_REGISTRY));

        // verify that the new contract-registry is different and not zero
        require(newRegistry != address(registry) && newRegistry != address(0), "ERR_INVALID_REGISTRY");

        // verify that the new contract-registry is pointing to a non-zero contract-registry
        require(newRegistry.addressOf(CONTRACT_REGISTRY) != address(0), "ERR_INVALID_REGISTRY");

        // save a backup of the current contract-registry before replacing it
        prevRegistry = registry;

        // replace the current contract-registry with the new contract-registry
        registry = newRegistry;
    }

    /**
      * @dev restores the previous contract-registry
    */
    function restoreRegistry() public ownerOnly {
        // restore the previous contract-registry
        registry = prevRegistry;
    }

    /**
      * @dev restricts the permission to update the contract-registry
      *
      * @param _onlyOwnerCanUpdateRegistry  indicates whether or not permission is restricted to owner only
    */
    function restrictRegistryUpdate(bool _onlyOwnerCanUpdateRegistry) public ownerOnly {
        // change the permission to update the contract-registry
        onlyOwnerCanUpdateRegistry = _onlyOwnerCanUpdateRegistry;
    }

    /**
      * @dev returns the address associated with the given contract name
      *
      * @param _contractName    contract name
      *
      * @return contract address
    */
    function addressOf(bytes32 _contractName) internal view returns (address) {
        return registry.addressOf(_contractName);
    }
}

// File: solidity/contracts/token/interfaces/IEtherToken.sol

pragma solidity 0.4.26;


/*
    Ether Token interface
*/
contract IEtherToken is IERC20Token {
    function deposit() public payable;
    function withdraw(uint256 _amount) public;
    function depositTo(address _to) public payable;
    function withdrawTo(address _to, uint256 _amount) public;
}

// File: solidity/contracts/utility/interfaces/IChainlinkPriceOracle.sol

pragma solidity 0.4.26;

/*
    Chainlink Price Oracle interface
*/
interface IChainlinkPriceOracle {
    function latestAnswer() external view returns (int256);
    function latestTimestamp() external view returns (uint256);
}

// File: solidity/contracts/utility/interfaces/IPriceOracle.sol

pragma solidity 0.4.26;



/*
    Price Oracle interface
*/
contract IPriceOracle {
    function latestRate(IERC20Token _tokenA, IERC20Token _tokenB) public view returns (uint256, uint256);
    function lastUpdateTime() public view returns (uint256);
    function latestRateAndUpdateTime(IERC20Token _tokenA, IERC20Token _tokenB) public view returns (uint256, uint256, uint256);

    function tokenAOracle() public view returns (IChainlinkPriceOracle) {this;}
    function tokenBOracle() public view returns (IChainlinkPriceOracle) {this;}
}

// File: solidity/contracts/converter/types/liquidity-pool-v2/interfaces/ILiquidityPoolV2Converter.sol

pragma solidity 0.4.26;



/*
    Liquidity Pool V2 Converter interface
*/
contract ILiquidityPoolV2Converter {
    function reserveStakedBalance(IERC20Token _reserveToken) public view returns (uint256);
    function setReserveStakedBalance(IERC20Token _reserveToken, uint256 _balance) public;

    function primaryReserveToken() public view returns (IERC20Token);

    function priceOracle() public view returns (IPriceOracle);

    function activate(IERC20Token _primaryReserveToken, IChainlinkPriceOracle _primaryReserveOracle, IChainlinkPriceOracle _secondaryReserveOracle) public;
}

// File: solidity/contracts/converter/ConverterUpgrader.sol

pragma solidity 0.4.26;








/**
  * @dev Converter Upgrader
  *
  * The converter upgrader contract allows upgrading an older converter contract (0.4 and up)
  * to the latest version.
  * To begin the upgrade process, simply execute the 'upgrade' function.
  * At the end of the process, the ownership of the newly upgraded converter will be transferred
  * back to the original owner and the original owner will need to execute the 'acceptOwnership' function.
  *
  * The address of the new converter is available in the ConverterUpgrade event.
  *
  * Note that for older converters that don't yet have the 'upgrade' function, ownership should first
  * be transferred manually to the ConverterUpgrader contract using the 'transferOwnership' function
  * and then the upgrader 'upgrade' function should be executed directly.
*/
contract ConverterUpgrader is IConverterUpgrader, ContractRegistryClient {
    address private constant ETH_RESERVE_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    IEtherToken public etherToken;

    /**
      * @dev triggered when the contract accept a converter ownership
      *
      * @param _converter   converter address
      * @param _owner       new owner - local upgrader address
    */
    event ConverterOwned(address indexed _converter, address indexed _owner);

    /**
      * @dev triggered when the upgrading process is done
      *
      * @param _oldConverter    old converter address
      * @param _newConverter    new converter address
    */
    event ConverterUpgrade(address indexed _oldConverter, address indexed _newConverter);

    /**
      * @dev initializes a new ConverterUpgrader instance
      *
      * @param _registry    address of a contract registry contract
    */
    constructor(IContractRegistry _registry, IEtherToken _etherToken) ContractRegistryClient(_registry) public {
        etherToken = _etherToken;
    }

    /**
      * @dev upgrades an old converter to the latest version
      * will throw if ownership wasn't transferred to the upgrader before calling this function.
      * ownership of the new converter will be transferred back to the original owner.
      * fires the ConverterUpgrade event upon success.
      * can only be called by a converter
      *
      * @param _version old converter version
    */
    function upgrade(bytes32 _version) public {
        upgradeOld(IConverter(msg.sender), _version);
    }

    /**
      * @dev upgrades an old converter to the latest version
      * will throw if ownership wasn't transferred to the upgrader before calling this function.
      * ownership of the new converter will be transferred back to the original owner.
      * fires the ConverterUpgrade event upon success.
      * can only be called by a converter
      *
      * @param _version old converter version
    */
    function upgrade(uint16 _version) public {
        upgradeOld(IConverter(msg.sender), bytes32(_version));
    }

    /**
      * @dev upgrades an old converter to the latest version
      * will throw if ownership wasn't transferred to the upgrader before calling this function.
      * ownership of the new converter will be transferred back to the original owner.
      * fires the ConverterUpgrade event upon success.
      *
      * @param _converter   old converter contract address
      * @param _version     old converter version
    */
    function upgradeOld(IConverter _converter, bytes32 _version) public {
        _version;
        IConverter converter = IConverter(_converter);
        address prevOwner = converter.owner();
        acceptConverterOwnership(converter);
        IConverter newConverter = createConverter(converter);
        copyReserves(converter, newConverter);
        copyConversionFee(converter, newConverter);
        transferReserveBalances(converter, newConverter);
        IConverterAnchor anchor = converter.token();

        // get the activation status before it's being invalidated
        bool activate = isV28OrHigherConverter(converter) && converter.isActive();

        if (anchor.owner() == address(converter)) {
            converter.transferTokenOwnership(newConverter);
            newConverter.acceptAnchorOwnership();
        }

        handleTypeSpecificData(converter, newConverter, activate);

        converter.transferOwnership(prevOwner);
        newConverter.transferOwnership(prevOwner);

        emit ConverterUpgrade(address(converter), address(newConverter));
    }

    /**
      * @dev the first step when upgrading a converter is to transfer the ownership to the local contract.
      * the upgrader contract then needs to accept the ownership transfer before initiating
      * the upgrade process.
      * fires the ConverterOwned event upon success
      *
      * @param _oldConverter       converter to accept ownership of
    */
    function acceptConverterOwnership(IConverter _oldConverter) private {
        _oldConverter.acceptOwnership();
        emit ConverterOwned(_oldConverter, this);
    }

    /**
      * @dev creates a new converter with same basic data as the original old converter
      * the newly created converter will have no reserves at this step.
      *
      * @param _oldConverter    old converter contract address
      *
      * @return the new converter  new converter contract address
    */
    function createConverter(IConverter _oldConverter) private returns (IConverter) {
        IConverterAnchor anchor = _oldConverter.token();
        uint32 maxConversionFee = _oldConverter.maxConversionFee();
        uint16 reserveTokenCount = _oldConverter.connectorTokenCount();

        // determine new converter type
        uint16 newType = 0;
        // new converter - get the type from the converter itself
        if (isV28OrHigherConverter(_oldConverter))
            newType = _oldConverter.converterType();
        // old converter - if it has 1 reserve token, the type is a liquid token, otherwise the type liquidity pool
        else if (reserveTokenCount > 1)
            newType = 1;

        IConverterFactory converterFactory = IConverterFactory(addressOf(CONVERTER_FACTORY));
        IConverter converter = converterFactory.createConverter(newType, anchor, registry, maxConversionFee);

        converter.acceptOwnership();
        return converter;
    }

    /**
      * @dev copies the reserves from the old converter to the new one.
      * note that this will not work for an unlimited number of reserves due to block gas limit constraints.
      *
      * @param _oldConverter    old converter contract address
      * @param _newConverter    new converter contract address
    */
    function copyReserves(IConverter _oldConverter, IConverter _newConverter) private {
        uint16 reserveTokenCount = _oldConverter.connectorTokenCount();

        for (uint16 i = 0; i < reserveTokenCount; i++) {
            address reserveAddress = _oldConverter.connectorTokens(i);
            (, uint32 weight, , , ) = _oldConverter.connectors(reserveAddress);

            // Ether reserve
            if (reserveAddress == ETH_RESERVE_ADDRESS) {
                _newConverter.addReserve(IERC20Token(ETH_RESERVE_ADDRESS), weight);
            }
            // Ether reserve token
            else if (reserveAddress == address(etherToken)) {
                _newConverter.addReserve(IERC20Token(ETH_RESERVE_ADDRESS), weight);
            }
            // ERC20 reserve token
            else {
                _newConverter.addReserve(IERC20Token(reserveAddress), weight);
            }
        }
    }

    /**
      * @dev copies the conversion fee from the old converter to the new one
      *
      * @param _oldConverter    old converter contract address
      * @param _newConverter    new converter contract address
    */
    function copyConversionFee(IConverter _oldConverter, IConverter _newConverter) private {
        uint32 conversionFee = _oldConverter.conversionFee();
        _newConverter.setConversionFee(conversionFee);
    }

    /**
      * @dev transfers the balance of each reserve in the old converter to the new one.
      * note that the function assumes that the new converter already has the exact same number of
      * also, this will not work for an unlimited number of reserves due to block gas limit constraints.
      *
      * @param _oldConverter    old converter contract address
      * @param _newConverter    new converter contract address
    */
    function transferReserveBalances(IConverter _oldConverter, IConverter _newConverter) private {
        uint256 reserveBalance;
        uint16 reserveTokenCount = _oldConverter.connectorTokenCount();

        for (uint16 i = 0; i < reserveTokenCount; i++) {
            address reserveAddress = _oldConverter.connectorTokens(i);
            // Ether reserve
            if (reserveAddress == ETH_RESERVE_ADDRESS) {
                _oldConverter.withdrawETH(address(_newConverter));
            }
            // Ether reserve token
            else if (reserveAddress == address(etherToken)) {
                reserveBalance = etherToken.balanceOf(_oldConverter);
                _oldConverter.withdrawTokens(etherToken, address(this), reserveBalance);
                etherToken.withdrawTo(address(_newConverter), reserveBalance);
            }
            // ERC20 reserve token
            else {
                IERC20Token connector = IERC20Token(reserveAddress);
                reserveBalance = connector.balanceOf(_oldConverter);
                _oldConverter.withdrawTokens(connector, address(_newConverter), reserveBalance);
            }
        }
    }

    /**
      * @dev handles upgrading custom (type specific) data from the old converter to the new one
      *
      * @param _oldConverter    old converter contract address
      * @param _newConverter    new converter contract address
      * @param _activate        activate the new converter
    */
    function handleTypeSpecificData(IConverter _oldConverter, IConverter _newConverter, bool _activate) private {
        if (!isV28OrHigherConverter(_oldConverter))
            return;

        uint16 converterType = _oldConverter.converterType();
        if (converterType == 2) {
            uint16 reserveTokenCount = _oldConverter.connectorTokenCount();
            for (uint16 i = 0; i < reserveTokenCount; i++) {
                // copy reserve staked balance
                IERC20Token reserveTokenAddress = _oldConverter.connectorTokens(i);
                uint256 balance = ILiquidityPoolV2Converter(_oldConverter).reserveStakedBalance(reserveTokenAddress);
                ILiquidityPoolV2Converter(_newConverter).setReserveStakedBalance(reserveTokenAddress, balance);
            }

            if (!_activate) {
                return;
            }

            // get the primary reserve token
            IERC20Token primaryReserveToken = ILiquidityPoolV2Converter(_oldConverter).primaryReserveToken();

            // get the chainlink price oracles
            IPriceOracle priceOracle = ILiquidityPoolV2Converter(_oldConverter).priceOracle();
            IChainlinkPriceOracle oracleA = priceOracle.tokenAOracle();
            IChainlinkPriceOracle oracleB = priceOracle.tokenBOracle();

            // activate the new converter
            ILiquidityPoolV2Converter(_newConverter).activate(primaryReserveToken, oracleA, oracleB);
        }
    }

    bytes4 private constant IS_V28_OR_HIGHER_FUNC_SELECTOR = bytes4(keccak256("isV28OrHigher()"));

    // using assembly code to identify converter version
    // can't rely on the version number since the function had a different signature in older converters
    function isV28OrHigherConverter(IConverter _converter) internal view returns (bool) {
        bool success;
        uint256[1] memory ret;
        bytes memory data = abi.encodeWithSelector(IS_V28_OR_HIGHER_FUNC_SELECTOR);

        assembly {
            success := staticcall(
                5000,          // isV28OrHigher consumes 190 gas, but just for extra safety
                _converter,    // destination address
                add(data, 32), // input buffer (starts after the first 32 bytes in the `data` array)
                mload(data),   // input length (loaded from the first 32 bytes in the `data` array)
                ret,           // output buffer
                32             // output length
            )
        }

        return success && ret[0] != 0;
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"_onlyOwnerCanUpdateRegistry","type":"bool"}],"name":"restrictRegistryUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"onlyOwnerCanUpdateRegistry","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"updateRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"prevRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_version","type":"uint16"}],"name":"upgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"restoreRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"etherToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_version","type":"bytes32"}],"name":"upgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_converter","type":"address"},{"name":"_version","type":"bytes32"}],"name":"upgradeOld","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_registry","type":"address"},{"name":"_etherToken","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_converter","type":"address"},{"indexed":true,"name":"_owner","type":"address"}],"name":"ConverterOwned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_oldConverter","type":"address"},{"indexed":true,"name":"_newConverter","type":"address"}],"name":"ConverterUpgrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_prevOwner","type":"address"},{"indexed":true,"name":"_newOwner","type":"address"}],"name":"OwnerUpdate","type":"event"}]

608060405234801561001057600080fd5b506040516040806120df83398101604052805160209091015160008054600160a060020a03191633179055818061004f81640100000000610092810204565b5060028054600160a060020a03928316600160a060020a03199182168117909255600380548216909217909155600480549390921692169190911790555061010c565b600160a060020a038116151561010957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b611fc48061011b6000396000f3006080604052600436106100b65763ffffffff60e060020a600035041663024c7ec781146100bb5780632fe8a6ad146100d757806349d10b641461010057806361cd756e1461011557806379ba5097146101465780637b1039991461015b5780638da5cb5b1461017057806390f58c9614610185578063b4a176d3146101a1578063b8066bcb146101b6578063bc444e13146101cb578063d4ee1d90146101e3578063f2cfed87146101f8578063f2fde38b1461021c575b600080fd5b3480156100c757600080fd5b506100d5600435151561023d565b005b3480156100e357600080fd5b506100ec610285565b604080519115158252519081900360200190f35b34801561010c57600080fd5b506100d56102a6565b34801561012157600080fd5b5061012a610525565b60408051600160a060020a039092168252519081900360200190f35b34801561015257600080fd5b506100d5610534565b34801561016757600080fd5b5061012a610607565b34801561017c57600080fd5b5061012a610616565b34801561019157600080fd5b506100d561ffff60043516610625565b3480156101ad57600080fd5b506100d5610636565b3480156101c257600080fd5b5061012a61066f565b3480156101d757600080fd5b506100d560043561067e565b3480156101ef57600080fd5b5061012a610688565b34801561020457600080fd5b506100d5600160a060020a0360043516602435610697565b34801561022857600080fd5b506100d5600160a060020a0360043516610aa8565b610245610b45565b60038054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b60035474010000000000000000000000000000000000000000900460ff1681565b60008054600160a060020a03163314806102db575060035474010000000000000000000000000000000000000000900460ff16155b1515610331576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b61035a7f436f6e7472616374526567697374727900000000000000000000000000000000610ba9565b600254909150600160a060020a038083169116148015906103835750600160a060020a03811615155b15156103d9576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f436f6e747261637452656769737472790000000000000000000000000000000060048201529051600091600160a060020a0384169163bb34534c9160248082019260209290919082900301818787803b15801561045d57600080fd5b505af1158015610471573d6000803e3d6000fd5b505050506040513d602081101561048757600080fd5b5051600160a060020a031614156104e8576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b6002805460038054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff19928316179092559091169216919091179055565b600354600160a060020a031681565b600154600160a060020a03163314610596576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600254600160a060020a031681565b600054600160a060020a031681565b6106333361ffff8316610697565b50565b61063e610b45565b6003546002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b600454600160a060020a031681565b6106333382610697565b600154600160a060020a031681565b600080600080600086945084600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156106e057600080fd5b505af11580156106f4573d6000803e3d6000fd5b505050506040513d602081101561070a57600080fd5b5051935061071785610c41565b61072085610cd0565b925061072c8584611052565b61073685846113df565b61074085846114d2565b84600160a060020a031663fc0c546a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561077e57600080fd5b505af1158015610792573d6000803e3d6000fd5b505050506040513d60208110156107a857600080fd5b505191506107b58561194f565b8015610827575084600160a060020a03166322f3e2d46040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156107fa57600080fd5b505af115801561080e573d6000803e3d6000fd5b505050506040513d602081101561082457600080fd5b50515b905084600160a060020a031682600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561087157600080fd5b505af1158015610885573d6000803e3d6000fd5b505050506040513d602081101561089b57600080fd5b5051600160a060020a031614156109765784600160a060020a03166321e6b53d846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b15801561090757600080fd5b505af115801561091b573d6000803e3d6000fd5b5050505082600160a060020a031663cdc91c696040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561095d57600080fd5b505af1158015610971573d6000803e3d6000fd5b505050505b610981858483611a0b565b84600160a060020a031663f2fde38b856040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b1580156109dc57600080fd5b505af11580156109f0573d6000803e3d6000fd5b5050505082600160a060020a031663f2fde38b856040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b158015610a4f57600080fd5b505af1158015610a63573d6000803e3d6000fd5b5050604051600160a060020a038087169350881691507f522b846327aea07106ec4d64ae4b6d6dea47689884dab650fd3a1f2e1d6a270190600090a350505050505050565b610ab0610b45565b600054600160a060020a0382811691161415610b16576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f53414d455f4f574e4552000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a03163314610ba7576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b565b600254604080517fbb34534c000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a03169163bb34534c91602480830192602092919082900301818787803b158015610c0f57600080fd5b505af1158015610c23573d6000803e3d6000fd5b505050506040513d6020811015610c3957600080fd5b505192915050565b80600160a060020a03166379ba50976040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015610c7f57600080fd5b505af1158015610c93573d6000803e3d6000fd5b5050604051309250600160a060020a03841691507ff764604894fa993d4370a9cb28b81c11deb1aafdb2909156173ae3833dad807590600090a350565b600080600080600080600087600160a060020a031663fc0c546a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610d1957600080fd5b505af1158015610d2d573d6000803e3d6000fd5b505050506040513d6020811015610d4357600080fd5b5051604080517f94c275ad0000000000000000000000000000000000000000000000000000000081529051919750600160a060020a038a16916394c275ad916004808201926020929091908290030181600087803b158015610da457600080fd5b505af1158015610db8573d6000803e3d6000fd5b505050506040513d6020811015610dce57600080fd5b5051604080517f71f52bf30000000000000000000000000000000000000000000000000000000081529051919650600160a060020a038a16916371f52bf3916004808201926020929091908290030181600087803b158015610e2f57600080fd5b505af1158015610e43573d6000803e3d6000fd5b505050506040513d6020811015610e5957600080fd5b5051935060009250610e6a8861194f565b15610ee05787600160a060020a0316633e8ff43f6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610ead57600080fd5b505af1158015610ec1573d6000803e3d6000fd5b505050506040513d6020811015610ed757600080fd5b50519250610ef2565b60018461ffff161115610ef257600192505b610f1b7f436f6e766572746572466163746f727900000000000000000000000000000000610ba9565b600254604080517f15f64b6a00000000000000000000000000000000000000000000000000000000815261ffff87166004820152600160a060020a038a81166024830152928316604482015263ffffffff891660648201529051929450908416916315f64b6a916084808201926020929091908290030181600087803b158015610fa457600080fd5b505af1158015610fb8573d6000803e3d6000fd5b505050506040513d6020811015610fce57600080fd5b5051604080517f79ba50970000000000000000000000000000000000000000000000000000000081529051919250600160a060020a038316916379ba50979160048082019260009290919082900301818387803b15801561102e57600080fd5b505af1158015611042573d6000803e3d6000fd5b50929a9950505050505050505050565b60008060008085600160a060020a03166371f52bf36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561109657600080fd5b505af11580156110aa573d6000803e3d6000fd5b505050506040513d60208110156110c057600080fd5b50519350600092505b8361ffff168361ffff1610156113d75785600160a060020a03166319b64015846040518263ffffffff1660e060020a028152600401808261ffff168152602001915050602060405180830381600087803b15801561112657600080fd5b505af115801561113a573d6000803e3d6000fd5b505050506040513d602081101561115057600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a038084166004830152915192945090881691630e53aae99160248082019260a0929091908290030181600087803b1580156111ba57600080fd5b505af11580156111ce573d6000803e3d6000fd5b505050506040513d60a08110156111e457600080fd5b50602001519050600160a060020a03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156112ad57604080517f6a49d2c400000000000000000000000000000000000000000000000000000000815273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600482015263ffffffff831660248201529051600160a060020a03871691636a49d2c491604480830192600092919082900301818387803b15801561129057600080fd5b505af11580156112a4573d6000803e3d6000fd5b505050506113cc565b600454600160a060020a038381169116141561134357604080517f6a49d2c400000000000000000000000000000000000000000000000000000000815273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600482015263ffffffff831660248201529051600160a060020a03871691636a49d2c491604480830192600092919082900301818387803b15801561129057600080fd5b604080517f6a49d2c4000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015263ffffffff84166024830152915191871691636a49d2c49160448082019260009290919082900301818387803b1580156113b357600080fd5b505af11580156113c7573d6000803e3d6000fd5b505050505b6001909201916110c9565b505050505050565b600082600160a060020a031663579cd3ca6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561141f57600080fd5b505af1158015611433573d6000803e3d6000fd5b505050506040513d602081101561144957600080fd5b5051604080517fecbca55d00000000000000000000000000000000000000000000000000000000815263ffffffff831660048201529051919250600160a060020a0384169163ecbca55d9160248082019260009290919082900301818387803b1580156114b557600080fd5b505af11580156114c9573d6000803e3d6000fd5b50505050505050565b600080600080600086600160a060020a03166371f52bf36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561151857600080fd5b505af115801561152c573d6000803e3d6000fd5b505050506040513d602081101561154257600080fd5b50519350600092505b8361ffff168361ffff1610156114c95786600160a060020a03166319b64015846040518263ffffffff1660e060020a028152600401808261ffff168152602001915050602060405180830381600087803b1580156115a857600080fd5b505af11580156115bc573d6000803e3d6000fd5b505050506040513d60208110156115d257600080fd5b50519150600160a060020a03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156116735786600160a060020a031663690d8320876040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b15801561165657600080fd5b505af115801561166a573d6000803e3d6000fd5b50505050611944565b600454600160a060020a03838116911614156118235760048054604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038b811694820194909452905192909116916370a08231916024808201926020929091908290030181600087803b1580156116f557600080fd5b505af1158015611709573d6000803e3d6000fd5b505050506040513d602081101561171f57600080fd5b505160048054604080517f5e35359e000000000000000000000000000000000000000000000000000000008152600160a060020a03928316938101939093523060248401526044830184905251929750891691635e35359e9160648082019260009290919082900301818387803b15801561179957600080fd5b505af11580156117ad573d6000803e3d6000fd5b505060048054604080517f205c2878000000000000000000000000000000000000000000000000000000008152600160a060020a038c811694820194909452602481018b9052905192909116935063205c2878925060448082019260009290919082900301818387803b15801561165657600080fd5b50604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915183928316916370a082319160248083019260209291908290030181600087803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b505050506040513d60208110156118b357600080fd5b5051604080517f5e35359e000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152898116602483015260448201849052915192975090891691635e35359e9160648082019260009290919082900301818387803b15801561192b57600080fd5b505af115801561193f573d6000803e3d6000fd5b505050505b60019092019161154b565b60008061195a611f79565b604080517f69735632384f72486967686572282900000000000000000000000000000000008152815190819003600f0181206004825260248201909252602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093178352815191929091849188611388fa9250828015611a025750815115155b95945050505050565b6000806000806000806000806000611a228c61194f565b1515611a2d57611f6b565b8b600160a060020a0316633e8ff43f6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611a6b57600080fd5b505af1158015611a7f573d6000803e3d6000fd5b505050506040513d6020811015611a9557600080fd5b50519850600261ffff8a161415611f6b578b600160a060020a03166371f52bf36040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611ae457600080fd5b505af1158015611af8573d6000803e3d6000fd5b505050506040513d6020811015611b0e57600080fd5b50519750600096505b8761ffff168761ffff161015611cc4578b600160a060020a03166319b64015886040518263ffffffff1660e060020a028152600401808261ffff168152602001915050602060405180830381600087803b158015611b7457600080fd5b505af1158015611b88573d6000803e3d6000fd5b505050506040513d6020811015611b9e57600080fd5b5051604080517e5e319c000000000000000000000000000000000000000000000000000000008152600160a060020a0380841660048301529151929850908e1691625e319c916024808201926020929091908290030181600087803b158015611c0657600080fd5b505af1158015611c1a573d6000803e3d6000fd5b505050506040513d6020811015611c3057600080fd5b5051604080517fbf7da6ba000000000000000000000000000000000000000000000000000000008152600160a060020a038981166004830152602482018490529151929750908d169163bf7da6ba9160448082019260009290919082900301818387803b158015611ca057600080fd5b505af1158015611cb4573d6000803e3d6000fd5b505060019098019750611b179050565b891515611cd057611f6b565b8b600160a060020a0316630337e3fb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611d0e57600080fd5b505af1158015611d22573d6000803e3d6000fd5b505050506040513d6020811015611d3857600080fd5b5051604080517f2630c12f0000000000000000000000000000000000000000000000000000000081529051919550600160a060020a038e1691632630c12f916004808201926020929091908290030181600087803b158015611d9957600080fd5b505af1158015611dad573d6000803e3d6000fd5b505050506040513d6020811015611dc357600080fd5b5051604080517fb9e1715b0000000000000000000000000000000000000000000000000000000081529051919450600160a060020a0385169163b9e1715b916004808201926020929091908290030181600087803b158015611e2457600080fd5b505af1158015611e38573d6000803e3d6000fd5b505050506040513d6020811015611e4e57600080fd5b5051604080517ff997fda70000000000000000000000000000000000000000000000000000000081529051919350600160a060020a0385169163f997fda7916004808201926020929091908290030181600087803b158015611eaf57600080fd5b505af1158015611ec3573d6000803e3d6000fd5b505050506040513d6020811015611ed957600080fd5b5051604080517f119b90cd000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152858116602483015280841660448301529151929350908d169163119b90cd9160648082019260009290919082900301818387803b158015611f5257600080fd5b505af1158015611f66573d6000803e3d6000fd5b505050505b505050505050505050505050565b60206040519081016040528060019060208202803883395091929150505600a165627a7a72305820cd272a18b92e8d173af6176f64cfb021ab179b3da9704c8ebb85eecd8f9c907a002900000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

Deployed Bytecode

0x6080604052600436106100b65763ffffffff60e060020a600035041663024c7ec781146100bb5780632fe8a6ad146100d757806349d10b641461010057806361cd756e1461011557806379ba5097146101465780637b1039991461015b5780638da5cb5b1461017057806390f58c9614610185578063b4a176d3146101a1578063b8066bcb146101b6578063bc444e13146101cb578063d4ee1d90146101e3578063f2cfed87146101f8578063f2fde38b1461021c575b600080fd5b3480156100c757600080fd5b506100d5600435151561023d565b005b3480156100e357600080fd5b506100ec610285565b604080519115158252519081900360200190f35b34801561010c57600080fd5b506100d56102a6565b34801561012157600080fd5b5061012a610525565b60408051600160a060020a039092168252519081900360200190f35b34801561015257600080fd5b506100d5610534565b34801561016757600080fd5b5061012a610607565b34801561017c57600080fd5b5061012a610616565b34801561019157600080fd5b506100d561ffff60043516610625565b3480156101ad57600080fd5b506100d5610636565b3480156101c257600080fd5b5061012a61066f565b3480156101d757600080fd5b506100d560043561067e565b3480156101ef57600080fd5b5061012a610688565b34801561020457600080fd5b506100d5600160a060020a0360043516602435610697565b34801561022857600080fd5b506100d5600160a060020a0360043516610aa8565b610245610b45565b60038054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b60035474010000000000000000000000000000000000000000900460ff1681565b60008054600160a060020a03163314806102db575060035474010000000000000000000000000000000000000000900460ff16155b1515610331576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b61035a7f436f6e7472616374526567697374727900000000000000000000000000000000610ba9565b600254909150600160a060020a038083169116148015906103835750600160a060020a03811615155b15156103d9576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f436f6e747261637452656769737472790000000000000000000000000000000060048201529051600091600160a060020a0384169163bb34534c9160248082019260209290919082900301818787803b15801561045d57600080fd5b505af1158015610471573d6000803e3d6000fd5b505050506040513d602081101561048757600080fd5b5051600160a060020a031614156104e8576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b6002805460038054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff19928316179092559091169216919091179055565b600354600160a060020a031681565b600154600160a060020a03163314610596576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600254600160a060020a031681565b600054600160a060020a031681565b6106333361ffff8316610697565b50565b61063e610b45565b6003546002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b600454600160a060020a031681565b6106333382610697565b600154600160a060020a031681565b600080600080600086945084600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156106e057600080fd5b505af11580156106f4573d6000803e3d6000fd5b505050506040513d602081101561070a57600080fd5b5051935061071785610c41565b61072085610cd0565b925061072c8584611052565b61073685846113df565b61074085846114d2565b84600160a060020a031663fc0c546a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561077e57600080fd5b505af1158015610792573d6000803e3d6000fd5b505050506040513d60208110156107a857600080fd5b505191506107b58561194f565b8015610827575084600160a060020a03166322f3e2d46040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156107fa57600080fd5b505af115801561080e573d6000803e3d6000fd5b505050506040513d602081101561082457600080fd5b50515b905084600160a060020a031682600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561087157600080fd5b505af1158015610885573d6000803e3d6000fd5b505050506040513d602081101561089b57600080fd5b5051600160a060020a031614156109765784600160a060020a03166321e6b53d846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b15801561090757600080fd5b505af115801561091b573d6000803e3d6000fd5b5050505082600160a060020a031663cdc91c696040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561095d57600080fd5b505af1158015610971573d6000803e3d6000fd5b505050505b610981858483611a0b565b84600160a060020a031663f2fde38b856040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b1580156109dc57600080fd5b505af11580156109f0573d6000803e3d6000fd5b5050505082600160a060020a031663f2fde38b856040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b158015610a4f57600080fd5b505af1158015610a63573d6000803e3d6000fd5b5050604051600160a060020a038087169350881691507f522b846327aea07106ec4d64ae4b6d6dea47689884dab650fd3a1f2e1d6a270190600090a350505050505050565b610ab0610b45565b600054600160a060020a0382811691161415610b16576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f53414d455f4f574e4552000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a03163314610ba7576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b565b600254604080517fbb34534c000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a03169163bb34534c91602480830192602092919082900301818787803b158015610c0f57600080fd5b505af1158015610c23573d6000803e3d6000fd5b505050506040513d6020811015610c3957600080fd5b505192915050565b80600160a060020a03166379ba50976040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015610c7f57600080fd5b505af1158015610c93573d6000803e3d6000fd5b5050604051309250600160a060020a03841691507ff764604894fa993d4370a9cb28b81c11deb1aafdb2909156173ae3833dad807590600090a350565b600080600080600080600087600160a060020a031663fc0c546a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610d1957600080fd5b505af1158015610d2d573d6000803e3d6000fd5b505050506040513d6020811015610d4357600080fd5b5051604080517f94c275ad0000000000000000000000000000000000000000000000000000000081529051919750600160a060020a038a16916394c275ad916004808201926020929091908290030181600087803b158015610da457600080fd5b505af1158015610db8573d6000803e3d6000fd5b505050506040513d6020811015610dce57600080fd5b5051604080517f71f52bf30000000000000000000000000000000000000000000000000000000081529051919650600160a060020a038a16916371f52bf3916004808201926020929091908290030181600087803b158015610e2f57600080fd5b505af1158015610e43573d6000803e3d6000fd5b505050506040513d6020811015610e5957600080fd5b5051935060009250610e6a8861194f565b15610ee05787600160a060020a0316633e8ff43f6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610ead57600080fd5b505af1158015610ec1573d6000803e3d6000fd5b505050506040513d6020811015610ed757600080fd5b50519250610ef2565b60018461ffff161115610ef257600192505b610f1b7f436f6e766572746572466163746f727900000000000000000000000000000000610ba9565b600254604080517f15f64b6a00000000000000000000000000000000000000000000000000000000815261ffff87166004820152600160a060020a038a81166024830152928316604482015263ffffffff891660648201529051929450908416916315f64b6a916084808201926020929091908290030181600087803b158015610fa457600080fd5b505af1158015610fb8573d6000803e3d6000fd5b505050506040513d6020811015610fce57600080fd5b5051604080517f79ba50970000000000000000000000000000000000000000000000000000000081529051919250600160a060020a038316916379ba50979160048082019260009290919082900301818387803b15801561102e57600080fd5b505af1158015611042573d6000803e3d6000fd5b50929a9950505050505050505050565b60008060008085600160a060020a03166371f52bf36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561109657600080fd5b505af11580156110aa573d6000803e3d6000fd5b505050506040513d60208110156110c057600080fd5b50519350600092505b8361ffff168361ffff1610156113d75785600160a060020a03166319b64015846040518263ffffffff1660e060020a028152600401808261ffff168152602001915050602060405180830381600087803b15801561112657600080fd5b505af115801561113a573d6000803e3d6000fd5b505050506040513d602081101561115057600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a038084166004830152915192945090881691630e53aae99160248082019260a0929091908290030181600087803b1580156111ba57600080fd5b505af11580156111ce573d6000803e3d6000fd5b505050506040513d60a08110156111e457600080fd5b50602001519050600160a060020a03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156112ad57604080517f6a49d2c400000000000000000000000000000000000000000000000000000000815273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600482015263ffffffff831660248201529051600160a060020a03871691636a49d2c491604480830192600092919082900301818387803b15801561129057600080fd5b505af11580156112a4573d6000803e3d6000fd5b505050506113cc565b600454600160a060020a038381169116141561134357604080517f6a49d2c400000000000000000000000000000000000000000000000000000000815273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600482015263ffffffff831660248201529051600160a060020a03871691636a49d2c491604480830192600092919082900301818387803b15801561129057600080fd5b604080517f6a49d2c4000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015263ffffffff84166024830152915191871691636a49d2c49160448082019260009290919082900301818387803b1580156113b357600080fd5b505af11580156113c7573d6000803e3d6000fd5b505050505b6001909201916110c9565b505050505050565b600082600160a060020a031663579cd3ca6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561141f57600080fd5b505af1158015611433573d6000803e3d6000fd5b505050506040513d602081101561144957600080fd5b5051604080517fecbca55d00000000000000000000000000000000000000000000000000000000815263ffffffff831660048201529051919250600160a060020a0384169163ecbca55d9160248082019260009290919082900301818387803b1580156114b557600080fd5b505af11580156114c9573d6000803e3d6000fd5b50505050505050565b600080600080600086600160a060020a03166371f52bf36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561151857600080fd5b505af115801561152c573d6000803e3d6000fd5b505050506040513d602081101561154257600080fd5b50519350600092505b8361ffff168361ffff1610156114c95786600160a060020a03166319b64015846040518263ffffffff1660e060020a028152600401808261ffff168152602001915050602060405180830381600087803b1580156115a857600080fd5b505af11580156115bc573d6000803e3d6000fd5b505050506040513d60208110156115d257600080fd5b50519150600160a060020a03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156116735786600160a060020a031663690d8320876040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b15801561165657600080fd5b505af115801561166a573d6000803e3d6000fd5b50505050611944565b600454600160a060020a03838116911614156118235760048054604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038b811694820194909452905192909116916370a08231916024808201926020929091908290030181600087803b1580156116f557600080fd5b505af1158015611709573d6000803e3d6000fd5b505050506040513d602081101561171f57600080fd5b505160048054604080517f5e35359e000000000000000000000000000000000000000000000000000000008152600160a060020a03928316938101939093523060248401526044830184905251929750891691635e35359e9160648082019260009290919082900301818387803b15801561179957600080fd5b505af11580156117ad573d6000803e3d6000fd5b505060048054604080517f205c2878000000000000000000000000000000000000000000000000000000008152600160a060020a038c811694820194909452602481018b9052905192909116935063205c2878925060448082019260009290919082900301818387803b15801561165657600080fd5b50604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915183928316916370a082319160248083019260209291908290030181600087803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b505050506040513d60208110156118b357600080fd5b5051604080517f5e35359e000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152898116602483015260448201849052915192975090891691635e35359e9160648082019260009290919082900301818387803b15801561192b57600080fd5b505af115801561193f573d6000803e3d6000fd5b505050505b60019092019161154b565b60008061195a611f79565b604080517f69735632384f72486967686572282900000000000000000000000000000000008152815190819003600f0181206004825260248201909252602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093178352815191929091849188611388fa9250828015611a025750815115155b95945050505050565b6000806000806000806000806000611a228c61194f565b1515611a2d57611f6b565b8b600160a060020a0316633e8ff43f6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611a6b57600080fd5b505af1158015611a7f573d6000803e3d6000fd5b505050506040513d6020811015611a9557600080fd5b50519850600261ffff8a161415611f6b578b600160a060020a03166371f52bf36040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611ae457600080fd5b505af1158015611af8573d6000803e3d6000fd5b505050506040513d6020811015611b0e57600080fd5b50519750600096505b8761ffff168761ffff161015611cc4578b600160a060020a03166319b64015886040518263ffffffff1660e060020a028152600401808261ffff168152602001915050602060405180830381600087803b158015611b7457600080fd5b505af1158015611b88573d6000803e3d6000fd5b505050506040513d6020811015611b9e57600080fd5b5051604080517e5e319c000000000000000000000000000000000000000000000000000000008152600160a060020a0380841660048301529151929850908e1691625e319c916024808201926020929091908290030181600087803b158015611c0657600080fd5b505af1158015611c1a573d6000803e3d6000fd5b505050506040513d6020811015611c3057600080fd5b5051604080517fbf7da6ba000000000000000000000000000000000000000000000000000000008152600160a060020a038981166004830152602482018490529151929750908d169163bf7da6ba9160448082019260009290919082900301818387803b158015611ca057600080fd5b505af1158015611cb4573d6000803e3d6000fd5b505060019098019750611b179050565b891515611cd057611f6b565b8b600160a060020a0316630337e3fb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611d0e57600080fd5b505af1158015611d22573d6000803e3d6000fd5b505050506040513d6020811015611d3857600080fd5b5051604080517f2630c12f0000000000000000000000000000000000000000000000000000000081529051919550600160a060020a038e1691632630c12f916004808201926020929091908290030181600087803b158015611d9957600080fd5b505af1158015611dad573d6000803e3d6000fd5b505050506040513d6020811015611dc357600080fd5b5051604080517fb9e1715b0000000000000000000000000000000000000000000000000000000081529051919450600160a060020a0385169163b9e1715b916004808201926020929091908290030181600087803b158015611e2457600080fd5b505af1158015611e38573d6000803e3d6000fd5b505050506040513d6020811015611e4e57600080fd5b5051604080517ff997fda70000000000000000000000000000000000000000000000000000000081529051919350600160a060020a0385169163f997fda7916004808201926020929091908290030181600087803b158015611eaf57600080fd5b505af1158015611ec3573d6000803e3d6000fd5b505050506040513d6020811015611ed957600080fd5b5051604080517f119b90cd000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152858116602483015280841660448301529151929350908d169163119b90cd9160648082019260009290919082900301818387803b158015611f5257600080fd5b505af1158015611f66573d6000803e3d6000fd5b505050505b505050505050505050505050565b60206040519081016040528060019060208202803883395091929150505600a165627a7a72305820cd272a18b92e8d173af6176f64cfb021ab179b3da9704c8ebb85eecd8f9c907a0029

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

00000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

-----Decoded View---------------
Arg [0] : _registry (address): 0x52Ae12ABe5D8BD778BD5397F99cA900624CfADD4
Arg [1] : _etherToken (address): 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4
Arg [1] : 000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee


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.