ETH Price: $3,209.49 (+2.35%)

Contract

0xa64ED1b66Cb2838Ef2A198D8345c0ce6967A2A3c
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Redeem126497672021-06-17 4:26:271242 days ago1623903987IN
OlympusDAO: DAI Bond V1
0 ETH0.0007502717
Redeem125833192021-06-06 21:12:271253 days ago1623013947IN
OlympusDAO: DAI Bond V1
0 ETH0.0007061416
Redeem125815952021-06-06 14:48:391253 days ago1622990919IN
OlympusDAO: DAI Bond V1
0 ETH0.000529612
Redeem125815112021-06-06 14:32:451253 days ago1622989965IN
OlympusDAO: DAI Bond V1
0 ETH0.0009268121
Redeem125813642021-06-06 14:00:211253 days ago1622988021IN
OlympusDAO: DAI Bond V1
0 ETH0.0007061416
Redeem125791842021-06-06 6:05:371253 days ago1622959537IN
OlympusDAO: DAI Bond V1
0 ETH0.0004854711
Redeem125791782021-06-06 6:04:231253 days ago1622959463IN
OlympusDAO: DAI Bond V1
0 ETH0.0004854711
Redeem125789822021-06-06 5:16:541253 days ago1622956614IN
OlympusDAO: DAI Bond V1
0 ETH0.0011710513
Redeem125784912021-06-06 3:25:101253 days ago1622949910IN
OlympusDAO: DAI Bond V1
0 ETH0.0008628119.55000036
Redeem125771542021-06-05 22:37:191253 days ago1622932639IN
OlympusDAO: DAI Bond V1
0 ETH0.0017115319
Redeem125764882021-06-05 20:05:441254 days ago1622923544IN
OlympusDAO: DAI Bond V1
0 ETH0.0011710513
Redeem125748452021-06-05 14:02:141254 days ago1622901734IN
OlympusDAO: DAI Bond V1
0 ETH0.0016055822
Redeem125741002021-06-05 11:04:191254 days ago1622891059IN
OlympusDAO: DAI Bond V1
0 ETH0.0012406717
Redeem125738842021-06-05 10:14:051254 days ago1622888045IN
OlympusDAO: DAI Bond V1
0 ETH0.0009268121
Redeem125732782021-06-05 7:59:301254 days ago1622879970IN
OlympusDAO: DAI Bond V1
0 ETH0.0013866319
Redeem125732422021-06-05 7:52:111254 days ago1622879531IN
OlympusDAO: DAI Bond V1
0 ETH0.0008826820
Redeem125729412021-06-05 6:44:531254 days ago1622875493IN
OlympusDAO: DAI Bond V1
0 ETH0.0021619424
Redeem125725752021-06-05 5:20:231254 days ago1622870423IN
OlympusDAO: DAI Bond V1
0 ETH0.0011676916
Redeem125717262021-06-05 2:06:191254 days ago1622858779IN
OlympusDAO: DAI Bond V1
0 ETH0.0007061416
Redeem125707852021-06-04 22:44:401254 days ago1622846680IN
OlympusDAO: DAI Bond V1
0 ETH0.0021164429
Redeem125706442021-06-04 22:12:171255 days ago1622844737IN
OlympusDAO: DAI Bond V1
0 ETH0.0019817822
Redeem125703262021-06-04 20:56:371255 days ago1622840197IN
OlympusDAO: DAI Bond V1
0 ETH0.0022970625.5000016
Redeem125699712021-06-04 19:36:391255 days ago1622835399IN
OlympusDAO: DAI Bond V1
0 ETH0.0014596220
Redeem125685342021-06-04 14:32:421255 days ago1622817162IN
OlympusDAO: DAI Bond V1
0 ETH0.0026123429
Redeem125685162021-06-04 14:27:561255 days ago1622816876IN
OlympusDAO: DAI Bond V1
0 ETH0.0021164429
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:
OlympusDAIDepository

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-04-21
*/

// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;

interface IOwnable {

    function owner() external view returns (address);

    function renounceOwnership() external;
  
    function transferOwnership( address newOwner_ ) external;
}

contract Ownable is IOwnable {
    
    address internal _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () {
        _owner = msg.sender;
        emit OwnershipTransferred( address(0), _owner );
    }

    function owner() public view override returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require( _owner == msg.sender, "Ownable: caller is not the owner" );
        _;
    }

    function renounceOwnership() public virtual override onlyOwner() {
        emit OwnershipTransferred( _owner, address(0) );
        _owner = address(0);
    }

    function transferOwnership( address newOwner_ ) public virtual override onlyOwner() {
        require( newOwner_ != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred( _owner, newOwner_ );
        _owner = newOwner_;
    }
}

library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function sqrrt(uint256 a) internal pure returns (uint c) {
        if (a > 3) {
            c = a;
            uint b = add( div( a, 2), 1 );
            while (b < c) {
                c = b;
                b = div( add( div( a, b ), b), 2 );
            }
        } else if (a != 0) {
            c = 1;
        }
    }

    function percentageAmount( uint256 total_, uint8 percentage_ ) internal pure returns ( uint256 percentAmount_ ) {
        return div( mul( total_, percentage_ ), 1000 );
    }

    function substractPercentage( uint256 total_, uint8 percentageToSub_ ) internal pure returns ( uint256 result_ ) {
        return sub( total_, div( mul( total_, percentageToSub_ ), 1000 ) );
    }

    function percentageOfTotal( uint256 part_, uint256 total_ ) internal pure returns ( uint256 percent_ ) {
        return div( mul(part_, 100) , total_ );
    }

    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }

    function quadraticPricing( uint256 payment_, uint256 multiplier_ ) internal pure returns (uint256) {
        return sqrrt( mul( multiplier_, payment_ ) );
    }

  function bondingCurve( uint256 supply_, uint256 multiplier_ ) internal pure returns (uint256) {
      return mul( multiplier_, supply_ );
  }
}

library Address {

    function isContract(address account) internal view returns (bool) {

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }

    function addressToString(address _address) internal pure returns(string memory) {
        bytes32 _bytes = bytes32(uint256(_address));
        bytes memory HEX = "0123456789abcdef";
        bytes memory _addr = new bytes(42);

        _addr[0] = '0';
        _addr[1] = 'x';

        for(uint256 i = 0; i < 20; i++) {
            _addr[2+i*2] = HEX[uint8(_bytes[i + 12] >> 4)];
            _addr[3+i*2] = HEX[uint8(_bytes[i + 12] & 0x0f)];
        }

        return string(_addr);

    }
}

interface IERC20 {
    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

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

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

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

abstract contract ERC20 is IERC20 {

    using SafeMath for uint256;

    // TODO comment actual hash value.
    bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" );
    
    mapping (address => uint256) internal _balances;

    mapping (address => mapping (address => uint256)) internal _allowances;

    uint256 internal _totalSupply;

    string internal _name;
    
    string internal _symbol;
    
    uint8 internal _decimals;

    constructor (string memory name_, string memory symbol_, uint8 decimals_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view override returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account_, uint256 ammount_) internal virtual {
        require(account_ != address(0), "ERC20: mint to the zero address");
        _beforeTokenTransfer(address( this ), account_, ammount_);
        _totalSupply = _totalSupply.add(ammount_);
        _balances[account_] = _balances[account_].add(ammount_);
        emit Transfer(address( this ), account_, ammount_);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

  function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { }
}

interface IERC2612Permit {

    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function nonces(address owner) external view returns (uint256);
}

library Counters {
    using SafeMath for uint256;

    struct Counter {

        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

abstract contract ERC20Permit is ERC20, IERC2612Permit {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    bytes32 public DOMAIN_SEPARATOR;

    constructor() {
        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes(name())),
                keccak256(bytes("1")), // Version
                chainID,
                address(this)
            )
        );
    }

    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "Permit: expired deadline");

        bytes32 hashStruct =
            keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline));

        bytes32 _hash = keccak256(abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct));

        address signer = ecrecover(_hash, v, r, s);
        require(signer != address(0) && signer == owner, "ZeroSwapPermit: Invalid signature");

        _nonces[owner].increment();
        _approve(owner, spender, amount);
    }

    function nonces(address owner) public view override returns (uint256) {
        return _nonces[owner].current();
    }
}

library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {

        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

library FullMath {
    function fullMul(uint256 x, uint256 y) private pure returns (uint256 l, uint256 h) {
        uint256 mm = mulmod(x, y, uint256(-1));
        l = x * y;
        h = mm - l;
        if (mm < l) h -= 1;
    }

    function fullDiv(
        uint256 l,
        uint256 h,
        uint256 d
    ) private pure returns (uint256) {
        uint256 pow2 = d & -d;
        d /= pow2;
        l /= pow2;
        l += h * ((-pow2) / pow2 + 1);
        uint256 r = 1;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        return l * r;
    }

    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 d
    ) internal pure returns (uint256) {
        (uint256 l, uint256 h) = fullMul(x, y);
        uint256 mm = mulmod(x, y, d);
        if (mm > l) h -= 1;
        l -= mm;
        require(h < d, 'FullMath::mulDiv: overflow');
        return fullDiv(l, h, d);
    }
}

library FixedPoint {

    struct uq112x112 {
        uint224 _x;
    }

    struct uq144x112 {
        uint256 _x;
    }

    uint8 private constant RESOLUTION = 112;
    uint256 private constant Q112 = 0x10000000000000000000000000000;
    uint256 private constant Q224 = 0x100000000000000000000000000000000000000000000000000000000;
    uint256 private constant LOWER_MASK = 0xffffffffffffffffffffffffffff; // decimal of UQ*x112 (lower 112 bits)

    function decode(uq112x112 memory self) internal pure returns (uint112) {
        return uint112(self._x >> RESOLUTION);
    }

    function decode112with18(uq112x112 memory self) internal pure returns (uint) {

        return uint(self._x) / 5192296858534827;
    }

    function fraction(uint256 numerator, uint256 denominator) internal pure returns (uq112x112 memory) {
        require(denominator > 0, 'FixedPoint::fraction: division by zero');
        if (numerator == 0) return FixedPoint.uq112x112(0);

        if (numerator <= uint144(-1)) {
            uint256 result = (numerator << RESOLUTION) / denominator;
            require(result <= uint224(-1), 'FixedPoint::fraction: overflow');
            return uq112x112(uint224(result));
        } else {
            uint256 result = FullMath.mulDiv(numerator, Q112, denominator);
            require(result <= uint224(-1), 'FixedPoint::fraction: overflow');
            return uq112x112(uint224(result));
        }
    }
}

interface ITreasury {
    function depositReserves( uint depositAmount_ ) external returns ( bool );
}

interface ICirculatingOHM {
    function OHMCirculatingSupply() external view returns ( uint );
}

interface IBondDepo {

    function getDepositorInfo( address _depositorAddress_ ) external view returns ( uint principleValue_, uint paidOut_, uint maxPayout, uint vestingPeriod_ );
    
    function deposit( uint256 amount_, uint maxPremium_, address depositor_ ) external returns ( bool );

    function depositWithPermit( uint256 amount_, uint maxPremium_, address depositor_, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external returns ( bool );

    function redeem() external returns ( bool );

    function calculatePercentVested( address depositor_ ) external view returns ( uint _percentVested );
    
    function calculatePendingPayout( address depositor_ ) external view returns ( uint _pendingPayout );
      
    function calculateBondInterest( uint value_ ) external view returns ( uint _interestDue );
        
    function calculatePremium() external view returns ( uint _premium );
}



contract OlympusDAIDepository is IBondDepo, Ownable {

    using FixedPoint for *;
    using SafeERC20 for IERC20;
    using SafeMath for uint;

    struct DepositInfo {
        uint value; // Value
        uint payoutRemaining; // OHM remaining to be paid
        uint lastBlock; // Last interaction
        uint vestingPeriod; // Blocks left to vest
    }

    mapping( address => DepositInfo ) public depositorInfo; 

    uint public DAOShare; // % = 1 / DAOShare
    uint public bondControlVariable; // Premium scaling variable
    uint public vestingPeriodInBlocks; 
    uint public minPremium; // Floor for the premium

    //  Max a payout can be compared to the circulating supply, in hundreths. i.e. 50 = 0.5%
    uint public maxPayoutPercent;

    address public treasury;
    address public DAI;
    address public OHM;

    uint256 public totalDebt; // Total value of outstanding bonds

    address public stakingContract;
    address public DAOWallet;
    address public circulatingOHMContract; // calculates circulating supply

    bool public useCircForDebtRatio; // Use circulating or total supply to calc total debt

    constructor ( 
        address DAI_, 
        address OHM_,
        address treasury_, 
        address stakingContract_, 
        address DAOWallet_, 
        address circulatingOHMContract_
    ) {
        DAI = DAI_;
        OHM = OHM_;
        treasury = treasury_;
        stakingContract = stakingContract_;
        DAOWallet = DAOWallet_;
        circulatingOHMContract = circulatingOHMContract_;
    }

    /**
        @notice set parameters of new bonds
        @param bondControlVariable_ uint
        @param vestingPeriodInBlocks_ uint
        @param minPremium_ uint
        @param maxPayout_ uint
        @param DAOShare_ uint
        @return bool
     */
    function setBondTerms( 
        uint bondControlVariable_, 
        uint vestingPeriodInBlocks_, 
        uint minPremium_, 
        uint maxPayout_,
        uint DAOShare_ ) 
    external onlyOwner() returns ( bool ) {
        bondControlVariable = bondControlVariable_;
        vestingPeriodInBlocks = vestingPeriodInBlocks_;
        minPremium = minPremium_;
        maxPayoutPercent = maxPayout_;
        DAOShare = DAOShare_;
        return true;
    }

    /**
        @notice deposit bond
        @param amount_ uint
        @param maxPremium_ uint
        @param depositor_ address
        @return bool
     */
    function deposit( 
        uint amount_, 
        uint maxPremium_,
        address depositor_ ) 
    external override returns ( bool ) {
        _deposit( amount_, maxPremium_, depositor_ ) ;
        return true;
    }

    /**
        @notice deposit bond with permit
        @param amount_ uint
        @param maxPremium_ uint
        @param depositor_ address
        @param v uint8
        @param r bytes32
        @param s bytes32
        @return bool
     */
    function depositWithPermit( 
        uint amount_, 
        uint maxPremium_,
        address depositor_, 
        uint deadline, 
        uint8 v, 
        bytes32 r, 
        bytes32 s ) 
    external override returns ( bool ) {
        ERC20Permit( DAI ).permit( msg.sender, address(this), amount_, deadline, v, r, s );
        _deposit( amount_, maxPremium_, depositor_ ) ;
        return true;
    }

    /**
        @notice deposit function like mint
        @param amount_ uint
        @param maxPremium_ uint
        @param depositor_ address
        @return bool
     */
    function _deposit( 
        uint amount_, 
        uint maxPremium_, 
        address depositor_ ) 
    internal returns ( bool ) {
        // slippage protection
        require( maxPremium_ >= _calcPremium(), "Slippage protection: more than max premium" );

        IERC20( DAI ).safeTransferFrom( msg.sender, address(this), amount_ );

        uint value_ = amount_.div( 1e9 );
        uint payout_ = calculateBondInterest( value_ );

        require( payout_ >= 10000000, "Bond too small" ); // must be > 0.01 OHM
        require( payout_ <= getMaxPayoutAmount(), "Bond too large");

        totalDebt = totalDebt.add( value_ );

        // Deposit token to mint OHM
        IERC20( DAI ).approve( address( treasury ), amount_ );
        ITreasury( treasury ).depositReserves( amount_ ); // Returns OHM

        uint profit_ = value_.sub( payout_ );
        uint DAOProfit_ = FixedPoint.fraction( profit_, DAOShare ).decode();
        // Transfer profits to staking distributor and dao
        IERC20( OHM ).safeTransfer( stakingContract, profit_.sub( DAOProfit_ ) );
        IERC20( OHM ).safeTransfer( DAOWallet, DAOProfit_ );

        // Store depositor info
        depositorInfo[ depositor_ ] = DepositInfo({
            value: depositorInfo[ depositor_ ].value.add( value_ ),
            payoutRemaining: depositorInfo[ depositor_ ].payoutRemaining.add( payout_ ),
            lastBlock: block.number,
            vestingPeriod: vestingPeriodInBlocks
        });
        return true;
    }

    /** 
        @notice redeem bond
        @return bool
     */ 
    function redeem() external override returns ( bool ) {
        uint payoutRemaining_ = depositorInfo[ msg.sender ].payoutRemaining;

        require( payoutRemaining_ > 0, "Sender is not due any interest." );

        uint value_ = depositorInfo[ msg.sender ].value;
        uint percentVested_ = _calculatePercentVested( msg.sender );

        if ( percentVested_ >= 10000 ) { // if fully vested
            delete depositorInfo[msg.sender];
            IERC20( OHM ).safeTransfer( msg.sender, payoutRemaining_ );
            totalDebt = totalDebt.sub( value_ );
            return true;
        }

        // calculate and send vested OHM
        uint payout_ = payoutRemaining_.mul( percentVested_ ).div( 10000 );
        IERC20( OHM ).safeTransfer( msg.sender, payout_ );

        // reduce total debt by vested amount
        uint valueUsed_ = value_.mul( percentVested_ ).div( 10000 );
        totalDebt = totalDebt.sub( valueUsed_ );

        uint vestingPeriod_ = depositorInfo[msg.sender].vestingPeriod;
        uint blocksSinceLast_ = block.number.sub( depositorInfo[ msg.sender ].lastBlock );

        // store updated deposit info
        depositorInfo[msg.sender] = DepositInfo({
            value: value_.sub( valueUsed_ ),
            payoutRemaining: payoutRemaining_.sub( payout_ ),
            lastBlock: block.number,
            vestingPeriod: vestingPeriod_.sub( blocksSinceLast_ )
        });
        return true;
    }

    /**
        @notice get info of depositor
        @param address_ info
     */
    function getDepositorInfo( address address_ ) external view override returns ( 
        uint _value, 
        uint _payoutRemaining, 
        uint _lastBlock, 
        uint _vestingPeriod ) 
    {
        DepositInfo memory info = depositorInfo[ address_ ];
        _value = info.value;
        _payoutRemaining = info.payoutRemaining;
        _lastBlock = info.lastBlock;
        _vestingPeriod = info.vestingPeriod;
    }

    /**
        @notice set contract to use circulating or total supply to calc debt
     */
    function toggleUseCircForDebtRatio() external onlyOwner() returns ( bool ) {
        useCircForDebtRatio = !useCircForDebtRatio;
        return true;
    }

    /**
        @notice use maxPayoutPercent to determine maximum bond available
        @return uint
     */
    function getMaxPayoutAmount() public view returns ( uint ) {
        uint circulatingOHM = ICirculatingOHM( circulatingOHMContract ).OHMCirculatingSupply();

        uint maxPayout = circulatingOHM.mul( maxPayoutPercent ).div( 10000 );

        return maxPayout;
    }

    /**
        @notice view function for _calculatePercentVested
        @param depositor_ address
        @return _percentVested uint
     */
    function calculatePercentVested( address depositor_ ) external view override returns ( uint _percentVested ) {
        _percentVested = _calculatePercentVested( depositor_ );
    }

    /**
        @notice calculate how far into vesting period depositor is
        @param depositor_ address
        @return _percentVested uint ( in hundreths - i.e. 10 = 0.1% )
     */
    function _calculatePercentVested( address depositor_ ) internal view returns ( uint _percentVested ) {
        uint vestingPeriod_ = depositorInfo[ depositor_ ].vestingPeriod;
        if ( vestingPeriod_ > 0 ) {
            uint blocksSinceLast_ = block.number.sub( depositorInfo[ depositor_ ].lastBlock );
            _percentVested = blocksSinceLast_.mul( 10000 ).div( vestingPeriod_ );
        } else {
            _percentVested = 0;
        }
    }

    /**
        @notice calculate amount of OHM available for claim by depositor
        @param depositor_ address
        @return uint
     */
    function calculatePendingPayout( address depositor_ ) external view override returns ( uint ) {
        uint percentVested_ = _calculatePercentVested( depositor_ );
        uint payoutRemaining_ = depositorInfo[ depositor_ ].payoutRemaining;
        
        uint pendingPayout = payoutRemaining_.mul( percentVested_ ).div( 10000 );

        if ( percentVested_ >= 10000 ) {
            pendingPayout = payoutRemaining_;
        } 
        return pendingPayout;
    }

    /**
        @notice calculate interest due to new bonder
        @param value_ uint
        @return _interestDue uint
     */
    function calculateBondInterest( uint value_ ) public view override returns ( uint _interestDue ) {
        _interestDue = FixedPoint.fraction( value_, _calcPremium() ).decode112with18().div( 1e16 );
    }

    /**
        @notice view function for _calcPremium()
        @return _premium uint
     */
    function calculatePremium() external view override returns ( uint _premium ) {
        _premium = _calcPremium();
    }

    /**
        @notice calculate current bond premium
        @return _premium uint
     */
    function _calcPremium() internal view returns ( uint _premium ) {
        _premium = bondControlVariable.mul( _calcDebtRatio() ).add( uint(1000000000) ).div( 1e7 );
        if ( _premium < minPremium ) {
            _premium = minPremium;
        }
    }

    /**
        @notice calculate current debt ratio
        @return _debtRatio uint
     */
    function _calcDebtRatio() internal view returns ( uint _debtRatio ) {   
        uint supply;

        if( useCircForDebtRatio ) {
            supply = ICirculatingOHM( circulatingOHMContract ).OHMCirculatingSupply();
        } else {
            supply = IERC20( OHM ).totalSupply();
        }

        _debtRatio = FixedPoint.fraction( 
            // Must move the decimal to the right by 9 places to avoid math underflow error
            totalDebt.mul( 1e9 ), 
            supply
        ).decode112with18().div( 1e18 );
        // Must move the decimal to the left 18 places to account for the 9 places added above and the 19 signnificant digits added by FixedPoint.
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"DAI_","type":"address"},{"internalType":"address","name":"OHM_","type":"address"},{"internalType":"address","name":"treasury_","type":"address"},{"internalType":"address","name":"stakingContract_","type":"address"},{"internalType":"address","name":"DAOWallet_","type":"address"},{"internalType":"address","name":"circulatingOHMContract_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"DAI","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAOShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAOWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OHM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondControlVariable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value_","type":"uint256"}],"name":"calculateBondInterest","outputs":[{"internalType":"uint256","name":"_interestDue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"depositor_","type":"address"}],"name":"calculatePendingPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"depositor_","type":"address"}],"name":"calculatePercentVested","outputs":[{"internalType":"uint256","name":"_percentVested","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculatePremium","outputs":[{"internalType":"uint256","name":"_premium","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingOHMContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"maxPremium_","type":"uint256"},{"internalType":"address","name":"depositor_","type":"address"}],"name":"deposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"maxPremium_","type":"uint256"},{"internalType":"address","name":"depositor_","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"depositWithPermit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositorInfo","outputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"payoutRemaining","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"},{"internalType":"uint256","name":"vestingPeriod","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"getDepositorInfo","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_payoutRemaining","type":"uint256"},{"internalType":"uint256","name":"_lastBlock","type":"uint256"},{"internalType":"uint256","name":"_vestingPeriod","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxPayoutAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayoutPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minPremium","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redeem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bondControlVariable_","type":"uint256"},{"internalType":"uint256","name":"vestingPeriodInBlocks_","type":"uint256"},{"internalType":"uint256","name":"minPremium_","type":"uint256"},{"internalType":"uint256","name":"maxPayout_","type":"uint256"},{"internalType":"uint256","name":"DAOShare_","type":"uint256"}],"name":"setBondTerms","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleUseCircForDebtRatio","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useCircForDebtRatio","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingPeriodInBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b50604051611b88380380611b88833981810160405260c081101561003357600080fd5b50805160208201516040808401516060850151608086015160a090960151600080546001600160a01b031916331780825594519697959693959294929391926001600160a01b0316917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600880546001600160a01b03199081166001600160a01b03988916179091556009805482169688169690961790955560078054861694871694909417909355600b8054851692861692909217909155600c80548416918516919091179055600d80549092169216919091179055611a6b8061011d6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063b7cc6af9116100f9578063e08a01b411610097578063eedb9ed511610071578063eedb9ed51461041c578063f2fde38b14610424578063f9f705b31461044a578063fc7b9c1814610452576101c4565b8063e08a01b4146103ef578063e0bab4c41461040c578063ee99205c14610414576101c4565b8063cd3a2a3c116100d3578063cd3a2a3c146103cf578063da6b5ab0146103d7578063dd6ab09a146103df578063dfdb5ae4146103e7576101c4565b8063b7cc6af914610399578063be040fb0146103a1578063c2ed626f146103a9576101c4565b806361d027b31161016657806384508ca91161014057806384508ca9146103225780638da5cb5b146103575780638dbdbe6d1461035f578063a6c41fec14610391576101c4565b806361d027b3146102ec57806363e45c8614610310578063715018a614610318576101c4565b80633496f017116101a25780633496f017146102885780633a709d22146102905780633d19d66b1461029857806361cb2175146102e4576101c4565b80631bf6ba9f146101c95780632273ee6e1461020157806322d6357a14610262575b600080fd5b6101ef600480360360208110156101df57600080fd5b50356001600160a01b031661045a565b60408051918252519081900360200190f35b61024e600480360360e081101561021757600080fd5b508035906020810135906001600160a01b036040820135169060608101359060ff6080820135169060a08101359060c0013561046b565b604080519115158252519081900360200190f35b6101ef6004803603602081101561027857600080fd5b50356001600160a01b0316610513565b6101ef61056a565b6101ef610570565b6102be600480360360208110156102ae57600080fd5b50356001600160a01b031661057f565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6101ef6105a7565b6102f46105ad565b604080516001600160a01b039092168252519081900360200190f35b61024e6105bc565b610320610630565b005b61024e600480360360a081101561033857600080fd5b50803590602081013590604081013590606081013590608001356106c7565b6102f4610730565b61024e6004803603606081101561037557600080fd5b50803590602081013590604001356001600160a01b031661073f565b6102f4610757565b61024e610766565b61024e610776565b6102be600480360360208110156103bf57600080fd5b50356001600160a01b031661095a565b6101ef6109c1565b6101ef6109c7565b6101ef6109cd565b6102f4610a6d565b6101ef6004803603602081101561040557600080fd5b5035610a7c565b6102f4610aa2565b6102f4610ab1565b6101ef610ac0565b6103206004803603602081101561043a57600080fd5b50356001600160a01b0316610ac6565b6102f4610bb3565b6101ef610bc2565b600061046582610bc8565b92915050565b6008546040805163d505accf60e01b8152336004820152306024820152604481018a90526064810187905260ff8616608482015260a4810185905260c4810184905290516000926001600160a01b03169163d505accf9160e4808301928692919082900301818387803b1580156104e157600080fd5b505af11580156104f5573d6000803e3d6000fd5b50505050610504888888610c36565b50600198975050505050505050565b60008061051f83610bc8565b6001600160a01b03841660009081526001602081905260408220015491925061055461271061054e8486610f90565b90610ff0565b905061271083106105625750805b949350505050565b60065481565b600061057a611032565b905090565b6001602081905260009182526040909120805491810154600282015460039092015490919084565b60025481565b6007546001600160a01b031681565b600080546001600160a01b0316331461060a576040805162461bcd60e51b815260206004820181905260248201526000805160206119c2833981519152604482015290519081900360640190fd5b50600d805460ff60a01b198116600160a01b9182900460ff161590910217905560015b90565b6000546001600160a01b0316331461067d576040805162461bcd60e51b815260206004820181905260248201526000805160206119c2833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600080546001600160a01b03163314610715576040805162461bcd60e51b815260206004820181905260248201526000805160206119c2833981519152604482015290519081900360640190fd5b50600394909455600492909255600555600655600255600190565b6000546001600160a01b031690565b600061074c848484610c36565b506001949350505050565b6009546001600160a01b031681565b600d54600160a01b900460ff1681565b33600090815260016020819052604082200154806107db576040805162461bcd60e51b815260206004820152601f60248201527f53656e646572206973206e6f742064756520616e7920696e7465726573742e00604482015290519081900360640190fd5b33600081815260016020526040812054916107f590610bc8565b9050612710811061085b573360008181526001602081905260408220828155908101829055600281018290556003015560095461083e916001600160a01b039091169085611070565b600a5461084b90836110c7565b600a55506001925061062d915050565b600061086d61271061054e8685610f90565b600954909150610887906001600160a01b03163383611070565b600061089961271061054e8686610f90565b600a549091506108a990826110c7565b600a5533600090815260016020526040812060038101546002909101549091906108d49043906110c7565b905060405180608001604052806108f485896110c790919063ffffffff16565b815260200161090389876110c7565b815243602082015260400161091884846110c7565b90523360009081526001602081815260409283902084518155908401518183015591830151600283015560609092015160039091015597505050505050505090565b60008060008061096861191a565b505050506001600160a01b03919091166000908152600160208181526040928390208351608081018552815480825293820154928101839052600282015494810185905260039091015460609091018190529194909350565b60045481565b60035481565b600080600d60009054906101000a90046001600160a01b03166001600160a01b0316632e1455626040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1e57600080fd5b505afa158015610a32573d6000803e3d6000fd5b505050506040513d6020811015610a4857600080fd5b5051600654909150600090610a66906127109061054e908590610f90565b9250505090565b600c546001600160a01b031681565b6000610465662386f26fc1000061054e610a9d85610a98611032565b611109565b611280565b6008546001600160a01b031681565b600b546001600160a01b031681565b60055481565b6000546001600160a01b03163314610b13576040805162461bcd60e51b815260206004820181905260248201526000805160206119c2833981519152604482015290519081900360640190fd5b6001600160a01b038116610b585760405162461bcd60e51b81526004018080602001828103825260268152602001806119556026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600d546001600160a01b031681565b600a5481565b6001600160a01b0381166000908152600160205260408120600301548015610c2b576001600160a01b038316600090815260016020526040812060020154610c119043906110c7565b9050610c238261054e83612710610f90565b925050610c30565b600091505b50919050565b6000610c40611032565b831015610c7e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806119e2602a913960400191505060405180910390fd5b600854610c96906001600160a01b0316333087611298565b6000610ca685633b9aca00610ff0565b90506000610cb382610a7c565b905062989680811015610cfe576040805162461bcd60e51b815260206004820152600e60248201526d109bdb99081d1bdbc81cdb585b1b60921b604482015290519081900360640190fd5b610d066109cd565b811115610d4b576040805162461bcd60e51b815260206004820152600e60248201526d426f6e6420746f6f206c6172676560901b604482015290519081900360640190fd5b600a54610d5890836112f8565b600a556008546007546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018a90529051919092169163095ea7b39160448083019260209291908290030181600087803b158015610db457600080fd5b505af1158015610dc8573d6000803e3d6000fd5b505050506040513d6020811015610dde57600080fd5b505060075460408051637750446f60e01b81526004810189905290516001600160a01b0390921691637750446f916024808201926020929091908290030181600087803b158015610e2e57600080fd5b505af1158015610e42573d6000803e3d6000fd5b505050506040513d6020811015610e5857600080fd5b5060009050610e6783836110c7565b90506000610e7f610e7a83600254611109565b611352565b600b546001600160701b03919091169150610eba906001600160a01b0316610ea784846110c7565b6009546001600160a01b03169190611070565b600c54600954610ed7916001600160a01b03918216911683611070565b604080516080810182526001600160a01b0388166000908152600160205291909120548190610f0690876112f8565b81526001600160a01b03881660009081526001602081815260409092200154910190610f3290866112f8565b8152436020808301919091526004546040928301526001600160a01b03891660009081526001808352908390208451815591840151828201559183015160028201556060909201516003909201919091559450505050509392505050565b600082610f9f57506000610465565b82820282848281610fac57fe5b0414610fe95760405162461bcd60e51b81526004018080602001828103825260218152602001806119a16021913960400191505060405180910390fd5b9392505050565b6000610fe983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611362565b600061105d6298968061054e633b9aca0061105761104e611404565b60035490610f90565b906112f8565b905060055481101561062d575060055490565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526110c2908490611550565b505050565b6000610fe983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611601565b611111611942565b600082116111505760405162461bcd60e51b815260040180806020018281038252602681526020018061197b6026913960400191505060405180910390fd5b8261116a5750604080516020810190915260008152610465565b71ffffffffffffffffffffffffffffffffffff831161121157600082607085901b8161119257fe5b0490506001600160e01b038111156111f1576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b6040518060200160405280826001600160e01b0316815250915050610465565b600061122284600160701b8561165b565b90506001600160e01b038111156111f1576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b516612725dd1d243ab6001600160e01b039091160490565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526112f2908590611550565b50505050565b600082820183811015610fe9576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b5160701c6001600160701b031690565b600081836113ee5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156113b357818101518382015260200161139b565b50505050905090810190601f1680156113e05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816113fa57fe5b0495945050505050565b600d546000908190600160a01b900460ff161561149c57600d60009054906101000a90046001600160a01b03166001600160a01b0316632e1455626040518163ffffffff1660e01b815260040160206040518083038186803b15801561146957600080fd5b505afa15801561147d573d6000803e3d6000fd5b505050506040513d602081101561149357600080fd5b50519050611519565b600960009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114ea57600080fd5b505afa1580156114fe573d6000803e3d6000fd5b505050506040513d602081101561151457600080fd5b505190505b61154a670de0b6b3a764000061054e610a9d611544633b9aca00600a54610f9090919063ffffffff16565b85611109565b91505090565b60606115a5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116fb9092919063ffffffff16565b8051909150156110c2578080602001905160208110156115c457600080fd5b50516110c25760405162461bcd60e51b815260040180806020018281038252602a815260200180611a0c602a913960400191505060405180910390fd5b600081848411156116535760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156113b357818101518382015260200161139b565b505050900390565b600080600061166a868661170a565b915091506000848061167857fe5b86880990508281111561168c576001820391505b80830392508482106116e5576040805162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f77000000000000604482015290519081900360640190fd5b6116f0838387611737565b979650505050505050565b606061056284846000856117a7565b600080806000198486099050838502925082810391508281101561172f576001820391505b509250929050565b6000818103821680838161174757fe5b04925080858161175357fe5b04945080816000038161176257fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b60606117b285611914565b611803576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106118425780518252601f199092019160209182019101611823565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146118a4576040519150601f19603f3d011682016040523d82523d6000602084013e6118a9565b606091505b509150915081156118bd5791506105629050565b8051156118cd5780518082602001fd5b60405162461bcd60e51b81526020600482018181528651602484015286518793919283926044019190850190808383600083156113b357818101518382015260200161139b565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040805160208101909152600081529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572536c6970706167652070726f74656374696f6e3a206d6f7265207468616e206d6178207072656d69756d5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220db9dd9a1ee9f3b8523f981fb94d38881f2d98e34b29468471bcfa491e8a853ee64736f6c634300070500330000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a899000000000000000000000000886ce997aa9ee4f8c2282e182ab72a705762399d000000000000000000000000be731507810c8747c3e01e62c676b1ca6f93242f000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b0000000000000000000000000efff9199aa1ac3c3e34e957567c1be8bf295034

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063b7cc6af9116100f9578063e08a01b411610097578063eedb9ed511610071578063eedb9ed51461041c578063f2fde38b14610424578063f9f705b31461044a578063fc7b9c1814610452576101c4565b8063e08a01b4146103ef578063e0bab4c41461040c578063ee99205c14610414576101c4565b8063cd3a2a3c116100d3578063cd3a2a3c146103cf578063da6b5ab0146103d7578063dd6ab09a146103df578063dfdb5ae4146103e7576101c4565b8063b7cc6af914610399578063be040fb0146103a1578063c2ed626f146103a9576101c4565b806361d027b31161016657806384508ca91161014057806384508ca9146103225780638da5cb5b146103575780638dbdbe6d1461035f578063a6c41fec14610391576101c4565b806361d027b3146102ec57806363e45c8614610310578063715018a614610318576101c4565b80633496f017116101a25780633496f017146102885780633a709d22146102905780633d19d66b1461029857806361cb2175146102e4576101c4565b80631bf6ba9f146101c95780632273ee6e1461020157806322d6357a14610262575b600080fd5b6101ef600480360360208110156101df57600080fd5b50356001600160a01b031661045a565b60408051918252519081900360200190f35b61024e600480360360e081101561021757600080fd5b508035906020810135906001600160a01b036040820135169060608101359060ff6080820135169060a08101359060c0013561046b565b604080519115158252519081900360200190f35b6101ef6004803603602081101561027857600080fd5b50356001600160a01b0316610513565b6101ef61056a565b6101ef610570565b6102be600480360360208110156102ae57600080fd5b50356001600160a01b031661057f565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6101ef6105a7565b6102f46105ad565b604080516001600160a01b039092168252519081900360200190f35b61024e6105bc565b610320610630565b005b61024e600480360360a081101561033857600080fd5b50803590602081013590604081013590606081013590608001356106c7565b6102f4610730565b61024e6004803603606081101561037557600080fd5b50803590602081013590604001356001600160a01b031661073f565b6102f4610757565b61024e610766565b61024e610776565b6102be600480360360208110156103bf57600080fd5b50356001600160a01b031661095a565b6101ef6109c1565b6101ef6109c7565b6101ef6109cd565b6102f4610a6d565b6101ef6004803603602081101561040557600080fd5b5035610a7c565b6102f4610aa2565b6102f4610ab1565b6101ef610ac0565b6103206004803603602081101561043a57600080fd5b50356001600160a01b0316610ac6565b6102f4610bb3565b6101ef610bc2565b600061046582610bc8565b92915050565b6008546040805163d505accf60e01b8152336004820152306024820152604481018a90526064810187905260ff8616608482015260a4810185905260c4810184905290516000926001600160a01b03169163d505accf9160e4808301928692919082900301818387803b1580156104e157600080fd5b505af11580156104f5573d6000803e3d6000fd5b50505050610504888888610c36565b50600198975050505050505050565b60008061051f83610bc8565b6001600160a01b03841660009081526001602081905260408220015491925061055461271061054e8486610f90565b90610ff0565b905061271083106105625750805b949350505050565b60065481565b600061057a611032565b905090565b6001602081905260009182526040909120805491810154600282015460039092015490919084565b60025481565b6007546001600160a01b031681565b600080546001600160a01b0316331461060a576040805162461bcd60e51b815260206004820181905260248201526000805160206119c2833981519152604482015290519081900360640190fd5b50600d805460ff60a01b198116600160a01b9182900460ff161590910217905560015b90565b6000546001600160a01b0316331461067d576040805162461bcd60e51b815260206004820181905260248201526000805160206119c2833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600080546001600160a01b03163314610715576040805162461bcd60e51b815260206004820181905260248201526000805160206119c2833981519152604482015290519081900360640190fd5b50600394909455600492909255600555600655600255600190565b6000546001600160a01b031690565b600061074c848484610c36565b506001949350505050565b6009546001600160a01b031681565b600d54600160a01b900460ff1681565b33600090815260016020819052604082200154806107db576040805162461bcd60e51b815260206004820152601f60248201527f53656e646572206973206e6f742064756520616e7920696e7465726573742e00604482015290519081900360640190fd5b33600081815260016020526040812054916107f590610bc8565b9050612710811061085b573360008181526001602081905260408220828155908101829055600281018290556003015560095461083e916001600160a01b039091169085611070565b600a5461084b90836110c7565b600a55506001925061062d915050565b600061086d61271061054e8685610f90565b600954909150610887906001600160a01b03163383611070565b600061089961271061054e8686610f90565b600a549091506108a990826110c7565b600a5533600090815260016020526040812060038101546002909101549091906108d49043906110c7565b905060405180608001604052806108f485896110c790919063ffffffff16565b815260200161090389876110c7565b815243602082015260400161091884846110c7565b90523360009081526001602081815260409283902084518155908401518183015591830151600283015560609092015160039091015597505050505050505090565b60008060008061096861191a565b505050506001600160a01b03919091166000908152600160208181526040928390208351608081018552815480825293820154928101839052600282015494810185905260039091015460609091018190529194909350565b60045481565b60035481565b600080600d60009054906101000a90046001600160a01b03166001600160a01b0316632e1455626040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1e57600080fd5b505afa158015610a32573d6000803e3d6000fd5b505050506040513d6020811015610a4857600080fd5b5051600654909150600090610a66906127109061054e908590610f90565b9250505090565b600c546001600160a01b031681565b6000610465662386f26fc1000061054e610a9d85610a98611032565b611109565b611280565b6008546001600160a01b031681565b600b546001600160a01b031681565b60055481565b6000546001600160a01b03163314610b13576040805162461bcd60e51b815260206004820181905260248201526000805160206119c2833981519152604482015290519081900360640190fd5b6001600160a01b038116610b585760405162461bcd60e51b81526004018080602001828103825260268152602001806119556026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600d546001600160a01b031681565b600a5481565b6001600160a01b0381166000908152600160205260408120600301548015610c2b576001600160a01b038316600090815260016020526040812060020154610c119043906110c7565b9050610c238261054e83612710610f90565b925050610c30565b600091505b50919050565b6000610c40611032565b831015610c7e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806119e2602a913960400191505060405180910390fd5b600854610c96906001600160a01b0316333087611298565b6000610ca685633b9aca00610ff0565b90506000610cb382610a7c565b905062989680811015610cfe576040805162461bcd60e51b815260206004820152600e60248201526d109bdb99081d1bdbc81cdb585b1b60921b604482015290519081900360640190fd5b610d066109cd565b811115610d4b576040805162461bcd60e51b815260206004820152600e60248201526d426f6e6420746f6f206c6172676560901b604482015290519081900360640190fd5b600a54610d5890836112f8565b600a556008546007546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018a90529051919092169163095ea7b39160448083019260209291908290030181600087803b158015610db457600080fd5b505af1158015610dc8573d6000803e3d6000fd5b505050506040513d6020811015610dde57600080fd5b505060075460408051637750446f60e01b81526004810189905290516001600160a01b0390921691637750446f916024808201926020929091908290030181600087803b158015610e2e57600080fd5b505af1158015610e42573d6000803e3d6000fd5b505050506040513d6020811015610e5857600080fd5b5060009050610e6783836110c7565b90506000610e7f610e7a83600254611109565b611352565b600b546001600160701b03919091169150610eba906001600160a01b0316610ea784846110c7565b6009546001600160a01b03169190611070565b600c54600954610ed7916001600160a01b03918216911683611070565b604080516080810182526001600160a01b0388166000908152600160205291909120548190610f0690876112f8565b81526001600160a01b03881660009081526001602081815260409092200154910190610f3290866112f8565b8152436020808301919091526004546040928301526001600160a01b03891660009081526001808352908390208451815591840151828201559183015160028201556060909201516003909201919091559450505050509392505050565b600082610f9f57506000610465565b82820282848281610fac57fe5b0414610fe95760405162461bcd60e51b81526004018080602001828103825260218152602001806119a16021913960400191505060405180910390fd5b9392505050565b6000610fe983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611362565b600061105d6298968061054e633b9aca0061105761104e611404565b60035490610f90565b906112f8565b905060055481101561062d575060055490565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526110c2908490611550565b505050565b6000610fe983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611601565b611111611942565b600082116111505760405162461bcd60e51b815260040180806020018281038252602681526020018061197b6026913960400191505060405180910390fd5b8261116a5750604080516020810190915260008152610465565b71ffffffffffffffffffffffffffffffffffff831161121157600082607085901b8161119257fe5b0490506001600160e01b038111156111f1576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b6040518060200160405280826001600160e01b0316815250915050610465565b600061122284600160701b8561165b565b90506001600160e01b038111156111f1576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b516612725dd1d243ab6001600160e01b039091160490565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526112f2908590611550565b50505050565b600082820183811015610fe9576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b5160701c6001600160701b031690565b600081836113ee5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156113b357818101518382015260200161139b565b50505050905090810190601f1680156113e05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816113fa57fe5b0495945050505050565b600d546000908190600160a01b900460ff161561149c57600d60009054906101000a90046001600160a01b03166001600160a01b0316632e1455626040518163ffffffff1660e01b815260040160206040518083038186803b15801561146957600080fd5b505afa15801561147d573d6000803e3d6000fd5b505050506040513d602081101561149357600080fd5b50519050611519565b600960009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114ea57600080fd5b505afa1580156114fe573d6000803e3d6000fd5b505050506040513d602081101561151457600080fd5b505190505b61154a670de0b6b3a764000061054e610a9d611544633b9aca00600a54610f9090919063ffffffff16565b85611109565b91505090565b60606115a5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116fb9092919063ffffffff16565b8051909150156110c2578080602001905160208110156115c457600080fd5b50516110c25760405162461bcd60e51b815260040180806020018281038252602a815260200180611a0c602a913960400191505060405180910390fd5b600081848411156116535760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156113b357818101518382015260200161139b565b505050900390565b600080600061166a868661170a565b915091506000848061167857fe5b86880990508281111561168c576001820391505b80830392508482106116e5576040805162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f77000000000000604482015290519081900360640190fd5b6116f0838387611737565b979650505050505050565b606061056284846000856117a7565b600080806000198486099050838502925082810391508281101561172f576001820391505b509250929050565b6000818103821680838161174757fe5b04925080858161175357fe5b04945080816000038161176257fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b60606117b285611914565b611803576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106118425780518252601f199092019160209182019101611823565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146118a4576040519150601f19603f3d011682016040523d82523d6000602084013e6118a9565b606091505b509150915081156118bd5791506105629050565b8051156118cd5780518082602001fd5b60405162461bcd60e51b81526020600482018181528651602484015286518793919283926044019190850190808383600083156113b357818101518382015260200161139b565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040805160208101909152600081529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572536c6970706167652070726f74656374696f6e3a206d6f7265207468616e206d6178207072656d69756d5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220db9dd9a1ee9f3b8523f981fb94d38881f2d98e34b29468471bcfa491e8a853ee64736f6c63430007050033

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

0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a899000000000000000000000000886ce997aa9ee4f8c2282e182ab72a705762399d000000000000000000000000be731507810c8747c3e01e62c676b1ca6f93242f000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b0000000000000000000000000efff9199aa1ac3c3e34e957567c1be8bf295034

-----Decoded View---------------
Arg [0] : DAI_ (address): 0x6B175474E89094C44Da98b954EedeAC495271d0F
Arg [1] : OHM_ (address): 0x383518188C0C6d7730D91b2c03a03C837814a899
Arg [2] : treasury_ (address): 0x886CE997aa9ee4F8c2282E182aB72A705762399D
Arg [3] : stakingContract_ (address): 0xbe731507810C8747C3E01E62c676b1cA6F93242f
Arg [4] : DAOWallet_ (address): 0x245cc372C84B3645Bf0Ffe6538620B04a217988B
Arg [5] : circulatingOHMContract_ (address): 0x0EFFf9199Aa1Ac3C3E34E957567C1BE8bF295034

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [1] : 000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a899
Arg [2] : 000000000000000000000000886ce997aa9ee4f8c2282e182ab72a705762399d
Arg [3] : 000000000000000000000000be731507810c8747c3e01e62c676b1ca6f93242f
Arg [4] : 000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b
Arg [5] : 0000000000000000000000000efff9199aa1ac3c3e34e957567c1be8bf295034


Deployed Bytecode Sourcemap

22540:11263:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30584:182;;;;;;;;;;;;;;;;-1:-1:-1;30584:182:0;-1:-1:-1;;;;;30584:182:0;;:::i;:::-;;;;;;;;;;;;;;;;25546:416;;;;;;;;;;;;;;;;-1:-1:-1;25546:416:0;;;;;;;;-1:-1:-1;;;;;25546:416:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;31584:477;;;;;;;;;;;;;;;;-1:-1:-1;31584:477:0;-1:-1:-1;;;;;31584:477:0;;:::i;23284:28::-;;;:::i;32517:121::-;;;:::i;22916:54::-;;;;;;;;;;;;;;;;-1:-1:-1;22916:54:0;-1:-1:-1;;;;;22916:54:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22980:20;;;:::i;23321:23::-;;;:::i;:::-;;;;-1:-1:-1;;;;;23321:23:0;;;;;;;;;;;;;;29873:158;;;:::i;778:161::-;;;:::i;:::-;;24411:470;;;;;;;;;;;;;;;;-1:-1:-1;24411:470:0;;;;;;;;;;;;;;;;;;;;;;:::i;555:88::-;;;:::i;25056:227::-;;;;;;;;;;;;;;;;-1:-1:-1;25056:227:0;;;;;;;;;;;-1:-1:-1;;;;;25056:227:0;;:::i;23376:18::-;;;:::i;23619:31::-;;;:::i;27765:1475::-;;;:::i;29335:434::-;;;;;;;;;;;;;;;;-1:-1:-1;29335:434:0;-1:-1:-1;;;;;29335:434:0;;:::i;23093:33::-;;;:::i;23027:31::-;;;:::i;30153:274::-;;;:::i;23509:24::-;;;:::i;32204:206::-;;;;;;;;;;;;;;;;-1:-1:-1;32204:206:0;;:::i;23351:18::-;;;:::i;23472:30::-;;;:::i;23134:22::-;;;:::i;947:264::-;;;;;;;;;;;;;;;;-1:-1:-1;947:264:0;-1:-1:-1;;;;;947:264:0;;:::i;23540:37::-;;;:::i;23403:24::-;;;:::i;30584:182::-;30671:19;30721:37;30746:10;30721:23;:37::i;:::-;30704:54;30584:182;-1:-1:-1;;30584:182:0:o;25546:416::-;25807:3;;25794:82;;;-1:-1:-1;;;25794:82:0;;25821:10;25794:82;;;;25841:4;25794:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25776:4;;-1:-1:-1;;;;;25807:3:0;;25794:25;;:82;;;;;25776:4;;25794:82;;;;;;;25776:4;25807:3;25794:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25887:44;25897:7;25906:11;25919:10;25887:8;:44::i;:::-;-1:-1:-1;25950:4:0;;25546:416;-1:-1:-1;;;;;;;;25546:416:0:o;31584:477::-;31671:4;31689:19;31711:37;31736:10;31711:23;:37::i;:::-;-1:-1:-1;;;;;31783:27:0;;31759:21;31783:27;;;:13;:27;;;;;;;:43;;31689:59;;-1:-1:-1;31868:51:0;31912:5;31868:38;31783:43;31689:59;31868:20;:38::i;:::-;:42;;:51::i;:::-;31847:72;;31955:5;31937:14;:23;31932:90;;-1:-1:-1;31994:16:0;31932:90;32040:13;31584:477;-1:-1:-1;;;;31584:477:0:o;23284:28::-;;;;:::o;32517:121::-;32578:13;32616:14;:12;:14::i;:::-;32605:25;;32517:121;:::o;22916:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22980:20::-;;;;:::o;23321:23::-;;;-1:-1:-1;;;;;23321:23:0;;:::o;29873:158::-;29941:4;692:6;;-1:-1:-1;;;;;692:6:0;702:10;692:20;683:67;;;;;-1:-1:-1;;;683:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;683:67:0;;;;;;;;;;;;;;;-1:-1:-1;29982:19:0::1;::::0;;-1:-1:-1;;;;29959:42:0;::::1;-1:-1:-1::0;;;29982:19:0;;;::::1;;;29981:20;29959:42:::0;;::::1;;::::0;;-1:-1:-1;761:1:0::1;29873:158:::0;:::o;778:161::-;692:6;;-1:-1:-1;;;;;692:6:0;702:10;692:20;683:67;;;;;-1:-1:-1;;;683:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;683:67:0;;;;;;;;;;;;;;;897:1:::1;881:6:::0;;859:42:::1;::::0;-1:-1:-1;;;;;881:6:0;;::::1;::::0;859:42:::1;::::0;897:1;;859:42:::1;929:1;912:19:::0;;-1:-1:-1;;;;;;912:19:0::1;::::0;;778:161::o;24411:470::-;24628:4;692:6;;-1:-1:-1;;;;;692:6:0;702:10;692:20;683:67;;;;;-1:-1:-1;;;683:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;683:67:0;;;;;;;;;;;;;;;-1:-1:-1;24646:19:0::1;:42:::0;;;;24699:21:::1;:46:::0;;;;24756:10:::1;:24:::0;24791:16:::1;:29:::0;24831:8:::1;:20:::0;-1:-1:-1;;24411:470:0:o;555:88::-;602:7;629:6;-1:-1:-1;;;;;629:6:0;555:88;:::o;25056:227::-;25190:4;25208:44;25218:7;25227:11;25240:10;25208:8;:44::i;:::-;-1:-1:-1;25271:4:0;;25056:227;-1:-1:-1;;;;25056:227:0:o;23376:18::-;;;-1:-1:-1;;;;;23376:18:0;;:::o;23619:31::-;;;-1:-1:-1;;;23619:31:0;;;;;:::o;27765:1475::-;27868:10;27811:4;27853:27;;;:13;:27;;;;;;;:43;;27918:20;27909:66;;;;;-1:-1:-1;;;27909:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28017:10;27988:11;28002:27;;;:13;:27;;;;;:33;;28068:37;;:23;:37::i;:::-;28046:59;;28141:5;28123:14;:23;28118:258;;28204:10;28190:25;;;;:13;:25;;;;;;;28183:32;;;;;;;;;;;;;;;;;;28238:3;;28230:58;;-1:-1:-1;;;;;28238:3:0;;;;28270:16;28230:26;:58::i;:::-;28315:9;;:23;;28330:6;28315:13;:23::i;:::-;28303:9;:35;-1:-1:-1;28360:4:0;;-1:-1:-1;28353:11:0;;-1:-1:-1;;28353:11:0;28118:258;28430:12;28445:51;28489:5;28445:38;:16;28467:14;28445:20;:38::i;:51::-;28515:3;;28430:66;;-1:-1:-1;28507:49:0;;-1:-1:-1;;;;;28515:3:0;28535:10;28430:66;28507:26;:49::i;:::-;28616:15;28634:41;28668:5;28634:28;:6;28646:14;28634:10;:28::i;:41::-;28698:9;;28616:59;;-1:-1:-1;28698:27:0;;28616:59;28698:13;:27::i;:::-;28686:9;:39;28774:10;28738:19;28760:25;;;:13;:25;;;;;:39;;;;28852:37;;;;;28760:39;;28738:19;28834:57;;:12;;:16;:57::i;:::-;28810:81;;28971:239;;;;;;;;29005:24;29017:10;29005:6;:10;;:24;;;;:::i;:::-;28971:239;;;;29061:31;:16;29083:7;29061:20;:31::i;:::-;28971:239;;29118:12;28971:239;;;;;;29160:38;:14;29180:16;29160:18;:38::i;:::-;28971:239;;28957:10;28943:25;;;;:13;:25;;;;;;;;;:267;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;-1:-1:-1;;;;;;;;27765:1475:0;:::o;29335:434::-;29424:11;29447:21;29480:15;29507:19;29546:23;;:::i;:::-;-1:-1:-1;;;;;;;;;29572:25:0;;;;;;;;:13;:25;;;;;;;;;29546:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29335:434:0:o;23093:33::-;;;;:::o;23027:31::-;;;;:::o;30153:274::-;30205:4;30223:19;30262:22;;;;;;;;;-1:-1:-1;;;;;30262:22:0;-1:-1:-1;;;;;30245:62:0;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30245:64:0;30359:16;;30245:64;;-1:-1:-1;30322:14:0;;30339:51;;30383:5;;30339:38;;30245:64;;30339:18;:38::i;:51::-;30322:68;-1:-1:-1;;;30153:274:0;:::o;23509:24::-;;;-1:-1:-1;;;;;23509:24:0;;:::o;32204:206::-;32281:17;32327:75;32396:4;32327:63;:45;32348:6;32356:14;:12;:14::i;:::-;32327:19;:45::i;:::-;:61;:63::i;23351:18::-;;;-1:-1:-1;;;;;23351:18:0;;:::o;23472:30::-;;;-1:-1:-1;;;;;23472:30:0;;:::o;23134:22::-;;;;:::o;947:264::-;692:6;;-1:-1:-1;;;;;692:6:0;702:10;692:20;683:67;;;;;-1:-1:-1;;;683:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;683:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;1051:23:0;::::1;1042:75;;;;-1:-1:-1::0;;;1042:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1155:6;::::0;;1133:41:::1;::::0;-1:-1:-1;;;;;1133:41:0;;::::1;::::0;1155:6;::::1;::::0;1133:41:::1;::::0;::::1;1185:6;:18:::0;;-1:-1:-1;;;;;;1185:18:0::1;-1:-1:-1::0;;;;;1185:18:0;;;::::1;::::0;;;::::1;::::0;;947:264::o;23540:37::-;;;-1:-1:-1;;;;;23540:37:0;;:::o;23403:24::-;;;;:::o;30966:461::-;-1:-1:-1;;;;;31100:27:0;;31045:19;31100:27;;;:13;:27;;;;;:41;;;31157:18;;31152:268;;-1:-1:-1;;;;;31235:27:0;;31193:21;31235:27;;;:13;:27;;;;;:37;;;31217:57;;:12;;:16;:57::i;:::-;31193:81;-1:-1:-1;31306:51:0;31341:14;31306:29;31193:81;31328:5;31306:20;:29::i;:51::-;31289:68;;31152:268;;;;31407:1;31390:18;;31152:268;30966:461;;;;:::o;26151:1535::-;26278:4;26352:14;:12;:14::i;:::-;26337:11;:29;;26328:86;;;;-1:-1:-1;;;26328:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26435:3;;26427:68;;-1:-1:-1;;;;;26435:3:0;26459:10;26479:4;26486:7;26427:30;:68::i;:::-;26508:11;26522:18;:7;26535:3;26522:11;:18::i;:::-;26508:32;;26551:12;26566:31;26589:6;26566:21;:31::i;:::-;26551:46;;26630:8;26619:7;:19;;26610:48;;;;;-1:-1:-1;;;26610:48:0;;;;;;;;;;;;-1:-1:-1;;;26610:48:0;;;;;;;;;;;;;;;26711:20;:18;:20::i;:::-;26700:7;:31;;26691:59;;;;;-1:-1:-1;;;26691:59:0;;;;;;;;;;;;-1:-1:-1;;;26691:59:0;;;;;;;;;;;;;;;26775:9;;:23;;26790:6;26775:13;:23::i;:::-;26763:9;:35;26857:3;;26881:8;;26849:53;;;-1:-1:-1;;;26849:53:0;;-1:-1:-1;;;;;26881:8:0;;;26849:53;;;;;;;;;;;;26857:3;;;;;26849:21;;:53;;;;;;;;;;;;;;26857:3;;26849:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26924:8:0;;26913:48;;;-1:-1:-1;;;26913:48:0;;;;;;;;;;-1:-1:-1;;;;;26924:8:0;;;;26913:37;;:48;;;;;26849:53;;26913:48;;;;;;;;26924:8;;26913:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26989:12:0;;-1:-1:-1;27004:21:0;:6;27016:7;27004:10;:21::i;:::-;26989:36;;27036:15;27054:49;:40;27075:7;27084:8;;27054:19;:40::i;:::-;:47;:49::i;:::-;27202:15;;-1:-1:-1;;;;;27036:67:0;;;;;-1:-1:-1;27174:72:0;;-1:-1:-1;;;;;27202:15:0;27219:25;:7;27036:67;27219:11;:25::i;:::-;27182:3;;-1:-1:-1;;;;;27182:3:0;;27174:72;:26;:72::i;:::-;27285:9;;27265:3;;27257:51;;-1:-1:-1;;;;;27265:3:0;;;;27285:9;27296:10;27257:26;:51::i;:::-;27384:272;;;;;;;;-1:-1:-1;;;;;27418:27:0;;-1:-1:-1;27418:27:0;;;:13;:27;;;;;;:33;27384:272;;27418:47;;27457:6;27418:37;:47::i;:::-;27384:272;;-1:-1:-1;;;;;27497:27:0;;;;;;:13;27384:272;27497:27;;;;;;;:43;;27384:272;;;27497:58;;27546:7;27497:47;:58::i;:::-;27384:272;;27581:12;27384:272;;;;;;;;27623:21;;27384:272;;;;;-1:-1:-1;;;;;27354:27:0;;-1:-1:-1;27354:27:0;;;:13;:27;;;;;;;:302;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;-1:-1:-1;;;;;26151:1535:0;;;;;:::o;1777:250::-;1835:7;1859:6;1855:47;;-1:-1:-1;1889:1:0;1882:8;;1855:47;1926:5;;;1930:1;1926;:5;:1;1950:5;;;;;:10;1942:56;;;;-1:-1:-1;;;1942:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2018:1;1777:250;-1:-1:-1;;;1777:250:0:o;2035:132::-;2093:7;2120:39;2124:1;2127;2120:39;;;;;;;;;;;;;;;;;:3;:39::i;32743:259::-;32791:13;32829:78;32902:3;32829:67;32883:10;32829:43;32854:16;:14;:16::i;:::-;32829:19;;;:23;:43::i;:::-;:47;;:67::i;:78::-;32818:89;;32934:10;;32923:8;:21;32918:77;;;-1:-1:-1;32973:10:0;;32743:259;:::o;17021:177::-;17131:58;;;-1:-1:-1;;;;;17131:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17131:58:0;-1:-1:-1;;;17131:58:0;;;17104:86;;17124:5;;17104:19;:86::i;:::-;17021:177;;;:::o;1433:136::-;1491:7;1518:43;1522:1;1525;1518:43;;;;;;;;;;;;;;;;;:3;:43::i;20669:719::-;20750:16;;:::i;:::-;20801:1;20787:11;:15;20779:66;;;;-1:-1:-1;;;20779:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20860:14;20856:50;;-1:-1:-1;20883:23:0;;;;;;;;;-1:-1:-1;20883:23:0;;20876:30;;20856:50;20923:24;;;20919:462;;20964:14;21009:11;20095:3;20982:23;;;21009:11;20981:39;;;;;;-1:-1:-1;;;;;;21043:21:0;;;21035:64;;;;;-1:-1:-1;;;21035:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21121:26;;;;;;;;21139:6;-1:-1:-1;;;;;21121:26:0;;;;21114:33;;;;;20919:462;21180:14;21197:45;21213:9;-1:-1:-1;;;21230:11:0;21197:15;:45::i;:::-;21180:62;-1:-1:-1;;;;;;21265:21:0;;;21257:64;;;;;-1:-1:-1;;;21257:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;20524:137;20626:7;20637:16;-1:-1:-1;;;;;20621:13:0;;;:32;;20524:137::o;17206:205::-;17334:68;;;-1:-1:-1;;;;;17334:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17334:68:0;-1:-1:-1;;;17334:68:0;;;17307:96;;17327:5;;17307:19;:96::i;:::-;17206:205;;;;:::o;1244:181::-;1302:7;1334:5;;;1358:6;;;;1350:46;;;;;-1:-1:-1;;;1350:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;20389:127;20486:7;20095:3;20486:21;-1:-1:-1;;;;;20486:21:0;;20389:127::o;2175:189::-;2261:7;2296:12;2289:5;2281:28;;;;-1:-1:-1;;;2281:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2320:9;2336:1;2332;:5;;;;;;;2175:189;-1:-1:-1;;;;;2175:189:0:o;33107:693::-;33217:19;;33157:15;;;;-1:-1:-1;;;33217:19:0;;;;33213:195;;;33280:22;;;;;;;;;-1:-1:-1;;;;;33280:22:0;-1:-1:-1;;;;;33263:62:0;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33263:64:0;;-1:-1:-1;33213:195:0;;;33377:3;;;;;;;;;-1:-1:-1;;;;;33377:3:0;-1:-1:-1;;;;;33369:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33369:27:0;;-1:-1:-1;33213:195:0;33433:211;33638:4;33433:199;:181;33561:20;33576:3;33561:9;;:13;;:20;;;;:::i;:::-;33597:6;33433:19;:181::i;:211::-;33420:224;;33107:693;;:::o;18410:420::-;18493:23;18519:69;18547:4;18519:69;;;;;;;;;;;;;;;;;18527:5;-1:-1:-1;;;;;18519:27:0;;;:69;;;;;:::i;:::-;18603:17;;18493:95;;-1:-1:-1;18603:21:0;18599:224;;18745:10;18734:30;;;;;;;;;;;;;;;-1:-1:-1;18734:30:0;18726:85;;;;-1:-1:-1;;;18726:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1577:192;1663:7;1699:12;1691:6;;;;1683:29;;;;-1:-1:-1;;;1683:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1735:5:0;;;1577:192::o;19569:347::-;19675:7;19696:9;19707;19720:13;19728:1;19731;19720:7;:13::i;:::-;19695:38;;;;19744:10;19770:1;19757:15;;;;;19767:1;19764;19757:15;19744:28;;19792:1;19787:2;:6;19783:18;;;19800:1;19795:6;;;;19783:18;19817:2;19812:7;;;;19842:1;19838;:5;19830:44;;;;;-1:-1:-1;;;19830:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19892:16;19900:1;19903;19906;19892:7;:16::i;:::-;19885:23;19569:347;-1:-1:-1;;;;;;;19569:347:0:o;4955:196::-;5058:12;5090:53;5113:6;5121:4;5127:1;5130:12;5090:22;:53::i;18861:210::-;18922:9;;;-1:-1:-1;;18978:1:0;18975;18968:25;18955:38;;19012:1;19008;:5;19004:9;;19033:1;19028:2;:6;19024:10;;19054:1;19049:2;:6;19045:18;;;19062:1;19057:6;;;;19045:18;18861:210;;;;;;:::o;19079:482::-;19185:7;19224:2;;;19220:6;;;19225:1;19220:6;19237:9;;;;;;;19262:4;19257:9;;;;;;;;;19297:4;19289;19288:5;;19287:14;;;;;19346:1;:9;;;19375:5;;;19371:9;;19366:14;19400:5;;;19396:9;;19391:14;19425:5;;;19421:9;;19416:14;19450:5;;;19446:9;;19441:14;19475:5;;;19471:9;;19466:14;19500:5;;;19496:9;;19491:14;19525:5;;;19521:9;;19516:14;;;19287;;19304:1;19287:18;19282:24;;;;19277:29;;;;19548:5;;19079:482;-1:-1:-1;;19079:482:0:o;5931:979::-;6061:12;6094:18;6105:6;6094:10;:18::i;:::-;6086:60;;;;;-1:-1:-1;;;6086:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6220:12;6234:23;6261:6;-1:-1:-1;;;;;6261:11:0;6281:8;6292:4;6261:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6261:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6219:78;;;;6312:7;6308:595;;;6343:10;-1:-1:-1;6336:17:0;;-1:-1:-1;6336:17:0;6308:595;6457:17;;:21;6453:439;;6720:10;6714:17;6781:15;6768:10;6764:2;6760:19;6753:44;6668:148;6856:20;;-1:-1:-1;;;6856:20:0;;;;;;;;;;;;;;;;;6863:12;;6856:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4128:233;4306:20;4345:8;;;4128:233::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://db9dd9a1ee9f3b8523f981fb94d38881f2d98e34b29468471bcfa491e8a853ee

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.