Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,053 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 12649767 | 1242 days ago | IN | 0 ETH | 0.00075027 | ||||
Redeem | 12583319 | 1253 days ago | IN | 0 ETH | 0.00070614 | ||||
Redeem | 12581595 | 1253 days ago | IN | 0 ETH | 0.0005296 | ||||
Redeem | 12581511 | 1253 days ago | IN | 0 ETH | 0.00092681 | ||||
Redeem | 12581364 | 1253 days ago | IN | 0 ETH | 0.00070614 | ||||
Redeem | 12579184 | 1253 days ago | IN | 0 ETH | 0.00048547 | ||||
Redeem | 12579178 | 1253 days ago | IN | 0 ETH | 0.00048547 | ||||
Redeem | 12578982 | 1253 days ago | IN | 0 ETH | 0.00117105 | ||||
Redeem | 12578491 | 1253 days ago | IN | 0 ETH | 0.00086281 | ||||
Redeem | 12577154 | 1253 days ago | IN | 0 ETH | 0.00171153 | ||||
Redeem | 12576488 | 1254 days ago | IN | 0 ETH | 0.00117105 | ||||
Redeem | 12574845 | 1254 days ago | IN | 0 ETH | 0.00160558 | ||||
Redeem | 12574100 | 1254 days ago | IN | 0 ETH | 0.00124067 | ||||
Redeem | 12573884 | 1254 days ago | IN | 0 ETH | 0.00092681 | ||||
Redeem | 12573278 | 1254 days ago | IN | 0 ETH | 0.00138663 | ||||
Redeem | 12573242 | 1254 days ago | IN | 0 ETH | 0.00088268 | ||||
Redeem | 12572941 | 1254 days ago | IN | 0 ETH | 0.00216194 | ||||
Redeem | 12572575 | 1254 days ago | IN | 0 ETH | 0.00116769 | ||||
Redeem | 12571726 | 1254 days ago | IN | 0 ETH | 0.00070614 | ||||
Redeem | 12570785 | 1254 days ago | IN | 0 ETH | 0.00211644 | ||||
Redeem | 12570644 | 1255 days ago | IN | 0 ETH | 0.00198178 | ||||
Redeem | 12570326 | 1255 days ago | IN | 0 ETH | 0.00229706 | ||||
Redeem | 12569971 | 1255 days ago | IN | 0 ETH | 0.00145962 | ||||
Redeem | 12568534 | 1255 days ago | IN | 0 ETH | 0.00261234 | ||||
Redeem | 12568516 | 1255 days ago | IN | 0 ETH | 0.00211644 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
OlympusDAIDepository
Compiler Version
v0.7.5+commit.eb77ed08
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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $91.54 | 102.1696 | $9,352.61 |
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.