Contract Overview
Balance: 0 Ether
Ether Value: $0
Transactions: 3577 txns
Misc:
Address Watch: Add To Watch List
Contract Creator: 0xea5e288b4f9d7e66da162e2af0db371783f62454at txn 0xfceea804456a2082666acaf339f21e4af38236715376881a70078a24c80eecba
Token Balance:
 Latest 25 transactions from a total of 3577 transactions

TxHash Age From To Value [TxFee]
0x4b57105a7b79ac487438d53813e0ffcb720a88d31705414a0b128a8ad5fd0e6a1 min ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.00048375
0xf13faf7734e679bc2fc40dd0dafded3a0d485f287e875f21a0448c0839afc37b11 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.000483942
0x36ca1cfebd47db8c2841d9be4b5ee2481926cbfa1a83a9cc5b2bddc785ad7e9444 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.000483942
0x10f801dc8c789edb56a2ba98767fcd5b76c74ccfc44bfff0f165ce657c792dcc1 hr 17 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.000483942
0xfd37e913f4e56afa3aeb1081e28d0bf15b8c6b92f78b68fcf09e826bd3b150a61 hr 47 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.000483942
0xedb2e9afb1dde70f68fe8bbd7fa02476c6ccf1fe57435a2a86c87534cd2ba4451 hr 52 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.000483942
0x73d25d2ed0ef9d18a6ec00fce34595a1a150c28c32f686ed4fdb20d000299ead2 hrs 8 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.000322628
0xeffde46e8fba8306c9bb30a8b9459902ae33bb9a48958a3cce16239103d36dc22 hrs 11 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.000483942
0x7807622b528da5f5e20df35f30279e468907acc60ebe611adc6b0ba11f50a78b2 hrs 44 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.00048375
0xfdcb84400fe31d4967199eb2aaf1a26d62ae8de310f6c7b19c5127606c5d00c92 hrs 53 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.000322628
0xff05bfc01b66af40a29709ee4c241e5b70beb52b7b50854c192159111dd6a0ec3 hrs 20 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.000322628
0xfc483d2d7079d1a169d8614eaa05282e196361f7cbd521272e152f9e722dca363 hrs 56 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.000483942
0xc8d8c2661a1c1527e47baf97bbc5ec0069c4041050484f7eb63cca635339f6404 hrs 29 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.000483942
0x4a7caba7c8373ac40d37c3585d1fe64be9db000ee54bcef973899a0c0d2064a55 hrs 2 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.000483942
0xbf02d5f53359463dfed0fec7c2b1f33f7cb5b8abd5882cdd52a5240ae2df5ef65 hrs 35 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.000483942
0xa75a0fd1b5bfddf12ba759d53b99df90a375467850dbe32cad6522640bc5aa275 hrs 47 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.00048375
0x81e13ce563d269647dd914167d7547bf1eee34d4f37f14e8a1ffc7d814f0ed486 hrs 20 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.000483942
0xc71d8d36da5da8634d9f5498c4da7ab0c5e6be6005b97aa5d7e99fa619fc7d946 hrs 53 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.000322628
0xde9af97b20c5313b4e835c1449b778505f03ab8020beba8c18fab0f3b79973187 hrs 25 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.000483942
0x08fc687515b0a85bc7a6870244ef6e5aba84bc4739e89585ceb4e5bc17fc24ad7 hrs 59 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.000483942
0xc5687e91e58be9ae970df3c4673858f3416d1adeccec9bb3487b3ebf3d4a31ed8 hrs 32 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.0003225
0x990c258a7d02f642b66d4d97cdefde038b9b2a34a266f0150963f318917ea4f99 hrs 2 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.000483942
0x9ca37e1067e935762df38a507e36b3751b9223cc58903b33f392a0bf63f0820d9 hrs 32 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.00048375
0x4c8a23238a1dbe4f656f040eceb6dc385c5527b8eca876e2412038a785d8ebc19 hrs 55 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.00048375
0x9084bd61c4e3c23fd0462a92d77c0db2429629ed1ff66e8127672fbad660472310 hrs 5 mins ago0xac1ed4fabbd5204e02950d68b6fc8c446ac95362  IN   0x73b172756bd5ddf0110ba8d7b88816eb639eb21c0 Ether0.00048375
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
View All
ParentTxHash Block Age From To Value
Contract Source Code Verified (Exact Match)
Contract Name: ExchangeRates
Compiler Text: v0.4.25+commit.59dbf8f1
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

/* ===============================================
* Flattened with Solidifier by Coinage
* 
* https://solidifier.coina.ge
* ===============================================
*/


pragma solidity ^0.4.24;

/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, reverts on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    uint256 c = a * b;
    require(c / a == b);

    return c;
  }

  /**
  * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b > 0); // Solidity only automatically asserts when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
  * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b <= a);
    uint256 c = a - b;

    return c;
  }

  /**
  * @dev Adds two numbers, reverts on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a);

    return c;
  }

  /**
  * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
  * reverts when dividing by zero.
  */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b != 0);
    return a % b;
  }
}


/*

-----------------------------------------------------------------
FILE INFORMATION
-----------------------------------------------------------------

file:       SafeDecimalMath.sol
version:    2.0
author:     Kevin Brown
            Gavin Conway
date:       2018-10-18

-----------------------------------------------------------------
MODULE DESCRIPTION
-----------------------------------------------------------------

A library providing safe mathematical operations for division and
multiplication with the capability to round or truncate the results
to the nearest increment. Operations can return a standard precision
or high precision decimal. High precision decimals are useful for
example when attempting to calculate percentages or fractions
accurately.

-----------------------------------------------------------------
*/


/**
 * @title Safely manipulate unsigned fixed-point decimals at a given precision level.
 * @dev Functions accepting uints in this contract and derived contracts
 * are taken to be such fixed point decimals of a specified precision (either standard
 * or high).
 */
library SafeDecimalMath {

    using SafeMath for uint;

    /* Number of decimal places in the representations. */
    uint8 public constant decimals = 18;
    uint8 public constant highPrecisionDecimals = 27;

    /* The number representing 1.0. */
    uint public constant UNIT = 10 ** uint(decimals);

    /* The number representing 1.0 for higher fidelity numbers. */
    uint public constant PRECISE_UNIT = 10 ** uint(highPrecisionDecimals);
    uint private constant UNIT_TO_HIGH_PRECISION_CONVERSION_FACTOR = 10 ** uint(highPrecisionDecimals - decimals);

    /** 
     * @return Provides an interface to UNIT.
     */
    function unit()
        external
        pure
        returns (uint)
    {
        return UNIT;
    }

    /** 
     * @return Provides an interface to PRECISE_UNIT.
     */
    function preciseUnit()
        external
        pure 
        returns (uint)
    {
        return PRECISE_UNIT;
    }

    /**
     * @return The result of multiplying x and y, interpreting the operands as fixed-point
     * decimals.
     * 
     * @dev A unit factor is divided out after the product of x and y is evaluated,
     * so that product must be less than 2**256. As this is an integer division,
     * the internal division always rounds down. This helps save on gas. Rounding
     * is more expensive on gas.
     */
    function multiplyDecimal(uint x, uint y)
        internal
        pure
        returns (uint)
    {
        /* Divide by UNIT to remove the extra factor introduced by the product. */
        return x.mul(y) / UNIT;
    }

    /**
     * @return The result of safely multiplying x and y, interpreting the operands
     * as fixed-point decimals of the specified precision unit.
     *
     * @dev The operands should be in the form of a the specified unit factor which will be
     * divided out after the product of x and y is evaluated, so that product must be
     * less than 2**256.
     *
     * Unlike multiplyDecimal, this function rounds the result to the nearest increment.
     * Rounding is useful when you need to retain fidelity for small decimal numbers
     * (eg. small fractions or percentages).
     */
    function _multiplyDecimalRound(uint x, uint y, uint precisionUnit)
        private
        pure
        returns (uint)
    {
        /* Divide by UNIT to remove the extra factor introduced by the product. */
        uint quotientTimesTen = x.mul(y) / (precisionUnit / 10);

        if (quotientTimesTen % 10 >= 5) {
            quotientTimesTen += 10;
        }

        return quotientTimesTen / 10;
    }

    /**
     * @return The result of safely multiplying x and y, interpreting the operands
     * as fixed-point decimals of a precise unit.
     *
     * @dev The operands should be in the precise unit factor which will be
     * divided out after the product of x and y is evaluated, so that product must be
     * less than 2**256.
     *
     * Unlike multiplyDecimal, this function rounds the result to the nearest increment.
     * Rounding is useful when you need to retain fidelity for small decimal numbers
     * (eg. small fractions or percentages).
     */
    function multiplyDecimalRoundPrecise(uint x, uint y)
        internal
        pure
        returns (uint)
    {
        return _multiplyDecimalRound(x, y, PRECISE_UNIT);
    }

    /**
     * @return The result of safely multiplying x and y, interpreting the operands
     * as fixed-point decimals of a standard unit.
     *
     * @dev The operands should be in the standard unit factor which will be
     * divided out after the product of x and y is evaluated, so that product must be
     * less than 2**256.
     *
     * Unlike multiplyDecimal, this function rounds the result to the nearest increment.
     * Rounding is useful when you need to retain fidelity for small decimal numbers
     * (eg. small fractions or percentages).
     */
    function multiplyDecimalRound(uint x, uint y)
        internal
        pure
        returns (uint)
    {
        return _multiplyDecimalRound(x, y, UNIT);
    }

    /**
     * @return The result of safely dividing x and y. The return value is a high
     * precision decimal.
     * 
     * @dev y is divided after the product of x and the standard precision unit
     * is evaluated, so the product of x and UNIT must be less than 2**256. As
     * this is an integer division, the result is always rounded down.
     * This helps save on gas. Rounding is more expensive on gas.
     */
    function divideDecimal(uint x, uint y)
        internal
        pure
        returns (uint)
    {
        /* Reintroduce the UNIT factor that will be divided out by y. */
        return x.mul(UNIT).div(y);
    }

    /**
     * @return The result of safely dividing x and y. The return value is as a rounded
     * decimal in the precision unit specified in the parameter.
     *
     * @dev y is divided after the product of x and the specified precision unit
     * is evaluated, so the product of x and the specified precision unit must
     * be less than 2**256. The result is rounded to the nearest increment.
     */
    function _divideDecimalRound(uint x, uint y, uint precisionUnit)
        private
        pure
        returns (uint)
    {
        uint resultTimesTen = x.mul(precisionUnit * 10).div(y);

        if (resultTimesTen % 10 >= 5) {
            resultTimesTen += 10;
        }

        return resultTimesTen / 10;
    }

    /**
     * @return The result of safely dividing x and y. The return value is as a rounded
     * standard precision decimal.
     *
     * @dev y is divided after the product of x and the standard precision unit
     * is evaluated, so the product of x and the standard precision unit must
     * be less than 2**256. The result is rounded to the nearest increment.
     */
    function divideDecimalRound(uint x, uint y)
        internal
        pure
        returns (uint)
    {
        return _divideDecimalRound(x, y, UNIT);
    }

    /**
     * @return The result of safely dividing x and y. The return value is as a rounded
     * high precision decimal.
     *
     * @dev y is divided after the product of x and the high precision unit
     * is evaluated, so the product of x and the high precision unit must
     * be less than 2**256. The result is rounded to the nearest increment.
     */
    function divideDecimalRoundPrecise(uint x, uint y)
        internal
        pure
        returns (uint)
    {
        return _divideDecimalRound(x, y, PRECISE_UNIT);
    }

    /**
     * @dev Convert a standard decimal representation to a high precision one.
     */
    function decimalToPreciseDecimal(uint i)
        internal
        pure
        returns (uint)
    {
        return i.mul(UNIT_TO_HIGH_PRECISION_CONVERSION_FACTOR);
    }

    /**
     * @dev Convert a high precision decimal to a standard decimal representation.
     */
    function preciseDecimalToDecimal(uint i)
        internal
        pure
        returns (uint)
    {
        uint quotientTimesTen = i / (UNIT_TO_HIGH_PRECISION_CONVERSION_FACTOR / 10);

        if (quotientTimesTen % 10 >= 5) {
            quotientTimesTen += 10;
        }

        return quotientTimesTen / 10;
    }

}


/*
-----------------------------------------------------------------
FILE INFORMATION
-----------------------------------------------------------------

file:       Owned.sol
version:    1.1
author:     Anton Jurisevic
            Dominic Romanowski

date:       2018-2-26

-----------------------------------------------------------------
MODULE DESCRIPTION
-----------------------------------------------------------------

An Owned contract, to be inherited by other contracts.
Requires its owner to be explicitly set in the constructor.
Provides an onlyOwner access modifier.

To change owner, the current owner must nominate the next owner,
who then has to accept the nomination. The nomination can be
cancelled before it is accepted by the new owner by having the
previous owner change the nomination (setting it to 0).

-----------------------------------------------------------------
*/


/**
 * @title A contract with an owner.
 * @notice Contract ownership can be transferred by first nominating the new owner,
 * who must then accept the ownership, which prevents accidental incorrect ownership transfers.
 */
contract Owned {
    address public owner;
    address public nominatedOwner;

    /**
     * @dev Owned Constructor
     */
    constructor(address _owner)
        public
    {
        require(_owner != address(0), "Owner address cannot be 0");
        owner = _owner;
        emit OwnerChanged(address(0), _owner);
    }

    /**
     * @notice Nominate a new owner of this contract.
     * @dev Only the current owner may nominate a new owner.
     */
    function nominateNewOwner(address _owner)
        external
        onlyOwner
    {
        nominatedOwner = _owner;
        emit OwnerNominated(_owner);
    }

    /**
     * @notice Accept the nomination to be 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
    {
        require(msg.sender == owner, "Only the contract owner may perform this action");
        _;
    }

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

/*
-----------------------------------------------------------------
FILE INFORMATION
-----------------------------------------------------------------

file:       SelfDestructible.sol
version:    1.2
author:     Anton Jurisevic

date:       2018-05-29

-----------------------------------------------------------------
MODULE DESCRIPTION
-----------------------------------------------------------------

This contract allows an inheriting contract to be destroyed after
its owner indicates an intention and then waits for a period
without changing their mind. All ether contained in the contract
is forwarded to a nominated beneficiary upon destruction.

-----------------------------------------------------------------
*/


/**
 * @title A contract that can be destroyed by its owner after a delay elapses.
 */
contract SelfDestructible is Owned {
    
    uint public initiationTime;
    bool public selfDestructInitiated;
    address public selfDestructBeneficiary;
    uint public constant SELFDESTRUCT_DELAY = 4 weeks;

    /**
     * @dev Constructor
     * @param _owner The account which controls this contract.
     */
    constructor(address _owner)
        Owned(_owner)
        public
    {
        require(_owner != address(0), "Owner must not be the zero address");
        selfDestructBeneficiary = _owner;
        emit SelfDestructBeneficiaryUpdated(_owner);
    }

    /**
     * @notice Set the beneficiary address of this contract.
     * @dev Only the contract owner may call this. The provided beneficiary must be non-null.
     * @param _beneficiary The address to pay any eth contained in this contract to upon self-destruction.
     */
    function setSelfDestructBeneficiary(address _beneficiary)
        external
        onlyOwner
    {
        require(_beneficiary != address(0), "Beneficiary must not be the zero address");
        selfDestructBeneficiary = _beneficiary;
        emit SelfDestructBeneficiaryUpdated(_beneficiary);
    }

    /**
     * @notice Begin the self-destruction counter of this contract.
     * Once the delay has elapsed, the contract may be self-destructed.
     * @dev Only the contract owner may call this.
     */
    function initiateSelfDestruct()
        external
        onlyOwner
    {
        initiationTime = now;
        selfDestructInitiated = true;
        emit SelfDestructInitiated(SELFDESTRUCT_DELAY);
    }

    /**
     * @notice Terminate and reset the self-destruction timer.
     * @dev Only the contract owner may call this.
     */
    function terminateSelfDestruct()
        external
        onlyOwner
    {
        initiationTime = 0;
        selfDestructInitiated = false;
        emit SelfDestructTerminated();
    }

    /**
     * @notice If the self-destruction delay has elapsed, destroy this contract and
     * remit any ether it owns to the beneficiary address.
     * @dev Only the contract owner may call this.
     */
    function selfDestruct()
        external
        onlyOwner
    {
        require(selfDestructInitiated, "Self destruct has not yet been initiated");
        require(initiationTime + SELFDESTRUCT_DELAY < now, "Self destruct delay has not yet elapsed");
        address beneficiary = selfDestructBeneficiary;
        emit SelfDestructed(beneficiary);
        selfdestruct(beneficiary);
    }

    event SelfDestructTerminated();
    event SelfDestructed(address beneficiary);
    event SelfDestructInitiated(uint selfDestructDelay);
    event SelfDestructBeneficiaryUpdated(address newBeneficiary);
}


/*
-----------------------------------------------------------------
FILE INFORMATION
-----------------------------------------------------------------

file:       ExchangeRates.sol
version:    1.0
author:     Kevin Brown
date:       2018-09-12

-----------------------------------------------------------------
MODULE DESCRIPTION
-----------------------------------------------------------------

A contract that any other contract in the Synthetix system can query
for the current market value of various assets, including
crypto assets as well as various fiat assets.

This contract assumes that rate updates will completely update
all rates to their current values. If a rate shock happens
on a single asset, the oracle will still push updated rates
for all other assets.

-----------------------------------------------------------------
*/


/**
 * @title The repository for exchange rates
 */
contract ExchangeRates is SelfDestructible {

    using SafeMath for uint;

    // Exchange rates stored by currency code, e.g. 'SNX', or 'sUSD'
    mapping(bytes4 => uint) public rates;

    // Update times stored by currency code, e.g. 'SNX', or 'sUSD'
    mapping(bytes4 => uint) public lastRateUpdateTimes;

    // The address of the oracle which pushes rate updates to this contract
    address public oracle;

    // Do not allow the oracle to submit times any further forward into the future than this constant.
    uint constant ORACLE_FUTURE_LIMIT = 10 minutes;

    // How long will the contract assume the rate of any asset is correct
    uint public rateStalePeriod = 3 hours;

    // Each participating currency in the XDR basket is represented as a currency key with
    // equal weighting.
    // There are 5 participating currencies, so we'll declare that clearly.
    bytes4[5] public xdrParticipants;

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

    /**
     * @dev Constructor
     * @param _owner The owner of this contract.
     * @param _oracle The address which is able to update rate information.
     * @param _currencyKeys The initial currency keys to store (in order).
     * @param _newRates The initial currency amounts for each currency (in order).
     */
    constructor(
        // SelfDestructible (Ownable)
        address _owner,

        // Oracle values - Allows for rate updates
        address _oracle,
        bytes4[] _currencyKeys,
        uint[] _newRates
    )
        /* Owned is initialised in SelfDestructible */
        SelfDestructible(_owner)
        public
    {
        require(_currencyKeys.length == _newRates.length, "Currency key length and rate length must match.");

        oracle = _oracle;

        // The sUSD rate is always 1 and is never stale.
        rates["sUSD"] = SafeDecimalMath.unit();
        lastRateUpdateTimes["sUSD"] = now;

        // These are the currencies that make up the XDR basket.
        // These are hard coded because:
        //  - This way users can depend on the calculation and know it won't change for this deployment of the contract.
        //  - Adding new currencies would likely introduce some kind of weighting factor, which
        //    isn't worth preemptively adding when all of the currencies in the current basket are weighted at 1.
        //  - The expectation is if this logic needs to be updated, we'll simply deploy a new version of this contract
        //    then point the system at the new version.
        xdrParticipants = [
            bytes4("sUSD"),
            bytes4("sAUD"),
            bytes4("sCHF"),
            bytes4("sEUR"),
            bytes4("sGBP")
        ];

        internalUpdateRates(_currencyKeys, _newRates, now);
    }

    /* ========== SETTERS ========== */

    /**
     * @notice Set the rates stored in this contract
     * @param currencyKeys The currency keys you wish to update the rates for (in order)
     * @param newRates The rates for each currency (in order)
     * @param timeSent The timestamp of when the update was sent, specified in seconds since epoch (e.g. the same as the now keyword in solidity).contract
     *                 This is useful because transactions can take a while to confirm, so this way we know how old the oracle's datapoint was exactly even
     *                 if it takes a long time for the transaction to confirm.
     */
    function updateRates(bytes4[] currencyKeys, uint[] newRates, uint timeSent)
        external
        onlyOracle
        returns(bool)
    {
        return internalUpdateRates(currencyKeys, newRates, timeSent);
    }

    /**
     * @notice Internal function which sets the rates stored in this contract
     * @param currencyKeys The currency keys you wish to update the rates for (in order)
     * @param newRates The rates for each currency (in order)
     * @param timeSent The timestamp of when the update was sent, specified in seconds since epoch (e.g. the same as the now keyword in solidity).contract
     *                 This is useful because transactions can take a while to confirm, so this way we know how old the oracle's datapoint was exactly even
     *                 if it takes a long time for the transaction to confirm.
     */
    function internalUpdateRates(bytes4[] currencyKeys, uint[] newRates, uint timeSent)
        internal
        returns(bool)
    {
        require(currencyKeys.length == newRates.length, "Currency key array length must match rates array length.");
        require(timeSent < (now + ORACLE_FUTURE_LIMIT), "Time is too far into the future");

        // Loop through each key and perform update.
        for (uint i = 0; i < currencyKeys.length; i++) {
            // Should not set any rate to zero ever, as no asset will ever be
            // truely worthless and still valid. In this scenario, we should
            // delete the rate and remove it from the system.
            require(newRates[i] != 0, "Zero is not a valid rate, please call deleteRate instead.");
            require(currencyKeys[i] != "sUSD", "Rate of sUSD cannot be updated, it's always UNIT.");

            // We should only update the rate if it's at least the same age as the last rate we've got.
            if (timeSent >= lastRateUpdateTimes[currencyKeys[i]]) {
                // Ok, go ahead with the update.
                rates[currencyKeys[i]] = newRates[i];
                lastRateUpdateTimes[currencyKeys[i]] = timeSent;
            }
        }

        emit RatesUpdated(currencyKeys, newRates);

        // Now update our XDR rate.
        updateXDRRate(timeSent);

        return true;
    }

    /**
     * @notice Update the Synthetix Drawing Rights exchange rate based on other rates already updated.
     */
    function updateXDRRate(uint timeSent)
        internal
    {
        uint total = 0;

        for (uint i = 0; i < xdrParticipants.length; i++) {
            total = rates[xdrParticipants[i]].add(total);
        }

        // Set the rate
        rates["XDR"] = total;

        // Record that we updated the XDR rate.
        lastRateUpdateTimes["XDR"] = timeSent;

        // Emit our updated event separate to the others to save
        // moving data around between arrays.
        bytes4[] memory eventCurrencyCode = new bytes4[](1);
        eventCurrencyCode[0] = "XDR";

        uint[] memory eventRate = new uint[](1);
        eventRate[0] = rates["XDR"];

        emit RatesUpdated(eventCurrencyCode, eventRate);
    }

    /**
     * @notice Delete a rate stored in the contract
     * @param currencyKey The currency key you wish to delete the rate for
     */
    function deleteRate(bytes4 currencyKey)
        external
        onlyOracle
    {
        require(rates[currencyKey] > 0, "Rate is zero");

        delete rates[currencyKey];
        delete lastRateUpdateTimes[currencyKey];

        emit RateDeleted(currencyKey);
    }

    /**
     * @notice Set the Oracle that pushes the rate information to this contract
     * @param _oracle The new oracle address
     */
    function setOracle(address _oracle)
        external
        onlyOwner
    {
        oracle = _oracle;
        emit OracleUpdated(oracle);
    }

    /**
     * @notice Set the stale period on the updated rate variables
     * @param _time The new rateStalePeriod
     */
    function setRateStalePeriod(uint _time)
        external
        onlyOwner
    {
        rateStalePeriod = _time;
        emit RateStalePeriodUpdated(rateStalePeriod);
    }

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

    /**
     * @notice Retrieve the rate for a specific currency
     */
    function rateForCurrency(bytes4 currencyKey)
        public
        view
        returns (uint)
    {
        return rates[currencyKey];
    }

    /**
     * @notice Retrieve the rates for a list of currencies
     */
    function ratesForCurrencies(bytes4[] currencyKeys)
        public
        view
        returns (uint[])
    {
        uint[] memory _rates = new uint[](currencyKeys.length);

        for (uint8 i = 0; i < currencyKeys.length; i++) {
            _rates[i] = rates[currencyKeys[i]];
        }

        return _rates;
    }

    /**
     * @notice Retrieve a list of last update times for specific currencies
     */
    function lastRateUpdateTimeForCurrency(bytes4 currencyKey)
        public
        view
        returns (uint)
    {
        return lastRateUpdateTimes[currencyKey];
    }

    /**
     * @notice Retrieve the last update time for a specific currency
     */
    function lastRateUpdateTimesForCurrencies(bytes4[] currencyKeys)
        public
        view
        returns (uint[])
    {
        uint[] memory lastUpdateTimes = new uint[](currencyKeys.length);

        for (uint8 i = 0; i < currencyKeys.length; i++) {
            lastUpdateTimes[i] = lastRateUpdateTimes[currencyKeys[i]];
        }

        return lastUpdateTimes;
    }

    /**
     * @notice Check if a specific currency's rate hasn't been updated for longer than the stale period.
     */
    function rateIsStale(bytes4 currencyKey)
        external
        view
        returns (bool)
    {
        // sUSD is a special case and is never stale.
        if (currencyKey == "sUSD") return false;

        return lastRateUpdateTimes[currencyKey].add(rateStalePeriod) < now;
    }

    /**
     * @notice Check if any of the currency rates passed in haven't been updated for longer than the stale period.
     */
    function anyRateIsStale(bytes4[] currencyKeys)
        external
        view
        returns (bool)
    {
        // Loop through each key and check whether the data point is stale.
        uint256 i = 0;

        while (i < currencyKeys.length) {
            // sUSD is a special case and is never false
            if (currencyKeys[i] != "sUSD" && lastRateUpdateTimes[currencyKeys[i]].add(rateStalePeriod) < now) {
                return true;
            }
            i += 1;
        }

        return false;
    }

    /* ========== MODIFIERS ========== */

    modifier onlyOracle
    {
        require(msg.sender == oracle, "Only the oracle can perform this action");
        _;
    }

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

    event OracleUpdated(address newOracle);
    event RateStalePeriodUpdated(uint rateStalePeriod);
    event RatesUpdated(bytes4[] currencyKeys, uint[] newRates);
    event RateDeleted(bytes4 currencyKey);
}

    Contract ABI  
[{"constant":true,"inputs":[],"name":"rateStalePeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initiationTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"currencyKeys","type":"bytes4[]"},{"name":"newRates","type":"uint256[]"},{"name":"timeSent","type":"uint256"}],"name":"updateRates","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"}],"name":"setSelfDestructBeneficiary","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"terminateSelfDestruct","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"currencyKey","type":"bytes4"}],"name":"deleteRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"currencyKeys","type":"bytes4[]"}],"name":"anyRateIsStale","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nominatedOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"currencyKeys","type":"bytes4[]"}],"name":"ratesForCurrencies","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_time","type":"uint256"}],"name":"setRateStalePeriod","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_oracle","type":"address"}],"name":"setOracle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"oracle","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"currencyKeys","type":"bytes4[]"}],"name":"lastRateUpdateTimesForCurrencies","outputs":[{"name":"","type":"uint256[]"}],"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":"selfDestruct","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"SELFDESTRUCT_DELAY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"xdrParticipants","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"currencyKey","type":"bytes4"}],"name":"rateForCurrency","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"selfDestructInitiated","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"initiateSelfDestruct","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"currencyKey","type":"bytes4"}],"name":"lastRateUpdateTimeForCurrency","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"selfDestructBeneficiary","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes4"}],"name":"rates","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes4"}],"name":"lastRateUpdateTimes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"currencyKey","type":"bytes4"}],"name":"rateIsStale","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_owner","type":"address"},{"name":"_oracle","type":"address"},{"name":"_currencyKeys","type":"bytes4[]"},{"name":"_newRates","type":"uint256[]"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOracle","type":"address"}],"name":"OracleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"rateStalePeriod","type":"uint256"}],"name":"RateStalePeriodUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"currencyKeys","type":"bytes4[]"},{"indexed":false,"name":"newRates","type":"uint256[]"}],"name":"RatesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"currencyKey","type":"bytes4"}],"name":"RateDeleted","type":"event"},{"anonymous":false,"inputs":[],"name":"SelfDestructTerminated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"beneficiary","type":"address"}],"name":"SelfDestructed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"selfDestructDelay","type":"uint256"}],"name":"SelfDestructInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newBeneficiary","type":"address"}],"name":"SelfDestructBeneficiaryUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOwner","type":"address"},{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"}]

  Contract Creation Code Switch To Opcodes View
6080604052612a306007553480156200001757600080fd5b50604051620026ca380380620026ca83398101604090815281516020830151918301516060840151919390810191018380600160a060020a0381161515620000c057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f74206265203000000000000000604482015290519081900360640190fd5b60008054600160a060020a031916600160a060020a038316908117825560408051928352602083019190915280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a150600160a060020a0381161515620001b757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4f776e6572206d757374206e6f7420626520746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60038054600160a060020a038316610100810261010060a860020a03199092169190911790915560408051918252517fd5da63a0b864b315bc04128dedbc93888c8529ee6cf47ce664dc204339228c539181900360200190a1508051825114620002a857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f43757272656e6379206b6579206c656e67746820616e642072617465206c656e60448201527f677468206d757374206d617463682e0000000000000000000000000000000000606482015290519081900360840190fd5b60068054600160a060020a031916600160a060020a038516179055604080517f907af6c000000000000000000000000000000000000000000000000000000000815290517384d626b2bb4d0f064067e4bf80fce7055d8f3e7b9163907af6c0916004808301926020929190829003018186803b1580156200032857600080fd5b505af41580156200033d573d6000803e3d6000fd5b505050506040513d60208110156200035457600080fd5b50517f735553440000000000000000000000000000000000000000000000000000000060008190527f9fb26aab670129fe77edeb65291121f3b0b41e28b5cdcb1e5461de51bb21e3c89190915560056020818152427f74c62d09fbc50aefae0794a9a068f786a692826fbdfe63828ec23a875865823f556040805160a0810182529384527f7341554400000000000000000000000000000000000000000000000000000000918401919091527f7343484600000000000000000000000000000000000000000000000000000000908301527f734555520000000000000000000000000000000000000000000000000000000060608301527f734742500000000000000000000000000000000000000000000000000000000060808301526200047f9160089162000bf2565b5062000496828242640100000000620004a1810204565b505050505062000cd6565b600080835185511415156200053d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f43757272656e6379206b6579206172726179206c656e677468206d757374206d60448201527f61746368207261746573206172726179206c656e6774682e0000000000000000606482015290519081900360840190fd5b42610258018310620005b057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f54696d6520697320746f6f2066617220696e746f207468652066757475726500604482015290519081900360640190fd5b5060005b845181101562000851578381815181101515620005cd57fe5b6020908102909101015115156200066b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f5a65726f206973206e6f7420612076616c696420726174652c20706c6561736560448201527f2063616c6c2064656c6574655261746520696e73746561642e00000000000000606482015290519081900360840190fd5b84818151811015156200067a57fe5b90602001906020020151600160e060020a0319167f7355534400000000000000000000000000000000000000000000000000000000141515156200074557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f52617465206f6620735553442063616e6e6f7420626520757064617465642c2060448201527f6974277320616c7761797320554e49542e000000000000000000000000000000606482015290519081900360840190fd5b6005600086838151811015156200075857fe5b60209081029091018101517fffffffff0000000000000000000000000000000000000000000000000000000016825281019190915260400160002054831062000848578381815181101515620007aa57fe5b90602001906020020151600460008784815181101515620007c757fe5b90602001906020020151600160e060020a031916600160e060020a031916815260200190815260200160002081905550826005600087848151811015156200080b57fe5b60209081029091018101517fffffffff00000000000000000000000000000000000000000000000000000000168252810191909152604001600020555b600101620005b4565b6000805160206200268a8339815191528585604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015620008a95781810151838201526020016200088f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015620008ea578181015183820152602001620008d0565b5050505090500194505050505060405180910390a162000913836401000000006200091e810204565b506001949350505050565b6000806060805b6005831015620009c957620009bb8460046000600887600581106200094657fe5b600891828204019190066004029054906101000a90047c010000000000000000000000000000000000000000000000000000000002600160e060020a031916600160e060020a03191681526020019081526020016000205462000bd8640100000000026200167c179091906401000000009004565b935060019092019162000925565b7f5844520000000000000000000000000000000000000000000000000000000000600052600080516020620026aa83398151915284905560056020527fc6095f8ba0c30294f3d36501e92c5966cb30d5606d2b235ecebf5abd9fffed92859055604080516001808252818301909252908160200160208202803883390190505091507f584452000000000000000000000000000000000000000000000000000000000082600081518110151562000a7c57fe5b7fffffffff000000000000000000000000000000000000000000000000000000009290921660209283029190910182015260408051600180825281830190925291828101908038833950507f584452000000000000000000000000000000000000000000000000000000000060009081526004602052600080516020620026aa83398151915254835193945092849250811062000b1557fe5b90602001906020020181815250506000805160206200268a8339815191528282604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101562000b7b57818101518382015260200162000b61565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101562000bbc57818101518382015260200162000ba2565b5050505090500194505050505060405180910390a15050505050565b60008282018381101562000beb57600080fd5b9392505050565b60018301918390821562000c9d5791602002820160005b8382111562000c6957835183826101000a81548163ffffffff02191690837c010000000000000000000000000000000000000000000000000000000090040217905550926020019260040160208160030104928301926001030262000c09565b801562000c9b5782816101000a81549063ffffffff021916905560040160208160030104928301926001030262000c69565b505b5062000cab92915062000caf565b5090565b62000cd391905b8082111562000cab57805463ffffffff1916815560010162000cb6565b90565b6119a48062000ce66000396000f3006080604052600436106101455763ffffffff60e060020a6000350416630ee4951b811461014a5780631627540c1461017157806317c70de4146101945780631d2fed16146101a957806320714f88146101ec5780633278c9601461020d5780633608069414610222578063370d62ad1461024457806353a47bb7146102645780635dc2944a1461029557806379ba50971461033a57806379cb657a1461034f5780637adbf973146103675780637dc0d1d01461038857806389f8ab941461039d5780638da5cb5b146103f25780639cb8a26a14610407578063a461fc821461041c578063aa687daf14610431578063af1ff97214610466578063b8225dec14610488578063bd32aa441461049d578063c0e59e4d146104b2578063c58aaae6146104d4578063de5eb832146104e9578063e1686e721461050b578063ea3d41091461052d575b600080fd5b34801561015657600080fd5b5061015f61054f565b60408051918252519081900360200190f35b34801561017d57600080fd5b50610192600160a060020a0360043516610555565b005b3480156101a057600080fd5b5061015f61061a565b3480156101b557600080fd5b506101d86024600480358281019290820135918135918201910135604435610620565b604080519115158252519081900360200190f35b3480156101f857600080fd5b50610192600160a060020a0360043516610718565b34801561021957600080fd5b5061019261086b565b34801561022e57600080fd5b50610192600160e060020a031960043516610909565b34801561025057600080fd5b506101d86004803560248101910135610a5e565b34801561027057600080fd5b50610279610b22565b60408051600160a060020a039092168252519081900360200190f35b3480156102a157600080fd5b50604080516020600480358082013583810280860185019096528085526102ea95369593946024949385019291829185019084908082843750949750610b319650505050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561032657818101518382015260200161030e565b505050509050019250505060405180910390f35b34801561034657600080fd5b50610192610bd1565b34801561035b57600080fd5b50610192600435610cd9565b34801561037357600080fd5b50610192600160a060020a0360043516610d78565b34801561039457600080fd5b50610279610e43565b3480156103a957600080fd5b50604080516020600480358082013583810280860185019096528085526102ea95369593946024949385019291829185019084908082843750949750610e529650505050505050565b3480156103fe57600080fd5b50610279610ef2565b34801561041357600080fd5b50610192610f01565b34801561042857600080fd5b5061015f6110c6565b34801561043d57600080fd5b506104496004356110cd565b60408051600160e060020a03199092168252519081900360200190f35b34801561047257600080fd5b5061015f600160e060020a0319600435166110fa565b34801561049457600080fd5b506101d861111a565b3480156104a957600080fd5b50610192611123565b3480156104be57600080fd5b5061015f600160e060020a0319600435166111d0565b3480156104e057600080fd5b506102796111ec565b3480156104f557600080fd5b5061015f600160e060020a031960043516611200565b34801561051757600080fd5b5061015f600160e060020a031960043516611212565b34801561053957600080fd5b506101d8600160e060020a031960043516611224565b60075481565b600054600160a060020a031633146105b9576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b60018054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229181900360200190a150565b60025481565b600654600090600160a060020a031633146106ab576040805160e560020a62461bcd02815260206004820152602760248201527f4f6e6c7920746865206f7261636c652063616e20706572666f726d207468697360448201527f20616374696f6e00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b61070e8686808060200260200160405190810160405280939291908181526020018383602002808284375050604080516020808c0282810182019093528b82529095508b94508a9350839250850190849080828437508994506112969350505050565b9695505050505050565b600054600160a060020a0316331461077c576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b600160a060020a0381161515610802576040805160e560020a62461bcd02815260206004820152602860248201527f42656e6566696369617279206d757374206e6f7420626520746865207a65726f60448201527f2061646472657373000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60038054600160a060020a038316610100810274ffffffffffffffffffffffffffffffffffffffff00199092169190911790915560408051918252517fd5da63a0b864b315bc04128dedbc93888c8529ee6cf47ce664dc204339228c539181900360200190a150565b600054600160a060020a031633146108cf576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b600060028190556003805460ff191690556040517f6adcc7125002935e0aa31697538ebbd65cfddf20431eb6ecdcfc3e238bfd082c9190a1565b600654600160a060020a03163314610991576040805160e560020a62461bcd02815260206004820152602760248201527f4f6e6c7920746865206f7261636c652063616e20706572666f726d207468697360448201527f20616374696f6e00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160e060020a0319811660009081526004602052604081205411610a00576040805160e560020a62461bcd02815260206004820152600c60248201527f52617465206973207a65726f0000000000000000000000000000000000000000604482015290519081900360640190fd5b600160e060020a0319811660008181526004602090815260408083208390556005825280832092909255815192835290517f2cefb058ca1556b021b67f710e3df89c564650f01fef8cd944cbb14d7358680b9281900390910190a150565b6000805b82811015610b1657838382818110610a7657fe5b90506020020135600160e060020a031916600160e060020a0319167f735553440000000000000000000000000000000000000000000000000000000014158015610b00575042610afe600754600560008888878181101515610ad457fe5b60209081029290920135600160e060020a031916835250810191909152604001600020549061167c565b105b15610b0e5760019150610b1b565b600101610a62565b600091505b5092915050565b600154600160a060020a031681565b60608060008351604051908082528060200260200182016040528015610b61578160200160208202803883390190505b509150600090505b83518160ff161015610b1b5760046000858360ff16815181101515610b8a57fe5b6020908102909101810151600160e060020a0319168252810191909152604001600020548251839060ff8416908110610bbf57fe5b60209081029091010152600101610b69565b600154600160a060020a03163314610c59576040805160e560020a62461bcd02815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e6572736869700000000000000000000000606482015290519081900360840190fd5b60005460015460408051600160a060020a03938416815292909116602083015280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a1600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600054600160a060020a03163314610d3d576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b60078190556040805182815290517f16529d8c407b08938da67de7fa4319199baffce4f5d1971f812cc770b0237e669181900360200190a150565b600054600160a060020a03163314610ddc576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03838116919091179182905560408051929091168252517f3df77beb5db05fcdd70a30fc8adf3f83f9501b68579455adbd100b8180940394916020908290030190a150565b600654600160a060020a031681565b60608060008351604051908082528060200260200182016040528015610e82578160200160208202803883390190505b509150600090505b83518160ff161015610b1b5760056000858360ff16815181101515610eab57fe5b6020908102909101810151600160e060020a0319168252810191909152604001600020548251839060ff8416908110610ee057fe5b60209081029091010152600101610e8a565b600054600160a060020a031681565b60008054600160a060020a03163314610f66576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b60035460ff161515610fe8576040805160e560020a62461bcd02815260206004820152602860248201527f53656c6620646573747275637420686173206e6f7420796574206265656e206960448201527f6e69746961746564000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b426224ea006002540110151561106e576040805160e560020a62461bcd02815260206004820152602760248201527f53656c662064657374727563742064656c617920686173206e6f74207965742060448201527f656c617073656400000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b5060035460408051600160a060020a0361010090930492909216808352905190917f8a09e1677ced846cb537dc2b172043bd05a1a81ad7e0033a7ef8ba762df990b7919081900360200190a180600160a060020a0316ff5b6224ea0081565b600881600581106110da57fe5b60089182820401919006600402915054906101000a900460e060020a0281565b600160e060020a031981166000908152600460205260409020545b919050565b60035460ff1681565b600054600160a060020a03163314611187576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b426002556003805460ff19166001179055604080516224ea00815290517fcbd94ca75b8dc45c9d80c77e851670e78843c0d75180cb81db3e2158228fa9a69181900360200190a1565b600160e060020a03191660009081526005602052604090205490565b6003546101009004600160a060020a031681565b60046020526000908152604090205481565b60056020526000908152604090205481565b60007f7355534400000000000000000000000000000000000000000000000000000000600160e060020a03198316141561126057506000611115565b600754600160e060020a03198316600090815260056020526040902054429161128f919063ffffffff61167c16565b1092915050565b6000808351855114151561131a576040805160e560020a62461bcd02815260206004820152603860248201527f43757272656e6379206b6579206172726179206c656e677468206d757374206d60448201527f61746368207261746573206172726179206c656e6774682e0000000000000000606482015290519081900360840190fd5b42610258018310611375576040805160e560020a62461bcd02815260206004820152601f60248201527f54696d6520697320746f6f2066617220696e746f207468652066757475726500604482015290519081900360640190fd5b5060005b84518110156115ad57838181518110151561139057fe5b602090810290910101511515611416576040805160e560020a62461bcd02815260206004820152603960248201527f5a65726f206973206e6f7420612076616c696420726174652c20706c6561736560448201527f2063616c6c2064656c6574655261746520696e73746561642e00000000000000606482015290519081900360840190fd5b848181518110151561142457fe5b90602001906020020151600160e060020a0319167f7355534400000000000000000000000000000000000000000000000000000000141515156114d7576040805160e560020a62461bcd02815260206004820152603160248201527f52617465206f6620735553442063616e6e6f7420626520757064617465642c2060448201527f6974277320616c7761797320554e49542e000000000000000000000000000000606482015290519081900360840190fd5b6005600086838151811015156114e957fe5b6020908102909101810151600160e060020a03191682528101919091526040016000205483106115a557838181518110151561152157fe5b9060200190602002015160046000878481518110151561153d57fe5b90602001906020020151600160e060020a031916600160e060020a0319168152602001908152602001600020819055508260056000878481518110151561158057fe5b6020908102909101810151600160e060020a0319168252810191909152604001600020555b600101611379565b7f7a72efae5f6b256f1ca71728b01f9dd7004ff3770dcaef4c44872b94d9f9e91b8585604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156116145781810151838201526020016115fc565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561165357818101518382015260200161163b565b5050505090500194505050505060405180910390a161167183611695565b506001949350505050565b60008282018381101561168e57600080fd5b9392505050565b6000806060805b6005831015611714576117078460046000600887600581106116ba57fe5b600891828204019190066004029054906101000a900460e060020a02600160e060020a031916600160e060020a03191681526020019081526020016000205461167c90919063ffffffff16565b935060019092019161169c565b7f58445200000000000000000000000000000000000000000000000000000000006000527fff1c33bb980e6507c2f1abbbb539f436519cfa198453007a4295f347e328ef6b84905560056020527fc6095f8ba0c30294f3d36501e92c5966cb30d5606d2b235ecebf5abd9fffed92859055604080516001808252818301909252908160200160208202803883390190505091507f58445200000000000000000000000000000000000000000000000000000000008260008151811015156117d757fe5b600160e060020a03199290921660209283029190910182015260408051600180825281830190925291828101908038833950507f5844520000000000000000000000000000000000000000000000000000000000600090815260046020527fff1c33bb980e6507c2f1abbbb539f436519cfa198453007a4295f347e328ef6b54835193945092849250811061186857fe5b90602001906020020181815250507f7a72efae5f6b256f1ca71728b01f9dd7004ff3770dcaef4c44872b94d9f9e91b8282604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156118dd5781810151838201526020016118c5565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561191c578181015183820152602001611904565b5050505090500194505050505060405180910390a1505050505056004f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6e0000000000000000000000000000000000a165627a7a723058206d2acb312f4828ef30c82a1d956131a57f4d89cff03a7d733617341f34f99cc400297a72efae5f6b256f1ca71728b01f9dd7004ff3770dcaef4c44872b94d9f9e91bff1c33bb980e6507c2f1abbbb539f436519cfa198453007a4295f347e328ef6b000000000000000000000000ea5e288b4f9d7e66da162e2af0db371783f62454000000000000000000000000ac1ed4fabbd5204e02950d68b6fc8c446ac95362000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001534e580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000002c68af0bb140000

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

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000ea5e288b4f9d7e66da162e2af0db371783f62454
Arg [1] : 000000000000000000000000ac1ed4fabbd5204e02950d68b6fc8c446ac95362
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 534e580000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : 00000000000000000000000000000000000000000000000002c68af0bb140000


   Library Used
SafeDecimalMath : 0x84D626B2BB4D0F064067e4BF80FCe7055d8F3E7B

   Swarm Source:
bzzr://6d2acb312f4828ef30c82a1d956131a57f4d89cff03a7d733617341f34f99cc4

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.