Contract 0xb671F2210B1F6621A2607EA63E6B2DC3e2464d1F

 
Ad
Ad
Txn Hash
Block
From
To
Value
0xdaa78865bda1e49b55c876d02f01c26b9f0e7618ce6b82de40842c3628973df9(pending)2021-04-11 14:41:374 hrs 49 mins ago0xc7dc2eebca9bc10af7fbe88195ffcbd3db45479d IN Synthetix: Reward Escrow0 Ether(Pending)(Pending)
0xea1c5d440fb7cc5306246a7322e5056db429ae2acb9fcb1bf7dfb376a7b15719116563122021-01-15 0:06:2686 days 19 hrs ago0xc97b329d36049f5b990ea25ba1b4e7b67af7e5c6 IN  Synthetix: Reward Escrow0 Ether0.01144431101
0x25e81249a7c5c00944a58e8052d07bd0e3da45180f7b3374b0e48f6bd1fb3004116561732021-01-14 23:37:0686 days 19 hrs ago0x44da9392802f9aa90db1dea5cb11a1983322d80f IN  Synthetix: Reward Escrow0 Ether0.0047504745
0x37429acd3670d90e49d48eef34009caaa35eed60f040aa3ec3905c4c566dba0f116561552021-01-14 23:33:0586 days 19 hrs ago0x52e0b17cc061d1ff9bbf986ef2408a660a2d30ab IN  Synthetix: Reward Escrow0 Ether0.005987365654.2
0xb6f8efaff5d5319755b2c4c2522ab961f83d6a7689a1cf0754b159827df3e94b116560372021-01-14 23:02:3386 days 20 hrs ago0x6fdabcd4c1b926310f5a8c4c00efefba3c8dbef4 IN  Synthetix: Reward Escrow0 Ether0.0078843640
0xcd25cd6e1ca34cf8b6129a3a4093ac8a29a41daa1e12e015f49bf8df3e67a283116559712021-01-14 22:49:1786 days 20 hrs ago0xdf7c04c309d77dc561d7eae8997772f5910f41f4 IN  Synthetix: Reward Escrow0 Ether0.00344816535
0x0015dc16ab479d5e22ef369b8040ff89e45e5762cbb8bc3c7e88ad4d19681345116559712021-01-14 22:49:1786 days 20 hrs ago0x50405e24f98c9f96870aa1730029a527b906c968 IN  Synthetix: Reward Escrow0 Ether0.00353278836
0x454a5c4e218f30fdce070c2f1a619168beab33140fa09dd163208c45f282e6d6116559112021-01-14 22:34:0186 days 20 hrs ago0x2b5146cb8d2b59d53f33e0f45ac18a514da5587f IN  Synthetix: Reward Escrow0 Ether0.00440520535
0x8e0427b3bb423e51e2bb00aed8bdf1a1f24587a8ae2911e1a1f4bc692147b61f116558602021-01-14 22:22:5286 days 21 hrs ago0x8133a5dcba30387e88b8dd3b782797ae00defcc0 IN  Synthetix: Reward Escrow0 Ether0.004381240
0x48c92d889f9cd33ef970bfdc660d48cfe25ea2adee368bc87623a17896dc9200116556232021-01-14 21:27:4986 days 22 hrs ago0x467a54491b885ac859662135fe0e2e7e99060339 IN  Synthetix: Reward Escrow0 Ether0.00891417357
0xa200c494b7b44b6b3a9c99a833815176a1453dddf3a6b3b16ae5053025d9af52116554602021-01-14 20:50:1486 days 22 hrs ago0x890ae53155a2465d9f9ff603a746cbf04e7fb98e IN  Synthetix: Reward Escrow0 Ether0.00577118139
0x47c51897986d2168f74155cd1434d19bd7df7f80397b880117bb860eb258b0e3116553632021-01-14 20:30:5286 days 23 hrs ago0xa5dc032e85875d3434efd4cd486e73ea066b95fc IN  Synthetix: Reward Escrow0 Ether0.0070514570
0x6545aa623c36eedcde7138dc07d9bf89591189b7b25fa2e9ae6ed488b36637cb116550812021-01-14 19:27:4387 days 3 mins ago0x27d360cd6d45ee4093389c60f515a723f67809a2 IN  Synthetix: Reward Escrow0 Ether0.00991701461
0xad96a1ccf490a670e4440a673821cc046d5c30ad03630fee54526f6696815062116547842021-01-14 18:17:0287 days 1 hr ago0x4e2f73102dc06c8e32b3a3318d18fa64cf42ca69 IN  Synthetix: Reward Escrow0 Ether0.00778262173.5
0x6fe6a5119737cf84805b6d636e816a4a1987aa6eafe0e8c8bc3b1c443a8cf058116547842021-01-14 18:17:0287 days 1 hr ago0x4e2f73102dc06c8e32b3a3318d18fa64cf42ca69 IN  Synthetix: Reward Escrow0 Ether0.01071631567
0x774be4554b4973b1317afc1166d058736241433f4b2d250886ff0c2dd51f018a116545472021-01-14 17:23:2187 days 2 hrs ago0x467a54491b885ac859662135fe0e2e7e99060339 IN  Synthetix: Reward Escrow0 Ether0.01622214108
0xcca831d6d8b95b2d9bd828022239ddbb29a6b953803757773de30321614a6165116543782021-01-14 16:48:5287 days 2 hrs ago0xfa088e1f6691a4de186b6486a3266687019cf916 IN  Synthetix: Reward Escrow0 Ether0.008874568485.1
0x1db4268035838d027c7b74b5453b3952dfbbb072684f92fdb05efbe65193fc2e116541982021-01-14 16:12:3987 days 3 hrs ago0x3432f2e175b57c904058a90528201280414ecce7 IN  Synthetix: Reward Escrow0 Ether0.03015537185
0x4aee782984a286906ce3233012e69a35d464d25eb5f73c234b718cfb5bbdff9b116540162021-01-14 15:30:1387 days 4 hrs ago0x4952f5dde00a0677365e42d33bcc5a8abd4e2b43 IN  Synthetix: Reward Escrow0 Ether0.025530056136
0x4375d210e5e79230c3bca61721a96c5610e9d55bc4652a77bb701fa62d0a2697116536162021-01-14 13:59:0187 days 5 hrs ago0x51064197a20a4b1b8ba92b747f4b56d6759fcfce IN  Synthetix: Reward Escrow0 Ether0.00951890197
0x54c19dc86b70b5ed068d7bb6c9b5b48e10d1a1945e3f27978fb5d44f3f05dbf1116534222021-01-14 13:15:1387 days 6 hrs ago0x8281dc42ba251bfe66eb372f8f2dd1d1c2ea7b3b IN  Synthetix: Reward Escrow0 Ether0.0213972268
0x8d9740c62b766d16ec6ad4e7a675478bc1865e3dda2a13c991283fd5e526a2e7116533492021-01-14 12:56:3787 days 6 hrs ago0x96107e5b992475d3862e7faa5450d4dbf36e82dc IN  Synthetix: Reward Escrow0 Ether0.010966785
0x7d302ffdb4c55d4536d98c40016e82a3b4c5acd73973351199f1861fe364d144116529472021-01-14 11:27:3187 days 8 hrs ago0x35ce236e3f0ae287f161c4ac484c6b091bb70d69 IN  Synthetix: Reward Escrow0 Ether0.0049682550
0xfacc2ad025202aba265c6763554fe56821978404c3559642c48b662968015cc9116527182021-01-14 10:35:5287 days 8 hrs ago0x24435205eaf97df22b6f2a2463ba039497596ba4 IN  Synthetix: Reward Escrow0 Ether0.004522456146.1
0xa716d465ade6f749c5ca3c4c9c38a6f18598cf50e5c755a29d6029fa8ef6675c116527162021-01-14 10:35:4287 days 8 hrs ago0x691ce62a208b195accf54c39a98f1112c90046d1 IN  Synthetix: Reward Escrow0 Ether0.00876223458
[ Download CSV Export 

OVERVIEW

Escrows the SNX rewards from the inflationary supply awarded to users for staking their SNX and maintaining the c-ratio target.

SNX rewards are escrowed for 1 year from the claim date and users can call vest in 12 months time.

View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RewardEscrow

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 2019-05-02
*/

/* ===============================================
* 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);
}


contract IFeePool {
    address public FEE_ADDRESS;
    function amountReceivedFromExchange(uint value) external view returns (uint);
    function amountReceivedFromTransfer(uint value) external view returns (uint);
    function feePaid(bytes4 currencyKey, uint amount) external;
    function appendAccountIssuanceRecord(address account, uint lockedAmount, uint debtEntryIndex) external;
    function rewardsMinted(uint amount) external;
    function transferFeeIncurred(uint value) public view returns (uint);
}


contract ISynthetixState {
    // A struct for handing values associated with an individual user's debt position
    struct IssuanceData {
        // Percentage of the total debt owned at the time
        // of issuance. This number is modified by the global debt
        // delta array. You can figure out a user's exit price and
        // collateralisation ratio using a combination of their initial
        // debt and the slice of global debt delta which applies to them.
        uint initialDebtOwnership;
        // This lets us know when (in relative terms) the user entered
        // the debt pool so we can calculate their exit price and
        // collateralistion ratio
        uint debtEntryIndex;
    }

    uint[] public debtLedger;
    uint public issuanceRatio;
    mapping(address => IssuanceData) public issuanceData;

    function debtLedgerLength() external view returns (uint);
    function hasIssued(address account) external view returns (bool);
    function incrementTotalIssuerCount() external;
    function decrementTotalIssuerCount() external;
    function setCurrentIssuanceData(address account, uint initialDebtOwnership) external;
    function lastDebtLedgerEntry() external view returns (uint);
    function appendDebtLedgerValue(uint value) external;
    function clearIssuanceData(address account) external;
}


interface ISynth {
  function burn(address account, uint amount) external;
  function issue(address account, uint amount) external;
  function transfer(address to, uint value) public returns (bool);
  function triggerTokenFallbackIfNeeded(address sender, address recipient, uint amount) external;
  function transferFrom(address from, address to, uint value) public returns (bool);
}


/**
 * @title SynthetixEscrow interface
 */
interface ISynthetixEscrow {
    function balanceOf(address account) public view returns (uint);
    function appendVestingEntry(address account, uint quantity) public;
}


/**
 * @title ExchangeRates interface
 */
interface IExchangeRates {
    function effectiveValue(bytes4 sourceCurrencyKey, uint sourceAmount, bytes4 destinationCurrencyKey) public view returns (uint);

    function rateForCurrency(bytes4 currencyKey) public view returns (uint);

    function anyRateIsStale(bytes4[] currencyKeys) external view returns (bool);

    function rateIsStale(bytes4 currencyKey) external view returns (bool);
}


/**
 * @title Synthetix interface contract
 * @dev pseudo interface, actually declared as contract to hold the public getters 
 */


contract ISynthetix {

    // ========== PUBLIC STATE VARIABLES ==========

    IFeePool public feePool;
    ISynthetixEscrow public escrow;
    ISynthetixEscrow public rewardEscrow;
    ISynthetixState public synthetixState;
    IExchangeRates public exchangeRates;

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

    function balanceOf(address account) public view returns (uint);
    function transfer(address to, uint value) public returns (bool);
    function effectiveValue(bytes4 sourceCurrencyKey, uint sourceAmount, bytes4 destinationCurrencyKey) public view returns (uint);

    function synthInitiatedFeePayment(address from, bytes4 sourceCurrencyKey, uint sourceAmount) external returns (bool);
    function synthInitiatedExchange(
        address from,
        bytes4 sourceCurrencyKey,
        uint sourceAmount,
        bytes4 destinationCurrencyKey,
        address destinationAddress) external returns (bool);
    function collateralisationRatio(address issuer) public view returns (uint);
    function totalIssuedSynths(bytes4 currencyKey)
        public
        view
        returns (uint);
    function getSynth(bytes4 currencyKey) public view returns (ISynth);
    function debtBalanceOf(address issuer, bytes4 currencyKey) public view returns (uint);
}


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

file:       RewardEscrow.sol
version:    1.0
author:     Jackson Chan
            Clinton Ennis

date:       2019-03-01

-----------------------------------------------------------------
MODULE DESCRIPTION
-----------------------------------------------------------------
Escrows the SNX rewards from the inflationary supply awarded to
users for staking their SNX and maintaining the c-rationn target.

SNW rewards are escrowed for 1 year from the claim date and users
can call vest in 12 months time.
-----------------------------------------------------------------
*/


/**
 * @title A contract to hold escrowed SNX and free them at given schedules.
 */
contract RewardEscrow is Owned {

    using SafeMath for uint;

    /* The corresponding Synthetix contract. */
    ISynthetix public synthetix;

    IFeePool public feePool;

    /* Lists of (timestamp, quantity) pairs per account, sorted in ascending time order.
     * These are the times at which each given quantity of SNX vests. */
    mapping(address => uint[2][]) public vestingSchedules;

    /* An account's total escrowed synthetix balance to save recomputing this for fee extraction purposes. */
    mapping(address => uint) public totalEscrowedAccountBalance;

    /* An account's total vested reward synthetix. */
    mapping(address => uint) public totalVestedAccountBalance;

    /* The total remaining escrowed balance, for verifying the actual synthetix balance of this contract against. */
    uint public totalEscrowedBalance;

    uint constant TIME_INDEX = 0;
    uint constant QUANTITY_INDEX = 1;

    /* Limit vesting entries to disallow unbounded iteration over vesting schedules.
    * There are 5 years of the supply scedule */
    uint constant public MAX_VESTING_ENTRIES = 52*5;


    /* ========== CONSTRUCTOR ========== */

    constructor(address _owner, ISynthetix _synthetix, IFeePool _feePool)
    Owned(_owner)
    public
    {
        synthetix = _synthetix;
        feePool = _feePool;
    }


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

    /**
     * @notice set the synthetix contract address as we need to transfer SNX when the user vests
     */
    function setSynthetix(ISynthetix _synthetix)
    external
    onlyOwner
    {
        synthetix = _synthetix;
        emit SynthetixUpdated(_synthetix);
    }

    /**
     * @notice set the FeePool contract as it is the only authority to be able to call
     * appendVestingEntry with the onlyFeePool modifer
     */
    function setFeePool(IFeePool _feePool)
        external
        onlyOwner
    {
        feePool = _feePool;
        emit FeePoolUpdated(_feePool);
    }


    /* ========== VIEW FUNCTIONS ========== */

    /**
     * @notice A simple alias to totalEscrowedAccountBalance: provides ERC20 balance integration.
     */
    function balanceOf(address account)
    public
    view
    returns (uint)
    {
        return totalEscrowedAccountBalance[account];
    }

    /**
     * @notice The number of vesting dates in an account's schedule.
     */
    function numVestingEntries(address account)
    public
    view
    returns (uint)
    {
        return vestingSchedules[account].length;
    }

    /**
     * @notice Get a particular schedule entry for an account.
     * @return A pair of uints: (timestamp, synthetix quantity).
     */
    function getVestingScheduleEntry(address account, uint index)
    public
    view
    returns (uint[2])
    {
        return vestingSchedules[account][index];
    }

    /**
     * @notice Get the time at which a given schedule entry will vest.
     */
    function getVestingTime(address account, uint index)
    public
    view
    returns (uint)
    {
        return getVestingScheduleEntry(account,index)[TIME_INDEX];
    }

    /**
     * @notice Get the quantity of SNX associated with a given schedule entry.
     */
    function getVestingQuantity(address account, uint index)
    public
    view
    returns (uint)
    {
        return getVestingScheduleEntry(account,index)[QUANTITY_INDEX];
    }

    /**
     * @notice Obtain the index of the next schedule entry that will vest for a given user.
     */
    function getNextVestingIndex(address account)
    public
    view
    returns (uint)
    {
        uint len = numVestingEntries(account);
        for (uint i = 0; i < len; i++) {
            if (getVestingTime(account, i) != 0) {
                return i;
            }
        }
        return len;
    }

    /**
     * @notice Obtain the next schedule entry that will vest for a given user.
     * @return A pair of uints: (timestamp, synthetix quantity). */
    function getNextVestingEntry(address account)
    public
    view
    returns (uint[2])
    {
        uint index = getNextVestingIndex(account);
        if (index == numVestingEntries(account)) {
            return [uint(0), 0];
        }
        return getVestingScheduleEntry(account, index);
    }

    /**
     * @notice Obtain the time at which the next schedule entry will vest for a given user.
     */
    function getNextVestingTime(address account)
    external
    view
    returns (uint)
    {
        return getNextVestingEntry(account)[TIME_INDEX];
    }

    /**
     * @notice Obtain the quantity which the next schedule entry will vest for a given user.
     */
    function getNextVestingQuantity(address account)
    external
    view
    returns (uint)
    {
        return getNextVestingEntry(account)[QUANTITY_INDEX];
    }

    /**
     * @notice return the full vesting schedule entries vest for a given user.
     */
    function checkAccountSchedule(address account)
        public
        view
        returns (uint[520])
    {
        uint[520] memory _result;
        uint schedules = numVestingEntries(account);
        for (uint i = 0; i < schedules; i++) {
            uint[2] memory pair = getVestingScheduleEntry(account, i);
            _result[i*2] = pair[0];
            _result[i*2 + 1] = pair[1];
        }
        return _result;
    }


    /* ========== MUTATIVE FUNCTIONS ========== */

    /**
     * @notice Add a new vesting entry at a given time and quantity to an account's schedule.
     * @dev A call to this should accompany a previous successfull call to synthetix.transfer(tewardEscrow, amount),
     * to ensure that when the funds are withdrawn, there is enough balance.
     * Note; although this function could technically be used to produce unbounded
     * arrays, it's only withinn the 4 year period of the weekly inflation schedule.
     * @param account The account to append a new vesting entry to.
     * @param quantity The quantity of SNX that will be escrowed.
     */
    function appendVestingEntry(address account, uint quantity)
    public
    onlyFeePool
    {
        /* No empty or already-passed vesting entries allowed. */
        require(quantity != 0, "Quantity cannot be zero");

        /* There must be enough balance in the contract to provide for the vesting entry. */
        totalEscrowedBalance = totalEscrowedBalance.add(quantity);
        require(totalEscrowedBalance <= synthetix.balanceOf(this), "Must be enough balance in the contract to provide for the vesting entry");

        /* Disallow arbitrarily long vesting schedules in light of the gas limit. */
        uint scheduleLength = vestingSchedules[account].length;
        require(scheduleLength <= MAX_VESTING_ENTRIES, "Vesting schedule is too long");

        /* Escrow the tokens for 1 year. */
        uint time = now + 52 weeks;

        if (scheduleLength == 0) {
            totalEscrowedAccountBalance[account] = quantity;
        } else {
            /* Disallow adding new vested SNX earlier than the last one.
             * Since entries are only appended, this means that no vesting date can be repeated. */
            require(getVestingTime(account, numVestingEntries(account) - 1) < time, "Cannot add new vested entries earlier than the last one");
            totalEscrowedAccountBalance[account] = totalEscrowedAccountBalance[account].add(quantity);
        }

        vestingSchedules[account].push([time, quantity]);

        emit VestingEntryCreated(account, now, quantity);
    }

    /**
     * @notice Allow a user to withdraw any SNX in their schedule that have vested.
     */
    function vest()
    external
    {
        uint numEntries = numVestingEntries(msg.sender);
        uint total;
        for (uint i = 0; i < numEntries; i++) {
            uint time = getVestingTime(msg.sender, i);
            /* The list is sorted; when we reach the first future time, bail out. */
            if (time > now) {
                break;
            }
            uint qty = getVestingQuantity(msg.sender, i);
            if (qty == 0) {
                continue;
            }

            vestingSchedules[msg.sender][i] = [0, 0];
            total = total.add(qty);
        }

        if (total != 0) {
            totalEscrowedBalance = totalEscrowedBalance.sub(total);
            totalEscrowedAccountBalance[msg.sender] = totalEscrowedAccountBalance[msg.sender].sub(total);
            totalVestedAccountBalance[msg.sender] = totalVestedAccountBalance[msg.sender].add(total);
            synthetix.transfer(msg.sender, total);
            emit Vested(msg.sender, now, total);
        }
    }

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

    modifier onlyFeePool() {
        bool isFeePool = msg.sender == address(feePool);

        require(isFeePool, "Only the FeePool contracts can perform this action");
        _;
    }


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

    event SynthetixUpdated(address newSynthetix);

    event FeePoolUpdated(address newFeePool);

    event Vested(address indexed beneficiary, uint time, uint value);

    event VestingEntryCreated(address indexed beneficiary, uint time, uint value);

}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_feePool","type":"address"}],"name":"setFeePool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"getNextVestingIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"numVestingEntries","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"totalVestedAccountBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"getNextVestingEntry","outputs":[{"name":"","type":"uint256[2]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"totalEscrowedAccountBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"checkAccountSchedule","outputs":[{"name":"","type":"uint256[520]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"vest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"vestingSchedules","outputs":[{"name":"","type":"uint256"}],"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":"account","type":"address"}],"name":"getNextVestingTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalEscrowedBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"synthetix","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"getNextVestingQuantity","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"},{"name":"index","type":"uint256"}],"name":"getVestingTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feePool","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"quantity","type":"uint256"}],"name":"appendVestingEntry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MAX_VESTING_ENTRIES","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"},{"name":"index","type":"uint256"}],"name":"getVestingScheduleEntry","outputs":[{"name":"","type":"uint256[2]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"},{"name":"index","type":"uint256"}],"name":"getVestingQuantity","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_synthetix","type":"address"}],"name":"setSynthetix","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_owner","type":"address"},{"name":"_synthetix","type":"address"},{"name":"_feePool","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newSynthetix","type":"address"}],"name":"SynthetixUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newFeePool","type":"address"}],"name":"FeePoolUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"time","type":"uint256"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Vested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"time","type":"uint256"},{"indexed":false,"name":"value","type":"uint256"}],"name":"VestingEntryCreated","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"}]

608060405234801561001057600080fd5b5060405160608061140183398101604090815281516020830151919092015182600160a060020a03811615156100a757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f74206265203000000000000000604482015290519081900360640190fd5b60008054600160a060020a031916600160a060020a038316908117825560408051928352602083019190915280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a15060028054600160a060020a03938416600160a060020a03199182161790915560038054929093169116179055506112c58061013c6000396000f3006080604052600436106101485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631627540c811461014d57806319db22281461017057806319e740c014610191578063204b676a146101c4578063227d517a146101e55780632f5bb66114610206578063326a3cfb14610262578063449d0eb114610283578063458efde3146102ba57806345e5441f146102cf57806353a47bb7146102f65780636b3905c41461032757806370a082311461034857806371e780f314610369578063759b52251461037e57806379ba5097146103935780638da5cb5b146103a857806397f46527146103bd5780639b217f90146103de578063ae2e933b14610402578063b5ddb9c714610417578063d0cc82e31461043b578063da7bd3e914610450578063ee1d036c14610474578063fec9f9da14610498575b600080fd5b34801561015957600080fd5b5061016e600160a060020a03600435166104b9565b005b34801561017c57600080fd5b5061016e600160a060020a03600435166105a2565b34801561019d57600080fd5b506101b2600160a060020a036004351661068b565b60408051918252519081900360200190f35b3480156101d057600080fd5b506101b2600160a060020a03600435166106d2565b3480156101f157600080fd5b506101b2600160a060020a03600435166106ed565b34801561021257600080fd5b50610227600160a060020a03600435166106ff565b6040518082600260200280838360005b8381101561024f578181015183820152602001610237565b5050505090500191505060405180910390f35b34801561026e57600080fd5b506101b2600160a060020a0360043516610752565b34801561028f57600080fd5b506102a4600160a060020a0360043516610764565b6040518151815280826141008083836020610237565b3480156102c657600080fd5b5061016e6107f0565b3480156102db57600080fd5b506101b2600160a060020a03600435166024356044356109fd565b34801561030257600080fd5b5061030b610a3d565b60408051600160a060020a039092168252519081900360200190f35b34801561033357600080fd5b506101b2600160a060020a0360043516610a4c565b34801561035457600080fd5b506101b2600160a060020a0360043516610a65565b34801561037557600080fd5b506101b2610a80565b34801561038a57600080fd5b5061030b610a86565b34801561039f57600080fd5b5061016e610a95565b3480156103b457600080fd5b5061030b610b9d565b3480156103c957600080fd5b506101b2600160a060020a0360043516610bac565b3480156103ea57600080fd5b506101b2600160a060020a0360043516602435610bbe565b34801561040e57600080fd5b5061030b610bd9565b34801561042357600080fd5b5061016e600160a060020a0360043516602435610be8565b34801561044757600080fd5b506101b261102e565b34801561045c57600080fd5b50610227600160a060020a0360043516602435611034565b34801561048057600080fd5b506101b2600160a060020a03600435166024356110a3565b3480156104a457600080fd5b5061016e600160a060020a03600435166110b6565b600054600160a060020a03163314610541576040805160e560020a62461bcd02815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201527f6f726d207468697320616374696f6e0000000000000000000000000000000000606482015290519081900360840190fd5b60018054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229181900360200190a150565b600054600160a060020a0316331461062a576040805160e560020a62461bcd02815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201527f6f726d207468697320616374696f6e0000000000000000000000000000000000606482015290519081900360840190fd5b60038054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f6d1d088acfe4f30d6014f6f693c61c16258f9784a6ed8439b2c59213eecb62959181900360200190a150565b6000806000610699846106d2565b9150600090505b818110156106c7576106b28482610bbe565b156106bf578092506106cb565b6001016106a0565b8192505b5050919050565b600160a060020a031660009081526004602052604090205490565b60066020526000908152604090205481565b6107076111cf565b60006107128361068b565b905061071d836106d2565b81141561073f576040805180820190915260008082526020820152915061074c565b6107498382611034565b91505b50919050565b60056020526000908152604090205481565b61076c6111ea565b6107746111ea565b60008061077f6111cf565b610788866106d2565b9250600091505b828210156107e6576107a18683611034565b8051909150846002840261020881106107b657fe5b60200201528060016020020151846001600285020161020881106107d657fe5b602002015260019091019061078f565b5091949350505050565b6000806000806000610801336106d2565b9450600092505b848310156108a95761081a3384610bbe565b915042821115610829576108a9565b61083333846110a3565b90508015156108415761089e565b60408051808201825260008082526020808301829052338252600490529190912080548590811061086e57fe5b906000526020600020906002020190600261088a92919061120b565b5061089b848263ffffffff61119f16565b93505b600190920191610808565b83156109f6576007546108c2908563ffffffff6111b816565b600755336000908152600560205260409020546108e5908563ffffffff6111b816565b33600090815260056020908152604080832093909355600690522054610911908563ffffffff61119f16565b3360008181526006602090815260408083209490945560025484517fa9059cbb0000000000000000000000000000000000000000000000000000000081526004810194909452602484018990529351600160a060020a039094169363a9059cbb93604480820194918390030190829087803b15801561098f57600080fd5b505af11580156109a3573d6000803e3d6000fd5b505050506040513d60208110156109b957600080fd5b50506040805142815260208101869052815133927ffbeff59d2bfda0d79ea8a29f8c57c66d48c7a13eabbdb90908d9115ec41c9dc6928290030190a25b5050505050565b600460205282600052604060002082815481101515610a1857fe5b906000526020600020906002020181600281101515610a3357fe5b0154925083915050565b600154600160a060020a031681565b6000610a57826106ff565b60005b602002015192915050565b600160a060020a031660009081526005602052604090205490565b60075481565b600254600160a060020a031681565b600154600160a060020a03163314610b1d576040805160e560020a62461bcd02815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e6572736869700000000000000000000000606482015290519081900360840190fd5b60005460015460408051600160a060020a03938416815292909116602083015280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a1600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600054600160a060020a031681565b6000610bb7826106ff565b6001610a5a565b6000610bca8383611034565b60005b60200201519392505050565b600354600160a060020a031681565b6003546000908190600160a060020a0316331480610c76576040805160e560020a62461bcd02815260206004820152603260248201527f4f6e6c792074686520466565506f6f6c20636f6e7472616374732063616e207060448201527f6572666f726d207468697320616374696f6e0000000000000000000000000000606482015290519081900360840190fd5b831515610ccd576040805160e560020a62461bcd02815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f000000000000000000604482015290519081900360640190fd5b600754610ce0908563ffffffff61119f16565b600755600254604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b158015610d4957600080fd5b505af1158015610d5d573d6000803e3d6000fd5b505050506040513d6020811015610d7357600080fd5b50516007541115610e1a576040805160e560020a62461bcd02815260206004820152604760248201527f4d75737420626520656e6f7567682062616c616e636520696e2074686520636f60448201527f6e747261637420746f2070726f7669646520666f72207468652076657374696e60648201527f6720656e74727900000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b600160a060020a0385166000908152600460205260409020549250610104831115610e8f576040805160e560020a62461bcd02815260206004820152601c60248201527f56657374696e67207363686564756c6520697320746f6f206c6f6e6700000000604482015290519081900360640190fd5b6301dfe20042019150821515610ebf57600160a060020a0385166000908152600560205260409020849055610f93565b81610ed5866001610ecf896106d2565b03610bbe565b10610f50576040805160e560020a62461bcd02815260206004820152603760248201527f43616e6e6f7420616464206e65772076657374656420656e747269657320656160448201527f726c696572207468616e20746865206c617374206f6e65000000000000000000606482015290519081900360840190fd5b600160a060020a038516600090815260056020526040902054610f79908563ffffffff61119f16565b600160a060020a0386166000908152600560205260409020555b600160a060020a0385166000908152600460209081526040808320815180830190925285825281830188905280546001810180835591855292909320610fe2926002908102909101919061124e565b505060408051428152602081018690528151600160a060020a038816927fedd34dc5a5ea12bd847909801d0660781b50e26c7f4cec3c7b308f1ea410635c928290030190a25050505050565b61010481565b61103c6111cf565b600160a060020a038316600090815260046020526040902080548390811061106057fe5b600091825260209091206040805180820191829052926002908102909201919082845b815481526020019060010190808311611083575050505050905092915050565b60006110af8383611034565b6001610bcd565b600054600160a060020a0316331461113e576040805160e560020a62461bcd02815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201527f6f726d207468697320616374696f6e0000000000000000000000000000000000606482015290519081900360840190fd5b60028054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f46e9c68bd7831071bdd478f1ae4c4a52463961a9d620383a0a121dbfc0e0f06d9181900360200190a150565b6000828201838110156111b157600080fd5b9392505050565b600080838311156111c857600080fd5b5050900390565b60408051808201825290600290829080388339509192915050565b61410060405190810160405280610208906020820280388339509192915050565b826002810192821561123e579160200282015b8281111561123e578251829060ff1690559160200191906001019061121e565b5061124a92915061127c565b5090565b826002810192821561123e579160200282015b8281111561123e578251825591602001919060010190611261565b61129691905b8082111561124a5760008155600101611282565b905600a165627a7a7230582015458fadb7d7d41b8bdffe105531a59f8ff6e82f316fc9edb3c0b0e1ae77ab4b0029000000000000000000000000b64ff7a4a33acdf48d97dab0d764afd0f617688200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

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

000000000000000000000000b64ff7a4a33acdf48d97dab0d764afd0f617688200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _owner (address): 0xb64ff7a4a33acdf48d97dab0d764afd0f6176882
Arg [1] : _synthetix (address): 0x0000000000000000000000000000000000000000
Arg [2] : _feePool (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000b64ff7a4a33acdf48d97dab0d764afd0f6176882
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000


Library Used

safedecimalmath : 0x84d626b2bb4d0f064067e4bf80fce7055d8f3e7b

Swarm Source

bzzr://15458fadb7d7d41b8bdffe105531a59f8ff6e82f316fc9edb3c0b0e1ae77ab4b
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.