ETH Price: $2,805.86 (+1.13%)

Contract

0x73b172756BD5DDf0110Ba8D7b88816Eb639Eb21c
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Update Rates76267872019-04-23 23:54:582132 days ago1556063698IN
Synthetix: Old Exchange Rates
0 ETH0.000875453
Update Rates76267502019-04-23 23:44:562132 days ago1556063096IN
Synthetix: Old Exchange Rates
0 ETH0.000583632
Update Rates76267392019-04-23 23:42:152132 days ago1556062935IN
Synthetix: Old Exchange Rates
0 ETH0.000875263
Update Rates76267272019-04-23 23:38:562132 days ago1556062736IN
Synthetix: Old Exchange Rates
0 ETH0.000875263
Update Rates76266462019-04-23 23:19:072132 days ago1556061547IN
Synthetix: Old Exchange Rates
0 ETH0.000875453
Update Rates76265092019-04-23 22:44:472132 days ago1556059487IN
Synthetix: Old Exchange Rates
0 ETH0.00058352
Update Rates76264812019-04-23 22:37:422132 days ago1556059062IN
Synthetix: Old Exchange Rates
0 ETH0.000291811
Update Rates76264592019-04-23 22:31:482132 days ago1556058708IN
Synthetix: Old Exchange Rates
0 ETH0.000291811
Update Rates76264182019-04-23 22:24:222132 days ago1556058262IN
Synthetix: Old Exchange Rates
0 ETH0.000583382
Update Rates76263922019-04-23 22:17:582132 days ago1556057878IN
Synthetix: Old Exchange Rates
0 ETH0.000875453
Update Rates76263682019-04-23 22:10:022132 days ago1556057402IN
Synthetix: Old Exchange Rates
0 ETH0.000875453
Update Rates76263172019-04-23 21:56:302132 days ago1556056590IN
Synthetix: Old Exchange Rates
0 ETH0.000875263
Update Rates76263162019-04-23 21:56:212132 days ago1556056581IN
Synthetix: Old Exchange Rates
0 ETH0.000291811
Update Rates76261522019-04-23 21:15:022132 days ago1556054102IN
Synthetix: Old Exchange Rates
0 ETH0.000583632
Update Rates76261272019-04-23 21:08:492132 days ago1556053729IN
Synthetix: Old Exchange Rates
0 ETH0.000875453
Update Rates76261142019-04-23 21:06:452132 days ago1556053605IN
Synthetix: Old Exchange Rates
0 ETH0.000875453
Update Rates76259562019-04-23 20:33:062132 days ago1556051586IN
Synthetix: Old Exchange Rates
0 ETH0.000875453
Update Rates76258382019-04-23 20:06:052132 days ago1556049965IN
Synthetix: Old Exchange Rates
0 ETH0.000875453
Update Rates76257712019-04-23 19:50:342132 days ago1556049034IN
Synthetix: Old Exchange Rates
0 ETH0.000875453
Update Rates76257172019-04-23 19:41:492132 days ago1556048509IN
Synthetix: Old Exchange Rates
0 ETH0.000875453
Update Rates76256452019-04-23 19:23:532132 days ago1556047433IN
Synthetix: Old Exchange Rates
0 ETH0.000875263
Update Rates76255102019-04-23 18:51:102132 days ago1556045470IN
Synthetix: Old Exchange Rates
0 ETH0.000875453
Update Rates76254512019-04-23 18:38:492132 days ago1556044729IN
Synthetix: Old Exchange Rates
0 ETH0.000875453
Update Rates76254072019-04-23 18:29:582132 days ago1556044198IN
Synthetix: Old Exchange Rates
0 ETH0.000875453
Update Rates76253862019-04-23 18:23:372132 days ago1556043817IN
Synthetix: Old Exchange Rates
0 ETH0.000875453
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ExchangeRates

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-12-06
*/

/* ===============================================
* 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 Security Audit

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

6080604052612a306007553480156200001757600080fd5b50604051620026ca380380620026ca83398101604090815281516020830151918301516060840151919390810191018380600160a060020a0381161515620000c057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f74206265203000000000000000604482015290519081900360640190fd5b60008054600160a060020a031916600160a060020a038316908117825560408051928352602083019190915280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a150600160a060020a0381161515620001b757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4f776e6572206d757374206e6f7420626520746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60038054600160a060020a038316610100810261010060a860020a03199092169190911790915560408051918252517fd5da63a0b864b315bc04128dedbc93888c8529ee6cf47ce664dc204339228c539181900360200190a1508051825114620002a857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f43757272656e6379206b6579206c656e67746820616e642072617465206c656e60448201527f677468206d757374206d617463682e0000000000000000000000000000000000606482015290519081900360840190fd5b60068054600160a060020a031916600160a060020a038516179055604080517f907af6c000000000000000000000000000000000000000000000000000000000815290517384d626b2bb4d0f064067e4bf80fce7055d8f3e7b9163907af6c0916004808301926020929190829003018186803b1580156200032857600080fd5b505af41580156200033d573d6000803e3d6000fd5b505050506040513d60208110156200035457600080fd5b50517f735553440000000000000000000000000000000000000000000000000000000060008190527f9fb26aab670129fe77edeb65291121f3b0b41e28b5cdcb1e5461de51bb21e3c89190915560056020818152427f74c62d09fbc50aefae0794a9a068f786a692826fbdfe63828ec23a875865823f556040805160a0810182529384527f7341554400000000000000000000000000000000000000000000000000000000918401919091527f7343484600000000000000000000000000000000000000000000000000000000908301527f734555520000000000000000000000000000000000000000000000000000000060608301527f734742500000000000000000000000000000000000000000000000000000000060808301526200047f9160089162000bf2565b5062000496828242640100000000620004a1810204565b505050505062000cd6565b600080835185511415156200053d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f43757272656e6379206b6579206172726179206c656e677468206d757374206d60448201527f61746368207261746573206172726179206c656e6774682e0000000000000000606482015290519081900360840190fd5b42610258018310620005b057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f54696d6520697320746f6f2066617220696e746f207468652066757475726500604482015290519081900360640190fd5b5060005b845181101562000851578381815181101515620005cd57fe5b6020908102909101015115156200066b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f5a65726f206973206e6f7420612076616c696420726174652c20706c6561736560448201527f2063616c6c2064656c6574655261746520696e73746561642e00000000000000606482015290519081900360840190fd5b84818151811015156200067a57fe5b90602001906020020151600160e060020a0319167f7355534400000000000000000000000000000000000000000000000000000000141515156200074557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f52617465206f6620735553442063616e6e6f7420626520757064617465642c2060448201527f6974277320616c7761797320554e49542e000000000000000000000000000000606482015290519081900360840190fd5b6005600086838151811015156200075857fe5b60209081029091018101517fffffffff0000000000000000000000000000000000000000000000000000000016825281019190915260400160002054831062000848578381815181101515620007aa57fe5b90602001906020020151600460008784815181101515620007c757fe5b90602001906020020151600160e060020a031916600160e060020a031916815260200190815260200160002081905550826005600087848151811015156200080b57fe5b60209081029091018101517fffffffff00000000000000000000000000000000000000000000000000000000168252810191909152604001600020555b600101620005b4565b6000805160206200268a8339815191528585604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015620008a95781810151838201526020016200088f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015620008ea578181015183820152602001620008d0565b5050505090500194505050505060405180910390a162000913836401000000006200091e810204565b506001949350505050565b6000806060805b6005831015620009c957620009bb8460046000600887600581106200094657fe5b600891828204019190066004029054906101000a90047c010000000000000000000000000000000000000000000000000000000002600160e060020a031916600160e060020a03191681526020019081526020016000205462000bd8640100000000026200167c179091906401000000009004565b935060019092019162000925565b7f5844520000000000000000000000000000000000000000000000000000000000600052600080516020620026aa83398151915284905560056020527fc6095f8ba0c30294f3d36501e92c5966cb30d5606d2b235ecebf5abd9fffed92859055604080516001808252818301909252908160200160208202803883390190505091507f584452000000000000000000000000000000000000000000000000000000000082600081518110151562000a7c57fe5b7fffffffff000000000000000000000000000000000000000000000000000000009290921660209283029190910182015260408051600180825281830190925291828101908038833950507f584452000000000000000000000000000000000000000000000000000000000060009081526004602052600080516020620026aa83398151915254835193945092849250811062000b1557fe5b90602001906020020181815250506000805160206200268a8339815191528282604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101562000b7b57818101518382015260200162000b61565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101562000bbc57818101518382015260200162000ba2565b5050505090500194505050505060405180910390a15050505050565b60008282018381101562000beb57600080fd5b9392505050565b60018301918390821562000c9d5791602002820160005b8382111562000c6957835183826101000a81548163ffffffff02191690837c010000000000000000000000000000000000000000000000000000000090040217905550926020019260040160208160030104928301926001030262000c09565b801562000c9b5782816101000a81549063ffffffff021916905560040160208160030104928301926001030262000c69565b505b5062000cab92915062000caf565b5090565b62000cd391905b8082111562000cab57805463ffffffff1916815560010162000cb6565b90565b6119a48062000ce66000396000f3006080604052600436106101455763ffffffff60e060020a6000350416630ee4951b811461014a5780631627540c1461017157806317c70de4146101945780631d2fed16146101a957806320714f88146101ec5780633278c9601461020d5780633608069414610222578063370d62ad1461024457806353a47bb7146102645780635dc2944a1461029557806379ba50971461033a57806379cb657a1461034f5780637adbf973146103675780637dc0d1d01461038857806389f8ab941461039d5780638da5cb5b146103f25780639cb8a26a14610407578063a461fc821461041c578063aa687daf14610431578063af1ff97214610466578063b8225dec14610488578063bd32aa441461049d578063c0e59e4d146104b2578063c58aaae6146104d4578063de5eb832146104e9578063e1686e721461050b578063ea3d41091461052d575b600080fd5b34801561015657600080fd5b5061015f61054f565b60408051918252519081900360200190f35b34801561017d57600080fd5b50610192600160a060020a0360043516610555565b005b3480156101a057600080fd5b5061015f61061a565b3480156101b557600080fd5b506101d86024600480358281019290820135918135918201910135604435610620565b604080519115158252519081900360200190f35b3480156101f857600080fd5b50610192600160a060020a0360043516610718565b34801561021957600080fd5b5061019261086b565b34801561022e57600080fd5b50610192600160e060020a031960043516610909565b34801561025057600080fd5b506101d86004803560248101910135610a5e565b34801561027057600080fd5b50610279610b22565b60408051600160a060020a039092168252519081900360200190f35b3480156102a157600080fd5b50604080516020600480358082013583810280860185019096528085526102ea95369593946024949385019291829185019084908082843750949750610b319650505050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561032657818101518382015260200161030e565b505050509050019250505060405180910390f35b34801561034657600080fd5b50610192610bd1565b34801561035b57600080fd5b50610192600435610cd9565b34801561037357600080fd5b50610192600160a060020a0360043516610d78565b34801561039457600080fd5b50610279610e43565b3480156103a957600080fd5b50604080516020600480358082013583810280860185019096528085526102ea95369593946024949385019291829185019084908082843750949750610e529650505050505050565b3480156103fe57600080fd5b50610279610ef2565b34801561041357600080fd5b50610192610f01565b34801561042857600080fd5b5061015f6110c6565b34801561043d57600080fd5b506104496004356110cd565b60408051600160e060020a03199092168252519081900360200190f35b34801561047257600080fd5b5061015f600160e060020a0319600435166110fa565b34801561049457600080fd5b506101d861111a565b3480156104a957600080fd5b50610192611123565b3480156104be57600080fd5b5061015f600160e060020a0319600435166111d0565b3480156104e057600080fd5b506102796111ec565b3480156104f557600080fd5b5061015f600160e060020a031960043516611200565b34801561051757600080fd5b5061015f600160e060020a031960043516611212565b34801561053957600080fd5b506101d8600160e060020a031960043516611224565b60075481565b600054600160a060020a031633146105b9576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b60018054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229181900360200190a150565b60025481565b600654600090600160a060020a031633146106ab576040805160e560020a62461bcd02815260206004820152602760248201527f4f6e6c7920746865206f7261636c652063616e20706572666f726d207468697360448201527f20616374696f6e00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b61070e8686808060200260200160405190810160405280939291908181526020018383602002808284375050604080516020808c0282810182019093528b82529095508b94508a9350839250850190849080828437508994506112969350505050565b9695505050505050565b600054600160a060020a0316331461077c576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b600160a060020a0381161515610802576040805160e560020a62461bcd02815260206004820152602860248201527f42656e6566696369617279206d757374206e6f7420626520746865207a65726f60448201527f2061646472657373000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60038054600160a060020a038316610100810274ffffffffffffffffffffffffffffffffffffffff00199092169190911790915560408051918252517fd5da63a0b864b315bc04128dedbc93888c8529ee6cf47ce664dc204339228c539181900360200190a150565b600054600160a060020a031633146108cf576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b600060028190556003805460ff191690556040517f6adcc7125002935e0aa31697538ebbd65cfddf20431eb6ecdcfc3e238bfd082c9190a1565b600654600160a060020a03163314610991576040805160e560020a62461bcd02815260206004820152602760248201527f4f6e6c7920746865206f7261636c652063616e20706572666f726d207468697360448201527f20616374696f6e00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160e060020a0319811660009081526004602052604081205411610a00576040805160e560020a62461bcd02815260206004820152600c60248201527f52617465206973207a65726f0000000000000000000000000000000000000000604482015290519081900360640190fd5b600160e060020a0319811660008181526004602090815260408083208390556005825280832092909255815192835290517f2cefb058ca1556b021b67f710e3df89c564650f01fef8cd944cbb14d7358680b9281900390910190a150565b6000805b82811015610b1657838382818110610a7657fe5b90506020020135600160e060020a031916600160e060020a0319167f735553440000000000000000000000000000000000000000000000000000000014158015610b00575042610afe600754600560008888878181101515610ad457fe5b60209081029290920135600160e060020a031916835250810191909152604001600020549061167c565b105b15610b0e5760019150610b1b565b600101610a62565b600091505b5092915050565b600154600160a060020a031681565b60608060008351604051908082528060200260200182016040528015610b61578160200160208202803883390190505b509150600090505b83518160ff161015610b1b5760046000858360ff16815181101515610b8a57fe5b6020908102909101810151600160e060020a0319168252810191909152604001600020548251839060ff8416908110610bbf57fe5b60209081029091010152600101610b69565b600154600160a060020a03163314610c59576040805160e560020a62461bcd02815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e6572736869700000000000000000000000606482015290519081900360840190fd5b60005460015460408051600160a060020a03938416815292909116602083015280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a1600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600054600160a060020a03163314610d3d576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b60078190556040805182815290517f16529d8c407b08938da67de7fa4319199baffce4f5d1971f812cc770b0237e669181900360200190a150565b600054600160a060020a03163314610ddc576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03838116919091179182905560408051929091168252517f3df77beb5db05fcdd70a30fc8adf3f83f9501b68579455adbd100b8180940394916020908290030190a150565b600654600160a060020a031681565b60608060008351604051908082528060200260200182016040528015610e82578160200160208202803883390190505b509150600090505b83518160ff161015610b1b5760056000858360ff16815181101515610eab57fe5b6020908102909101810151600160e060020a0319168252810191909152604001600020548251839060ff8416908110610ee057fe5b60209081029091010152600101610e8a565b600054600160a060020a031681565b60008054600160a060020a03163314610f66576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b60035460ff161515610fe8576040805160e560020a62461bcd02815260206004820152602860248201527f53656c6620646573747275637420686173206e6f7420796574206265656e206960448201527f6e69746961746564000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b426224ea006002540110151561106e576040805160e560020a62461bcd02815260206004820152602760248201527f53656c662064657374727563742064656c617920686173206e6f74207965742060448201527f656c617073656400000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b5060035460408051600160a060020a0361010090930492909216808352905190917f8a09e1677ced846cb537dc2b172043bd05a1a81ad7e0033a7ef8ba762df990b7919081900360200190a180600160a060020a0316ff5b6224ea0081565b600881600581106110da57fe5b60089182820401919006600402915054906101000a900460e060020a0281565b600160e060020a031981166000908152600460205260409020545b919050565b60035460ff1681565b600054600160a060020a03163314611187576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b426002556003805460ff19166001179055604080516224ea00815290517fcbd94ca75b8dc45c9d80c77e851670e78843c0d75180cb81db3e2158228fa9a69181900360200190a1565b600160e060020a03191660009081526005602052604090205490565b6003546101009004600160a060020a031681565b60046020526000908152604090205481565b60056020526000908152604090205481565b60007f7355534400000000000000000000000000000000000000000000000000000000600160e060020a03198316141561126057506000611115565b600754600160e060020a03198316600090815260056020526040902054429161128f919063ffffffff61167c16565b1092915050565b6000808351855114151561131a576040805160e560020a62461bcd02815260206004820152603860248201527f43757272656e6379206b6579206172726179206c656e677468206d757374206d60448201527f61746368207261746573206172726179206c656e6774682e0000000000000000606482015290519081900360840190fd5b42610258018310611375576040805160e560020a62461bcd02815260206004820152601f60248201527f54696d6520697320746f6f2066617220696e746f207468652066757475726500604482015290519081900360640190fd5b5060005b84518110156115ad57838181518110151561139057fe5b602090810290910101511515611416576040805160e560020a62461bcd02815260206004820152603960248201527f5a65726f206973206e6f7420612076616c696420726174652c20706c6561736560448201527f2063616c6c2064656c6574655261746520696e73746561642e00000000000000606482015290519081900360840190fd5b848181518110151561142457fe5b90602001906020020151600160e060020a0319167f7355534400000000000000000000000000000000000000000000000000000000141515156114d7576040805160e560020a62461bcd02815260206004820152603160248201527f52617465206f6620735553442063616e6e6f7420626520757064617465642c2060448201527f6974277320616c7761797320554e49542e000000000000000000000000000000606482015290519081900360840190fd5b6005600086838151811015156114e957fe5b6020908102909101810151600160e060020a03191682528101919091526040016000205483106115a557838181518110151561152157fe5b9060200190602002015160046000878481518110151561153d57fe5b90602001906020020151600160e060020a031916600160e060020a0319168152602001908152602001600020819055508260056000878481518110151561158057fe5b6020908102909101810151600160e060020a0319168252810191909152604001600020555b600101611379565b7f7a72efae5f6b256f1ca71728b01f9dd7004ff3770dcaef4c44872b94d9f9e91b8585604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156116145781810151838201526020016115fc565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561165357818101518382015260200161163b565b5050505090500194505050505060405180910390a161167183611695565b506001949350505050565b60008282018381101561168e57600080fd5b9392505050565b6000806060805b6005831015611714576117078460046000600887600581106116ba57fe5b600891828204019190066004029054906101000a900460e060020a02600160e060020a031916600160e060020a03191681526020019081526020016000205461167c90919063ffffffff16565b935060019092019161169c565b7f58445200000000000000000000000000000000000000000000000000000000006000527fff1c33bb980e6507c2f1abbbb539f436519cfa198453007a4295f347e328ef6b84905560056020527fc6095f8ba0c30294f3d36501e92c5966cb30d5606d2b235ecebf5abd9fffed92859055604080516001808252818301909252908160200160208202803883390190505091507f58445200000000000000000000000000000000000000000000000000000000008260008151811015156117d757fe5b600160e060020a03199290921660209283029190910182015260408051600180825281830190925291828101908038833950507f5844520000000000000000000000000000000000000000000000000000000000600090815260046020527fff1c33bb980e6507c2f1abbbb539f436519cfa198453007a4295f347e328ef6b54835193945092849250811061186857fe5b90602001906020020181815250507f7a72efae5f6b256f1ca71728b01f9dd7004ff3770dcaef4c44872b94d9f9e91b8282604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156118dd5781810151838201526020016118c5565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561191c578181015183820152602001611904565b5050505090500194505050505060405180910390a1505050505056004f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6e0000000000000000000000000000000000a165627a7a723058206d2acb312f4828ef30c82a1d956131a57f4d89cff03a7d733617341f34f99cc400297a72efae5f6b256f1ca71728b01f9dd7004ff3770dcaef4c44872b94d9f9e91bff1c33bb980e6507c2f1abbbb539f436519cfa198453007a4295f347e328ef6b000000000000000000000000ea5e288b4f9d7e66da162e2af0db371783f62454000000000000000000000000ac1ed4fabbd5204e02950d68b6fc8c446ac95362000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001534e580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000002c68af0bb140000

Deployed Bytecode

0x6080604052600436106101455763ffffffff60e060020a6000350416630ee4951b811461014a5780631627540c1461017157806317c70de4146101945780631d2fed16146101a957806320714f88146101ec5780633278c9601461020d5780633608069414610222578063370d62ad1461024457806353a47bb7146102645780635dc2944a1461029557806379ba50971461033a57806379cb657a1461034f5780637adbf973146103675780637dc0d1d01461038857806389f8ab941461039d5780638da5cb5b146103f25780639cb8a26a14610407578063a461fc821461041c578063aa687daf14610431578063af1ff97214610466578063b8225dec14610488578063bd32aa441461049d578063c0e59e4d146104b2578063c58aaae6146104d4578063de5eb832146104e9578063e1686e721461050b578063ea3d41091461052d575b600080fd5b34801561015657600080fd5b5061015f61054f565b60408051918252519081900360200190f35b34801561017d57600080fd5b50610192600160a060020a0360043516610555565b005b3480156101a057600080fd5b5061015f61061a565b3480156101b557600080fd5b506101d86024600480358281019290820135918135918201910135604435610620565b604080519115158252519081900360200190f35b3480156101f857600080fd5b50610192600160a060020a0360043516610718565b34801561021957600080fd5b5061019261086b565b34801561022e57600080fd5b50610192600160e060020a031960043516610909565b34801561025057600080fd5b506101d86004803560248101910135610a5e565b34801561027057600080fd5b50610279610b22565b60408051600160a060020a039092168252519081900360200190f35b3480156102a157600080fd5b50604080516020600480358082013583810280860185019096528085526102ea95369593946024949385019291829185019084908082843750949750610b319650505050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561032657818101518382015260200161030e565b505050509050019250505060405180910390f35b34801561034657600080fd5b50610192610bd1565b34801561035b57600080fd5b50610192600435610cd9565b34801561037357600080fd5b50610192600160a060020a0360043516610d78565b34801561039457600080fd5b50610279610e43565b3480156103a957600080fd5b50604080516020600480358082013583810280860185019096528085526102ea95369593946024949385019291829185019084908082843750949750610e529650505050505050565b3480156103fe57600080fd5b50610279610ef2565b34801561041357600080fd5b50610192610f01565b34801561042857600080fd5b5061015f6110c6565b34801561043d57600080fd5b506104496004356110cd565b60408051600160e060020a03199092168252519081900360200190f35b34801561047257600080fd5b5061015f600160e060020a0319600435166110fa565b34801561049457600080fd5b506101d861111a565b3480156104a957600080fd5b50610192611123565b3480156104be57600080fd5b5061015f600160e060020a0319600435166111d0565b3480156104e057600080fd5b506102796111ec565b3480156104f557600080fd5b5061015f600160e060020a031960043516611200565b34801561051757600080fd5b5061015f600160e060020a031960043516611212565b34801561053957600080fd5b506101d8600160e060020a031960043516611224565b60075481565b600054600160a060020a031633146105b9576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b60018054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229181900360200190a150565b60025481565b600654600090600160a060020a031633146106ab576040805160e560020a62461bcd02815260206004820152602760248201527f4f6e6c7920746865206f7261636c652063616e20706572666f726d207468697360448201527f20616374696f6e00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b61070e8686808060200260200160405190810160405280939291908181526020018383602002808284375050604080516020808c0282810182019093528b82529095508b94508a9350839250850190849080828437508994506112969350505050565b9695505050505050565b600054600160a060020a0316331461077c576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b600160a060020a0381161515610802576040805160e560020a62461bcd02815260206004820152602860248201527f42656e6566696369617279206d757374206e6f7420626520746865207a65726f60448201527f2061646472657373000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60038054600160a060020a038316610100810274ffffffffffffffffffffffffffffffffffffffff00199092169190911790915560408051918252517fd5da63a0b864b315bc04128dedbc93888c8529ee6cf47ce664dc204339228c539181900360200190a150565b600054600160a060020a031633146108cf576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b600060028190556003805460ff191690556040517f6adcc7125002935e0aa31697538ebbd65cfddf20431eb6ecdcfc3e238bfd082c9190a1565b600654600160a060020a03163314610991576040805160e560020a62461bcd02815260206004820152602760248201527f4f6e6c7920746865206f7261636c652063616e20706572666f726d207468697360448201527f20616374696f6e00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160e060020a0319811660009081526004602052604081205411610a00576040805160e560020a62461bcd02815260206004820152600c60248201527f52617465206973207a65726f0000000000000000000000000000000000000000604482015290519081900360640190fd5b600160e060020a0319811660008181526004602090815260408083208390556005825280832092909255815192835290517f2cefb058ca1556b021b67f710e3df89c564650f01fef8cd944cbb14d7358680b9281900390910190a150565b6000805b82811015610b1657838382818110610a7657fe5b90506020020135600160e060020a031916600160e060020a0319167f735553440000000000000000000000000000000000000000000000000000000014158015610b00575042610afe600754600560008888878181101515610ad457fe5b60209081029290920135600160e060020a031916835250810191909152604001600020549061167c565b105b15610b0e5760019150610b1b565b600101610a62565b600091505b5092915050565b600154600160a060020a031681565b60608060008351604051908082528060200260200182016040528015610b61578160200160208202803883390190505b509150600090505b83518160ff161015610b1b5760046000858360ff16815181101515610b8a57fe5b6020908102909101810151600160e060020a0319168252810191909152604001600020548251839060ff8416908110610bbf57fe5b60209081029091010152600101610b69565b600154600160a060020a03163314610c59576040805160e560020a62461bcd02815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e6572736869700000000000000000000000606482015290519081900360840190fd5b60005460015460408051600160a060020a03938416815292909116602083015280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a1600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600054600160a060020a03163314610d3d576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b60078190556040805182815290517f16529d8c407b08938da67de7fa4319199baffce4f5d1971f812cc770b0237e669181900360200190a150565b600054600160a060020a03163314610ddc576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03838116919091179182905560408051929091168252517f3df77beb5db05fcdd70a30fc8adf3f83f9501b68579455adbd100b8180940394916020908290030190a150565b600654600160a060020a031681565b60608060008351604051908082528060200260200182016040528015610e82578160200160208202803883390190505b509150600090505b83518160ff161015610b1b5760056000858360ff16815181101515610eab57fe5b6020908102909101810151600160e060020a0319168252810191909152604001600020548251839060ff8416908110610ee057fe5b60209081029091010152600101610e8a565b600054600160a060020a031681565b60008054600160a060020a03163314610f66576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b60035460ff161515610fe8576040805160e560020a62461bcd02815260206004820152602860248201527f53656c6620646573747275637420686173206e6f7420796574206265656e206960448201527f6e69746961746564000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b426224ea006002540110151561106e576040805160e560020a62461bcd02815260206004820152602760248201527f53656c662064657374727563742064656c617920686173206e6f74207965742060448201527f656c617073656400000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b5060035460408051600160a060020a0361010090930492909216808352905190917f8a09e1677ced846cb537dc2b172043bd05a1a81ad7e0033a7ef8ba762df990b7919081900360200190a180600160a060020a0316ff5b6224ea0081565b600881600581106110da57fe5b60089182820401919006600402915054906101000a900460e060020a0281565b600160e060020a031981166000908152600460205260409020545b919050565b60035460ff1681565b600054600160a060020a03163314611187576040805160e560020a62461bcd02815260206004820152602f60248201526000805160206119398339815191526044820152600080516020611959833981519152606482015290519081900360840190fd5b426002556003805460ff19166001179055604080516224ea00815290517fcbd94ca75b8dc45c9d80c77e851670e78843c0d75180cb81db3e2158228fa9a69181900360200190a1565b600160e060020a03191660009081526005602052604090205490565b6003546101009004600160a060020a031681565b60046020526000908152604090205481565b60056020526000908152604090205481565b60007f7355534400000000000000000000000000000000000000000000000000000000600160e060020a03198316141561126057506000611115565b600754600160e060020a03198316600090815260056020526040902054429161128f919063ffffffff61167c16565b1092915050565b6000808351855114151561131a576040805160e560020a62461bcd02815260206004820152603860248201527f43757272656e6379206b6579206172726179206c656e677468206d757374206d60448201527f61746368207261746573206172726179206c656e6774682e0000000000000000606482015290519081900360840190fd5b42610258018310611375576040805160e560020a62461bcd02815260206004820152601f60248201527f54696d6520697320746f6f2066617220696e746f207468652066757475726500604482015290519081900360640190fd5b5060005b84518110156115ad57838181518110151561139057fe5b602090810290910101511515611416576040805160e560020a62461bcd02815260206004820152603960248201527f5a65726f206973206e6f7420612076616c696420726174652c20706c6561736560448201527f2063616c6c2064656c6574655261746520696e73746561642e00000000000000606482015290519081900360840190fd5b848181518110151561142457fe5b90602001906020020151600160e060020a0319167f7355534400000000000000000000000000000000000000000000000000000000141515156114d7576040805160e560020a62461bcd02815260206004820152603160248201527f52617465206f6620735553442063616e6e6f7420626520757064617465642c2060448201527f6974277320616c7761797320554e49542e000000000000000000000000000000606482015290519081900360840190fd5b6005600086838151811015156114e957fe5b6020908102909101810151600160e060020a03191682528101919091526040016000205483106115a557838181518110151561152157fe5b9060200190602002015160046000878481518110151561153d57fe5b90602001906020020151600160e060020a031916600160e060020a0319168152602001908152602001600020819055508260056000878481518110151561158057fe5b6020908102909101810151600160e060020a0319168252810191909152604001600020555b600101611379565b7f7a72efae5f6b256f1ca71728b01f9dd7004ff3770dcaef4c44872b94d9f9e91b8585604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156116145781810151838201526020016115fc565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561165357818101518382015260200161163b565b5050505090500194505050505060405180910390a161167183611695565b506001949350505050565b60008282018381101561168e57600080fd5b9392505050565b6000806060805b6005831015611714576117078460046000600887600581106116ba57fe5b600891828204019190066004029054906101000a900460e060020a02600160e060020a031916600160e060020a03191681526020019081526020016000205461167c90919063ffffffff16565b935060019092019161169c565b7f58445200000000000000000000000000000000000000000000000000000000006000527fff1c33bb980e6507c2f1abbbb539f436519cfa198453007a4295f347e328ef6b84905560056020527fc6095f8ba0c30294f3d36501e92c5966cb30d5606d2b235ecebf5abd9fffed92859055604080516001808252818301909252908160200160208202803883390190505091507f58445200000000000000000000000000000000000000000000000000000000008260008151811015156117d757fe5b600160e060020a03199290921660209283029190910182015260408051600180825281830190925291828101908038833950507f5844520000000000000000000000000000000000000000000000000000000000600090815260046020527fff1c33bb980e6507c2f1abbbb539f436519cfa198453007a4295f347e328ef6b54835193945092849250811061186857fe5b90602001906020020181815250507f7a72efae5f6b256f1ca71728b01f9dd7004ff3770dcaef4c44872b94d9f9e91b8282604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156118dd5781810151838201526020016118c5565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561191c578181015183820152602001611904565b5050505090500194505050505060405180910390a1505050505056004f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6e0000000000000000000000000000000000a165627a7a723058206d2acb312f4828ef30c82a1d956131a57f4d89cff03a7d733617341f34f99cc40029

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

000000000000000000000000ea5e288b4f9d7e66da162e2af0db371783f62454000000000000000000000000ac1ed4fabbd5204e02950d68b6fc8c446ac95362000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001534e580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000002c68af0bb140000

-----Decoded View---------------
Arg [0] : _owner (address): 0xeA5e288b4f9d7e66DA162E2Af0dB371783f62454
Arg [1] : _oracle (address): 0xaC1ED4Fabbd5204E02950D68b6FC8c446AC95362
Arg [2] : _currencyKeys (bytes4[]): System.Byte[]
Arg [3] : _newRates (uint256[]): 200000000000000000

-----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


Libraries Used


Swarm Source

bzzr://6d2acb312f4828ef30c82a1d956131a57f4d89cff03a7d733617341f34f99cc4

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

The legacy address for Synthetix: Exchange Rates contract.

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.