Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 18 from a total of 18 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Allocate Seignio... | 15336469 | 887 days ago | IN | 0 ETH | 0.00756578 | ||||
Allocate Seignio... | 15334328 | 887 days ago | IN | 0 ETH | 0.00977746 | ||||
Allocate Seignio... | 15334202 | 887 days ago | IN | 0 ETH | 0.00215499 | ||||
Buy Bonds | 11789695 | 1442 days ago | IN | 0 ETH | 0.07151339 | ||||
Buy Bonds | 11734344 | 1451 days ago | IN | 0 ETH | 0.01813036 | ||||
Allocate Seignio... | 11732417 | 1451 days ago | IN | 0 ETH | 0.01684956 | ||||
Allocate Seignio... | 11730211 | 1451 days ago | IN | 0 ETH | 0.01737663 | ||||
Buy Bonds | 11729593 | 1452 days ago | IN | 0 ETH | 0.01425411 | ||||
Buy Bonds | 11729563 | 1452 days ago | IN | 0 ETH | 0.01370077 | ||||
Allocate Seignio... | 11728111 | 1452 days ago | IN | 0 ETH | 0.0205618 | ||||
Buy Bonds | 11727861 | 1452 days ago | IN | 0 ETH | 0.01519363 | ||||
Buy Bonds | 11726046 | 1452 days ago | IN | 0 ETH | 0.06175344 | ||||
Allocate Seignio... | 11725852 | 1452 days ago | IN | 0 ETH | 0.00359008 | ||||
Allocate Seignio... | 11725852 | 1452 days ago | IN | 0 ETH | 0.13225008 | ||||
Allocate Seignio... | 11723618 | 1452 days ago | IN | 0 ETH | 0.0025056 | ||||
Initialize | 11723242 | 1453 days ago | IN | 0 ETH | 0.00462096 | ||||
Transfer Ownersh... | 11704845 | 1455 days ago | IN | 0 ETH | 0.0030927 | ||||
Transfer Operato... | 11704844 | 1455 days ago | IN | 0 ETH | 0.0030064 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Treasury
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity ^0.6.0; import '@openzeppelin/contracts/math/Math.sol'; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@openzeppelin/contracts/token/ERC20/SafeERC20.sol'; import '@openzeppelin/contracts/utils/ReentrancyGuard.sol'; import {ICurve} from './curve/Curve.sol'; import {IOracle} from './interfaces/IOracle.sol'; import {IBoardroom} from './interfaces/IBoardroom.sol'; import {IBasisAsset} from './interfaces/IBasisAsset.sol'; import {ISimpleERCFund} from './interfaces/ISimpleERCFund.sol'; import {Babylonian} from './lib/Babylonian.sol'; import {FixedPoint} from './lib/FixedPoint.sol'; import {Safe112} from './lib/Safe112.sol'; import {Operator} from './owner/Operator.sol'; import {Epoch} from './utils/Epoch.sol'; import {ContractGuard} from './utils/ContractGuard.sol'; /** * @title Basis Cash Treasury contract * @notice Monetary policy logic to adjust supplies of basis cash assets * @author Summer Smith & Rick Sanchez */ contract Treasury is ContractGuard, Epoch { using FixedPoint for *; using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; using Safe112 for uint112; /* ========== STATE VARIABLES ========== */ // ========== FLAGS bool public migrated = false; bool public initialized = false; // ========== CORE address public fund; address public cash; address public bond; address public share; address public curve; address public boardroom; address public boardroomLp; // boardroom support lp staking address public bondOracle; address public seigniorageOracle; // ========== PARAMS uint256 public cashPriceOne; uint256 public lastBondOracleEpoch = 0; uint256 public bondCap = 0; uint256 public accumulatedSeigniorage = 0; uint256 public fundAllocationRate = 18; // ‰ uint256 public boardroomAllocationRate = 30; // boardroom: 30%, boardroomLp: 70% /* ========== CONSTRUCTOR ========== */ constructor( address _cash, address _bond, address _share, address _bondOracle, address _seigniorageOracle, address _boardroom, address _boardroomLp, //boardroom for lp address _fund, address _curve, uint256 _startTime ) public Epoch(8 hours, _startTime, 0) { cash = _cash; bond = _bond; share = _share; curve = _curve; bondOracle = _bondOracle; seigniorageOracle = _seigniorageOracle; boardroom = _boardroom; boardroomLp = _boardroomLp; fund = _fund; cashPriceOne = 10**18; } /* =================== Modifier =================== */ modifier checkMigration { require(!migrated, 'Treasury: migrated'); _; } modifier checkOperator { require( IBasisAsset(cash).operator() == address(this) && IBasisAsset(bond).operator() == address(this) && IBasisAsset(share).operator() == address(this) && Operator(boardroom).operator() == address(this) && Operator(boardroomLp).operator() == address(this), 'Treasury: need more permission' ); _; } modifier updatePrice { _; _updateCashPrice(); } /* ========== VIEW FUNCTIONS ========== */ // budget function getReserve() public view returns (uint256) { return accumulatedSeigniorage; } function circulatingSupply() public view returns (uint256) { return IERC20(cash).totalSupply().sub(accumulatedSeigniorage); } function getCeilingPrice() public view returns (uint256) { return ICurve(curve).calcCeiling(circulatingSupply()); } // oracle function getBondOraclePrice() public view returns (uint256) { return _getCashPrice(bondOracle); } function getSeigniorageOraclePrice() public view returns (uint256) { return _getCashPrice(seigniorageOracle); } function _getCashPrice(address oracle) internal view returns (uint256) { try IOracle(oracle).consult(cash, 1e18) returns (uint256 price) { return price; } catch { revert('Treasury: failed to consult cash price from the oracle'); } } /* ========== GOVERNANCE ========== */ // MIGRATION function initialize() public checkOperator { require(!initialized, 'Treasury: initialized'); // set accumulatedSeigniorage to it's balance accumulatedSeigniorage = IERC20(cash).balanceOf(address(this)); initialized = true; emit Initialized(msg.sender, block.number); } function migrate(address target) public onlyOperator checkOperator { require(!migrated, 'Treasury: migrated'); // cash Operator(cash).transferOperator(target); Operator(cash).transferOwnership(target); IERC20(cash).transfer(target, IERC20(cash).balanceOf(address(this))); // bond Operator(bond).transferOperator(target); Operator(bond).transferOwnership(target); IERC20(bond).transfer(target, IERC20(bond).balanceOf(address(this))); // share Operator(share).transferOperator(target); Operator(share).transferOwnership(target); IERC20(share).transfer(target, IERC20(share).balanceOf(address(this))); migrated = true; emit Migration(target); } // FUND function setFund(address newFund) public onlyOperator { address oldFund = fund; fund = newFund; emit ContributionPoolChanged(msg.sender, oldFund, newFund); } function setFundAllocationRate(uint256 newRate) public onlyOperator { uint256 oldRate = fundAllocationRate; fundAllocationRate = newRate; emit ContributionPoolRateChanged(msg.sender, oldRate, newRate); } // ORACLE function setBondOracle(address newOracle) public onlyOperator { address oldOracle = bondOracle; bondOracle = newOracle; emit BondOracleChanged(msg.sender, oldOracle, newOracle); } function setSeigniorageOracle(address newOracle) public onlyOperator { address oldOracle = seigniorageOracle; seigniorageOracle = newOracle; emit SeigniorageOracleChanged(msg.sender, oldOracle, newOracle); } // TWEAK function setCeilingCurve(address newCurve) public onlyOperator { address oldCurve = newCurve; curve = newCurve; emit CeilingCurveChanged(msg.sender, oldCurve, newCurve); } function setBoardroomAllocationRate(uint256 newRate) public onlyOperator { require(newRate <= 100, 'invalid boardroom rate'); uint256 oldRate = boardroomAllocationRate; boardroomAllocationRate = newRate; emit BoardroomRateChanged(msg.sender, oldRate, newRate); } /* ========== MUTABLE FUNCTIONS ========== */ function _updateConversionLimit(uint256 cashPrice) internal { uint256 currentEpoch = Epoch(bondOracle).getLastEpoch(); // lastest update time if (lastBondOracleEpoch != currentEpoch) { uint256 percentage = cashPriceOne.sub(cashPrice); uint256 bondSupply = IERC20(bond).totalSupply(); bondCap = circulatingSupply().mul(percentage).div(1e18); bondCap = bondCap.sub(Math.min(bondCap, bondSupply)); lastBondOracleEpoch = currentEpoch; } } function _updateCashPrice() internal { if (Epoch(bondOracle).callable()) { try IOracle(bondOracle).update() {} catch {} } if (Epoch(seigniorageOracle).callable()) { try IOracle(seigniorageOracle).update() {} catch {} } } function buyBonds(uint256 amount, uint256 targetPrice) external onlyOneBlock checkMigration checkStartTime checkOperator updatePrice { require(amount > 0, 'Treasury: cannot purchase bonds with zero amount'); uint256 cashPrice = _getCashPrice(bondOracle); require(cashPrice <= targetPrice, 'Treasury: cash price moved'); require( cashPrice < cashPriceOne, // price < $1 'Treasury: cashPrice not eligible for bond purchase' ); _updateConversionLimit(cashPrice); amount = Math.min(amount, bondCap.mul(cashPrice).div(1e18)); require(amount > 0, 'Treasury: amount exceeds bond cap'); bondCap = bondCap.sub(amount.mul(1e18).div(cashPrice)); IBasisAsset(cash).burnFrom(msg.sender, amount); IBasisAsset(bond).mint(msg.sender, amount.mul(1e18).div(cashPrice)); emit BoughtBonds(msg.sender, amount); } function redeemBonds(uint256 amount) external onlyOneBlock checkMigration checkStartTime checkOperator updatePrice { require(amount > 0, 'Treasury: cannot redeem bonds with zero amount'); uint256 cashPrice = _getCashPrice(bondOracle); require( cashPrice > getCeilingPrice(), // price > $1.05 'Treasury: cashPrice not eligible for bond purchase' ); require( IERC20(cash).balanceOf(address(this)) >= amount, 'Treasury: treasury has no more budget' ); accumulatedSeigniorage = accumulatedSeigniorage.sub( Math.min(accumulatedSeigniorage, amount) ); IBasisAsset(bond).burnFrom(msg.sender, amount); IERC20(cash).safeTransfer(msg.sender, amount); emit RedeemedBonds(msg.sender, amount); } function allocateSeigniorage() external onlyOneBlock checkMigration checkStartTime checkEpoch checkOperator { _updateCashPrice(); uint256 cashPrice = _getCashPrice(seigniorageOracle); if (cashPrice <= getCeilingPrice()) { return; // just advance epoch instead revert } // circulating supply uint256 percentage = cashPrice.sub(cashPriceOne); uint256 seigniorage = circulatingSupply().mul(percentage).div(1e18); IBasisAsset(cash).mint(address(this), seigniorage); // ======================== BIP-3 uint256 fundReserve = seigniorage.mul(fundAllocationRate).div(1000); if (fundReserve > 0) { IERC20(cash).safeApprove(fund, fundReserve); ISimpleERCFund(fund).deposit( cash, fundReserve, 'Treasury: Seigniorage Allocation' ); emit ContributionPoolFunded(now, fundReserve); } seigniorage = seigniorage.sub(fundReserve); // ======================== BIP-4 uint256 treasuryReserve = Math.min( seigniorage, IERC20(bond).totalSupply() > accumulatedSeigniorage ? IERC20(bond).totalSupply().sub(accumulatedSeigniorage) : 0 ); if (treasuryReserve > 0) { accumulatedSeigniorage = accumulatedSeigniorage.add( treasuryReserve ); emit TreasuryFunded(now, treasuryReserve); } // boardroom uint256 boardroomReserve = seigniorage.sub(treasuryReserve); if (boardroomReserve > 0) { // boardroom : boardroomLp = 3:7 uint256 boardroomReserve3 = boardroomReserve.mul(boardroomAllocationRate).div(100); IERC20(cash).safeApprove(boardroom, boardroomReserve3); IBoardroom(boardroom).allocateSeigniorage(boardroomReserve3); emit BoardroomFunded(now, boardroomReserve); emit BoardroomFunded(boardroom, now, boardroomReserve3); uint256 boardroomLpReserve7 = boardroomReserve.sub(boardroomReserve3); IERC20(cash).safeApprove(boardroomLp, boardroomLpReserve7); IBoardroom(boardroomLp).allocateSeigniorage(boardroomLpReserve7); emit BoardroomFunded(boardroomLp, now, boardroomLpReserve7); } } function sendCash(uint amount) public { require(msg.sender == boardroom || msg.sender == boardroomLp, 'Invalid sender'); accumulatedSeigniorage = accumulatedSeigniorage.add(amount); IERC20(cash).safeTransferFrom(msg.sender, address(this), amount); } /* ========== EVENTS ========== */ // GOV event Initialized(address indexed executor, uint256 at); event Migration(address indexed target); event ContributionPoolChanged( address indexed operator, address oldFund, address newFund ); event ContributionPoolRateChanged( address indexed operator, uint256 oldRate, uint256 newRate ); event BondOracleChanged( address indexed operator, address oldOracle, address newOracle ); event SeigniorageOracleChanged( address indexed operator, address oldOracle, address newOracle ); event CeilingCurveChanged( address indexed operator, address oldCurve, address newCurve ); event BoardroomRateChanged( address indexed operator, uint256 oldRate, uint256 newRate ); // CORE event RedeemedBonds(address indexed from, uint256 amount); event BoughtBonds(address indexed from, uint256 amount); event TreasuryFunded(uint256 timestamp, uint256 seigniorage); event BoardroomFunded(uint256 timestamp, uint256 seigniorage); event BoardroomFunded( address boardroom, uint256 timestamp, uint256 seigniorage ); event ContributionPoolFunded(uint256 timestamp, uint256 seigniorage); }
pragma solidity ^0.6.0; interface ICurve { function minSupply() external view returns (uint256); function maxSupply() external view returns (uint256); function minCeiling() external view returns (uint256); function maxCeiling() external view returns (uint256); function calcCeiling(uint256 _supply) external view returns (uint256); } abstract contract Curve is ICurve { /* ========== EVENTS ========== */ event MinSupplyChanged( address indexed operator, uint256 _old, uint256 _new ); event MaxSupplyChanged( address indexed operator, uint256 _old, uint256 _new ); event MinCeilingChanged( address indexed operator, uint256 _old, uint256 _new ); event MaxCeilingChanged( address indexed operator, uint256 _old, uint256 _new ); /* ========== STATE VARIABLES ========== */ uint256 public override minSupply; uint256 public override maxSupply; uint256 public override minCeiling; uint256 public override maxCeiling; /* ========== GOVERNANCE ========== */ function setMinSupply(uint256 _newMinSupply) public virtual { uint256 oldMinSupply = minSupply; minSupply = _newMinSupply; emit MinSupplyChanged(msg.sender, oldMinSupply, _newMinSupply); } function setMaxSupply(uint256 _newMaxSupply) public virtual { uint256 oldMaxSupply = maxSupply; maxSupply = _newMaxSupply; emit MaxSupplyChanged(msg.sender, oldMaxSupply, _newMaxSupply); } function setMinCeiling(uint256 _newMinCeiling) public virtual { uint256 oldMinCeiling = _newMinCeiling; minCeiling = _newMinCeiling; emit MinCeilingChanged(msg.sender, oldMinCeiling, _newMinCeiling); } function setMaxCeiling(uint256 _newMaxCeiling) public virtual { uint256 oldMaxCeiling = _newMaxCeiling; maxCeiling = _newMaxCeiling; emit MaxCeilingChanged(msg.sender, oldMaxCeiling, _newMaxCeiling); } function calcCeiling(uint256 _supply) external view virtual override returns (uint256); }
pragma solidity ^0.6.0; interface IBasisAsset { function mint(address recipient, uint256 amount) external returns (bool); function burn(uint256 amount) external; function burnFrom(address from, uint256 amount) external; function isOperator() external returns (bool); function operator() external view returns (address); }
pragma solidity ^0.6.0; interface IBoardroom { function allocateSeigniorage(uint256 amount) external; }
pragma solidity ^0.6.0; interface IOracle { function update() external; function consult(address token, uint256 amountIn) external view returns (uint256 amountOut); // function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestamp); }
pragma solidity ^0.6.0; interface ISimpleERCFund { function deposit( address token, uint256 amount, string memory reason ) external; function withdraw( address token, uint256 amount, address to, string memory reason ) external; }
pragma solidity ^0.6.0; library Babylonian { function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } // else z = 0 } }
pragma solidity ^0.6.0; import './Babylonian.sol'; // a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format)) library FixedPoint { // range: [0, 2**112 - 1] // resolution: 1 / 2**112 struct uq112x112 { uint224 _x; } // range: [0, 2**144 - 1] // resolution: 1 / 2**112 struct uq144x112 { uint256 _x; } uint8 private constant RESOLUTION = 112; uint256 private constant Q112 = uint256(1) << RESOLUTION; uint256 private constant Q224 = Q112 << RESOLUTION; // encode a uint112 as a UQ112x112 function encode(uint112 x) internal pure returns (uq112x112 memory) { return uq112x112(uint224(x) << RESOLUTION); } // encodes a uint144 as a UQ144x112 function encode144(uint144 x) internal pure returns (uq144x112 memory) { return uq144x112(uint256(x) << RESOLUTION); } // divide a UQ112x112 by a uint112, returning a UQ112x112 function div(uq112x112 memory self, uint112 x) internal pure returns (uq112x112 memory) { require(x != 0, 'FixedPoint: DIV_BY_ZERO'); return uq112x112(self._x / uint224(x)); } // multiply a UQ112x112 by a uint, returning a UQ144x112 // reverts on overflow function mul(uq112x112 memory self, uint256 y) internal pure returns (uq144x112 memory) { uint256 z; require( y == 0 || (z = uint256(self._x) * y) / y == uint256(self._x), 'FixedPoint: MULTIPLICATION_OVERFLOW' ); return uq144x112(z); } // returns a UQ112x112 which represents the ratio of the numerator to the denominator // equivalent to encode(numerator).div(denominator) function fraction(uint112 numerator, uint112 denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, 'FixedPoint: DIV_BY_ZERO'); return uq112x112((uint224(numerator) << RESOLUTION) / denominator); } // decode a UQ112x112 into a uint112 by truncating after the radix point function decode(uq112x112 memory self) internal pure returns (uint112) { return uint112(self._x >> RESOLUTION); } // decode a UQ144x112 into a uint144 by truncating after the radix point function decode144(uq144x112 memory self) internal pure returns (uint144) { return uint144(self._x >> RESOLUTION); } // take the reciprocal of a UQ112x112 function reciprocal(uq112x112 memory self) internal pure returns (uq112x112 memory) { require(self._x != 0, 'FixedPoint: ZERO_RECIPROCAL'); return uq112x112(uint224(Q224 / self._x)); } // square root of a UQ112x112 function sqrt(uq112x112 memory self) internal pure returns (uq112x112 memory) { return uq112x112(uint224(Babylonian.sqrt(uint256(self._x)) << 56)); } }
pragma solidity ^0.6.0; library Safe112 { function add(uint112 a, uint112 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, 'Safe112: addition overflow'); return c; } function sub(uint112 a, uint112 b) internal pure returns (uint256) { return sub(a, b, 'Safe112: subtraction overflow'); } function sub( uint112 a, uint112 b, string memory errorMessage ) internal pure returns (uint112) { require(b <= a, errorMessage); uint112 c = a - b; return c; } function mul(uint112 a, uint112 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, 'Safe112: multiplication overflow'); return c; } function div(uint112 a, uint112 b) internal pure returns (uint256) { return div(a, b, 'Safe112: division by zero'); } function div( uint112 a, uint112 b, string memory errorMessage ) internal pure returns (uint112) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint112 c = a / b; return c; } function mod(uint112 a, uint112 b) internal pure returns (uint256) { return mod(a, b, 'Safe112: modulo by zero'); } function mod( uint112 a, uint112 b, string memory errorMessage ) internal pure returns (uint112) { require(b != 0, errorMessage); return a % b; } }
pragma solidity ^0.6.0; import '@openzeppelin/contracts/GSN/Context.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; contract Operator is Context, Ownable { address private _operator; event OperatorTransferred( address indexed previousOperator, address indexed newOperator ); constructor() internal { _operator = _msgSender(); emit OperatorTransferred(address(0), _operator); } function operator() public view returns (address) { return _operator; } modifier onlyOperator() { require( _operator == msg.sender, 'operator: caller is not the operator' ); _; } function isOperator() public view returns (bool) { return _msgSender() == _operator; } function transferOperator(address newOperator_) public onlyOwner { _transferOperator(newOperator_); } function _transferOperator(address newOperator_) internal { require( newOperator_ != address(0), 'operator: zero address given for new operator' ); emit OperatorTransferred(address(0), newOperator_); _operator = newOperator_; } }
pragma solidity ^0.6.12; contract ContractGuard { mapping(uint256 => mapping(address => bool)) private _status; function checkSameOriginReentranted() internal view returns (bool) { return _status[block.number][tx.origin]; } function checkSameSenderReentranted() internal view returns (bool) { return _status[block.number][msg.sender]; } modifier onlyOneBlock() { require( !checkSameOriginReentranted(), 'ContractGuard: one block, one function' ); require( !checkSameSenderReentranted(), 'ContractGuard: one block, one function' ); _; _status[block.number][tx.origin] = true; _status[block.number][msg.sender] = true; } }
pragma solidity ^0.6.0; import '@openzeppelin/contracts/math/Math.sol'; import '@openzeppelin/contracts/math/SafeMath.sol'; import '../owner/Operator.sol'; contract Epoch is Operator { using SafeMath for uint256; uint256 private period; uint256 private startTime; uint256 private lastExecutedAt; /* ========== CONSTRUCTOR ========== */ constructor( uint256 _period, uint256 _startTime, uint256 _startEpoch ) public { require(_startTime > block.timestamp, 'Epoch: invalid start time'); period = _period; startTime = _startTime; lastExecutedAt = startTime.add(_startEpoch.mul(period)); } /* ========== Modifier ========== */ modifier checkStartTime { require(now >= startTime, 'Epoch: not started yet'); _; } modifier checkEpoch { require(now > startTime, 'Epoch: not started yet'); require(callable(), 'Epoch: not allowed'); _; lastExecutedAt = block.timestamp; } /* ========== VIEW FUNCTIONS ========== */ function callable() public view returns (bool) { return getCurrentEpoch() >= getNextEpoch(); } // epoch function getLastEpoch() public view returns (uint256) { return lastExecutedAt.sub(startTime).div(period); } function getCurrentEpoch() public view returns (uint256) { return Math.max(startTime, block.timestamp).sub(startTime).div(period); } function getNextEpoch() public view returns (uint256) { if (startTime == lastExecutedAt) { return getLastEpoch(); } return getLastEpoch().add(1); } function nextEpochPoint() public view returns (uint256) { return startTime.add(getNextEpoch().mul(period)); } // params function getPeriod() public view returns (uint256) { return period; } function getStartTime() public view returns (uint256) { return startTime; } /* ========== GOVERNANCE ========== */ function setPeriod(uint256 _period) external onlyOperator { period = _period; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; import "../GSN/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ 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); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; import "./IERC20.sol"; import "../../math/SafeMath.sol"; import "../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ 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)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length 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)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. 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"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ 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"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ 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"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ 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"); return _functionCallWithValue(target, data, value, 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); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "istanbul", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_cash","type":"address"},{"internalType":"address","name":"_bond","type":"address"},{"internalType":"address","name":"_share","type":"address"},{"internalType":"address","name":"_bondOracle","type":"address"},{"internalType":"address","name":"_seigniorageOracle","type":"address"},{"internalType":"address","name":"_boardroom","type":"address"},{"internalType":"address","name":"_boardroomLp","type":"address"},{"internalType":"address","name":"_fund","type":"address"},{"internalType":"address","name":"_curve","type":"address"},{"internalType":"uint256","name":"_startTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"BoardroomFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"boardroom","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"BoardroomFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"BoardroomRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"address","name":"oldOracle","type":"address"},{"indexed":false,"internalType":"address","name":"newOracle","type":"address"}],"name":"BondOracleChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BoughtBonds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"address","name":"oldCurve","type":"address"},{"indexed":false,"internalType":"address","name":"newCurve","type":"address"}],"name":"CeilingCurveChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"address","name":"oldFund","type":"address"},{"indexed":false,"internalType":"address","name":"newFund","type":"address"}],"name":"ContributionPoolChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"ContributionPoolFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"ContributionPoolRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"uint256","name":"at","type":"uint256"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"}],"name":"Migration","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RedeemedBonds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"address","name":"oldOracle","type":"address"},{"indexed":false,"internalType":"address","name":"newOracle","type":"address"}],"name":"SeigniorageOracleChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"TreasuryFunded","type":"event"},{"inputs":[],"name":"accumulatedSeigniorage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allocateSeigniorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"boardroom","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boardroomAllocationRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boardroomLp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bond","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"targetPrice","type":"uint256"}],"name":"buyBonds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"callable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cash","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cashPriceOne","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundAllocationRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBondOraclePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCeilingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSeigniorageOraclePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBondOracleEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextEpochPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redeemBonds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seigniorageOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sendCash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"setBoardroomAllocationRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOracle","type":"address"}],"name":"setBondOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCurve","type":"address"}],"name":"setCeilingCurve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFund","type":"address"}],"name":"setFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"setFundAllocationRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOracle","type":"address"}],"name":"setSeigniorageOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"share","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator_","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526006805461ffff191690556000601081905560118190556012908155601355601e6014553480156200003557600080fd5b506040516200456d3803806200456d83398181016040526101408110156200005c57600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e0880151610100890151610120909901519798969795969495939492939192909161708081600080620000b0620002ad565b600180546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062000108620002ad565b600280546001600160a01b0319166001600160a01b0392831617908190556040519116906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3428211620001a9576040805162461bcd60e51b815260206004820152601960248201527f45706f63683a20696e76616c69642073746172742074696d6500000000000000604482015290519081900360640190fd5b60038390556004829055620001e6620001cf8285620002b1602090811b6200343e17901c565b6004546200031860201b620034a01790919060201c565b6005555050600780546001600160a01b03199081166001600160a01b039d8e16179091556008805482169b8d169b909b17909a555050600980548916978a1697909717909655600a8054881696891696909617909555600d8054871694881694909417909355600e8054861692871692909217909155600b80548516918616919091179055600c8054909316908416179091556006805462010000600160b01b031916620100009290931691909102919091179055670de0b6b3a7640000600f5562000373565b3390565b600082620002c25750600062000312565b82820282848281620002d057fe5b04146200030f5760405162461bcd60e51b81526004018080602001828103825260218152602001806200454c6021913960400191505060405180910390fd5b90505b92915050565b6000828201838110156200030f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6141c980620003836000396000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c80639358928b11610167578063c39a1ec6116100ce578063d7dff48911610087578063d7dff48914610529578063e06e9c6514610531578063e189ce1414610557578063efe97d0514610574578063f1c98ffd1461057c578063f2fde38b14610599576102a0565b8063c39a1ec6146104a8578063c4020ca2146104b0578063c5967c26146104d6578063c828371e146104de578063ce5494bb146104e6578063d5a5e5041461050c576102a0565b8063a9cfc46e11610120578063a9cfc46e14610478578063b60d428814610480578063b8e2cf8e14610488578063b97dd9e214610490578063c1a2977214610498578063c1aa3900146104a0576102a0565b80639358928b1461043357806394ab01621461043b57806395b1828a14610443578063961be39114610460578063a871694f14610468578063a8d5fd6514610470576102a0565b806354f04a111161020b5780636a2ab602116101c45780636a2ab602146104035780636d19921d1461040b578063715018a6146104135780637165485d1461041b5780638129fc1c146104235780638da5cb5b1461042b576102a0565b806354f04a11146103b8578063570ca735146103db57806359bf5d39146103e35780635b756179146103eb5780635e02c51e146103f357806364c9ec6f146103fb576102a0565b806327aef8221161025d57806327aef8221461036a57806329605e77146103725780632c678c6414610398578063398bac63146103a05780634456eda2146103a85780634c359b49146103b0576102a0565b80630e21750f146102a55780630f3a9f65146102cd578063132eeaa7146102ea578063158ef93e1461030e5780631ed1010a1461032a5780631ed2419514610350575b600080fd5b6102cb600480360360208110156102bb57600080fd5b50356001600160a01b03166105bf565b005b6102cb600480360360208110156102e357600080fd5b5035610679565b6102f26106c7565b604080516001600160a01b039092168252519081900360200190f35b6103166106d6565b604080519115158252519081900360200190f35b6102cb6004803603602081101561034057600080fd5b50356001600160a01b03166106e4565b61035861078d565b60408051918252519081900360200190f35b610358610794565b6102cb6004803603602081101561038857600080fd5b50356001600160a01b031661079a565b610316610810565b610358610819565b610316610843565b610358610869565b6102cb600480360360408110156103ce57600080fd5b50803590602001356108ea565b6102f2610fda565b610358610fe9565b6102cb610fef565b6102f2611a5c565b6102f2611a6b565b610316611a7a565b6102f2611a93565b6102cb611aa2565b6102f2611b56565b6102cb611b65565b6102f2611f3c565b610358611f4b565b610358611fa1565b6102cb6004803603602081101561045957600080fd5b5035611fa7565b6102f2612036565b610358612045565b6102f261204b565b61035861205a565b6102f2612060565b610358612075565b61035861208d565b6103586120ad565b6103586120c5565b6102f26120cb565b6102cb600480360360208110156104c657600080fd5b50356001600160a01b03166120da565b610358612185565b6103586121a1565b6102cb600480360360208110156104fc57600080fd5b50356001600160a01b03166121a7565b6102cb6004803603602081101561052257600080fd5b5035612a97565b610358612b24565b6102cb6004803603602081101561054757600080fd5b50356001600160a01b0316612b2a565b6102cb6004803603602081101561056d57600080fd5b5035612bd5565b610358613225565b6102cb6004803603602081101561059257600080fd5b5035613255565b6102cb600480360360208110156105af57600080fd5b50356001600160a01b0316613333565b6002546001600160a01b031633146106085760405162461bcd60e51b81526004018080602001828103825260248152602001806140ea6024913960400191505060405180910390fd5b600680546001600160a01b038381166201000081810262010000600160b01b031985161790945560408051949093049190911680845260208401919091528151909233927fa10cd50e390804229d0e9687c2fd0f4e5257229e7e59316ad26097b92fcf531b92918290030190a25050565b6002546001600160a01b031633146106c25760405162461bcd60e51b81526004018080602001828103825260248152602001806140ea6024913960400191505060405180910390fd5b600355565b600e546001600160a01b031681565b600654610100900460ff1681565b6002546001600160a01b0316331461072d5760405162461bcd60e51b81526004018080602001828103825260248152602001806140ea6024913960400191505060405180910390fd5b600a80546001600160a01b0319166001600160a01b0383169081179091556040805182815260208101929092528051839233927f0c3b8dd6dcdb1124b1462422d9266e323787d01a814009a5d35cf16741b87bd692918290030190a25050565b6003545b90565b60125481565b6107a26134fa565b6001546001600160a01b03908116911614610804576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61080d816134fe565b50565b60065460ff1681565b600061083e60035461083860045460055461359b90919063ffffffff16565b906135dd565b905090565b6002546000906001600160a01b031661085a6134fa565b6001600160a01b031614905090565b600a546000906001600160a01b031663292f1f1c610885611f4b565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156108b957600080fd5b505afa1580156108cd573d6000803e3d6000fd5b505050506040513d60208110156108e357600080fd5b5051905090565b6108f261361f565b1561092e5760405162461bcd60e51b81526004018080602001828103825260268152602001806141386026913960400191505060405180910390fd5b61093661363e565b156109725760405162461bcd60e51b81526004018080602001828103825260268152602001806141386026913960400191505060405180910390fd5b60065460ff16156109bf576040805162461bcd60e51b8152602060048201526012602482015271151c99585cdd5c9e4e881b5a59dc985d195960721b604482015290519081900360640190fd5b600454421015610a0f576040805162461bcd60e51b8152602060048201526016602482015275115c1bd8da0e881b9bdd081cdd185c9d1959081e595d60521b604482015290519081900360640190fd5b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610a5357600080fd5b505afa158015610a67573d6000803e3d6000fd5b505050506040513d6020811015610a7d57600080fd5b50516001600160a01b0316148015610b0b57506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610ad457600080fd5b505afa158015610ae8573d6000803e3d6000fd5b505050506040513d6020811015610afe57600080fd5b50516001600160a01b0316145b8015610b8d57506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610b5657600080fd5b505afa158015610b6a573d6000803e3d6000fd5b505050506040513d6020811015610b8057600080fd5b50516001600160a01b0316145b8015610c0f5750600b546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610bd857600080fd5b505afa158015610bec573d6000803e3d6000fd5b505050506040513d6020811015610c0257600080fd5b50516001600160a01b0316145b8015610c915750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610c5a57600080fd5b505afa158015610c6e573d6000803e3d6000fd5b505050506040513d6020811015610c8457600080fd5b50516001600160a01b0316145b610cd0576040805162461bcd60e51b815260206004820152601e602482015260008051602061409a833981519152604482015290519081900360640190fd5b60008211610d0f5760405162461bcd60e51b81526004018080602001828103825260308152602001806140ba6030913960400191505060405180910390fd5b600d54600090610d27906001600160a01b031661365d565b905081811115610d7e576040805162461bcd60e51b815260206004820152601a60248201527f54726561737572793a2063617368207072696365206d6f766564000000000000604482015290519081900360640190fd5b600f548110610dbe5760405162461bcd60e51b8152600401808060200182810382526032815260200180613f9e6032913960400191505060405180910390fd5b610dc781613719565b610df183610dec670de0b6b3a76400006108388560115461343e90919063ffffffff16565b613860565b925060008311610e325760405162461bcd60e51b8152600401808060200182810382526021815260200180613fd06021913960400191505060405180910390fd5b610e54610e4b8261083886670de0b6b3a764000061343e565b6011549061359b565b6011556007546040805163079cc67960e41b81523360048201526024810186905290516001600160a01b03909216916379cc67909160448082019260009290919082900301818387803b158015610eaa57600080fd5b505af1158015610ebe573d6000803e3d6000fd5b50506008546001600160a01b031691506340c10f19905033610eec8461083888670de0b6b3a764000061343e565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610f3257600080fd5b505af1158015610f46573d6000803e3d6000fd5b505050506040513d6020811015610f5c57600080fd5b505060408051848152905133917fdbf5270c3cf4729fec4fdac76fda864aa4f3d14d657ad21772ac28f627141ed9919081900360200190a250610f9d613876565b5050436000908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b6002546001600160a01b031690565b60125490565b610ff761361f565b156110335760405162461bcd60e51b81526004018080602001828103825260268152602001806141386026913960400191505060405180910390fd5b61103b61363e565b156110775760405162461bcd60e51b81526004018080602001828103825260268152602001806141386026913960400191505060405180910390fd5b60065460ff16156110c4576040805162461bcd60e51b8152602060048201526012602482015271151c99585cdd5c9e4e881b5a59dc985d195960721b604482015290519081900360640190fd5b600454421015611114576040805162461bcd60e51b8152602060048201526016602482015275115c1bd8da0e881b9bdd081cdd185c9d1959081e595d60521b604482015290519081900360640190fd5b6004544211611163576040805162461bcd60e51b8152602060048201526016602482015275115c1bd8da0e881b9bdd081cdd185c9d1959081e595d60521b604482015290519081900360640190fd5b61116b611a7a565b6111b1576040805162461bcd60e51b8152602060048201526012602482015271115c1bd8da0e881b9bdd08185b1b1bddd95960721b604482015290519081900360640190fd5b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b1580156111f557600080fd5b505afa158015611209573d6000803e3d6000fd5b505050506040513d602081101561121f57600080fd5b50516001600160a01b03161480156112ad57506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561127657600080fd5b505afa15801561128a573d6000803e3d6000fd5b505050506040513d60208110156112a057600080fd5b50516001600160a01b0316145b801561132f57506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b1580156112f857600080fd5b505afa15801561130c573d6000803e3d6000fd5b505050506040513d602081101561132257600080fd5b50516001600160a01b0316145b80156113b15750600b546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561137a57600080fd5b505afa15801561138e573d6000803e3d6000fd5b505050506040513d60208110156113a457600080fd5b50516001600160a01b0316145b80156114335750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b1580156113fc57600080fd5b505afa158015611410573d6000803e3d6000fd5b505050506040513d602081101561142657600080fd5b50516001600160a01b0316145b611472576040805162461bcd60e51b815260206004820152601e602482015260008051602061409a833981519152604482015290519081900360640190fd5b61147a613876565b600e54600090611492906001600160a01b031661365d565b905061149c610869565b81116114a85750611a1d565b60006114bf600f548361359b90919063ffffffff16565b905060006114e1670de0b6b3a7640000610838846114db611f4b565b9061343e565b600754604080516340c10f1960e01b81523060048201526024810184905290519293506001600160a01b03909116916340c10f19916044808201926020929091908290030181600087803b15801561153857600080fd5b505af115801561154c573d6000803e3d6000fd5b505050506040513d602081101561156257600080fd5b505060135460009061157d906103e89061083890859061343e565b90508015611690576006546007546115a9916001600160a01b0391821691620100009091041683613a38565b60065460075460408051635ff03ed360e11b81526001600160a01b0392831660048201526024810185905260606044820152602060648201527f54726561737572793a20536569676e696f7261676520416c6c6f636174696f6e60848201529051620100009093049091169163bfe07da69160a48082019260009290919082900301818387803b15801561163c57600080fd5b505af1158015611650573d6000803e3d6000fd5b5050604080514281526020810185905281517f4caa64211297e9263667fef70732dc65ca7a8e8c60dc72539ed94518628212d09450908190039091019150a15b61169a828261359b565b915060006117a783601254600860009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116f357600080fd5b505afa158015611707573d6000803e3d6000fd5b505050506040513d602081101561171d57600080fd5b50511161172b576000610dec565b601254600854604080516318160ddd60e01b81529051610dec93926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561177557600080fd5b505afa158015611789573d6000803e3d6000fd5b505050506040513d602081101561179f57600080fd5b50519061359b565b905080156117fb576012546117bc90826134a0565b601255604080514281526020810183905281517ff705142bf09f04297640495ddf7c59b7fd6f51894c5aea9602d631cf05f0efc2929181900390910190a15b6000611807848361359b565b90508015611a1657600061182b60646108386014548561343e90919063ffffffff16565b600b5460075491925061184b916001600160a01b03908116911683613a38565b600b54604080516397ffe1d760e01b81526004810184905290516001600160a01b03909216916397ffe1d79160248082019260009290919082900301818387803b15801561189857600080fd5b505af11580156118ac573d6000803e3d6000fd5b5050604080514281526020810186905281517f03ca7276ab7799bf73fb79d27ff0610cd7049574f2508ef8445162833d439aea9450908190039091019150a1600b54604080516001600160a01b039092168252426020830152818101839052517f43b868e79ec643c2be4611adb7ff79486990879691676be239e07c5df78e970f9181900360600190a16000611942838361359b565b600c54600754919250611962916001600160a01b03908116911683613a38565b600c54604080516397ffe1d760e01b81526004810184905290516001600160a01b03909216916397ffe1d79160248082019260009290919082900301818387803b1580156119af57600080fd5b505af11580156119c3573d6000803e3d6000fd5b5050600c54604080516001600160a01b039092168252426020830152818101859052517f43b868e79ec643c2be4611adb7ff79486990879691676be239e07c5df78e970f9350908190036060019150a150505b5050505050505b42600555436000908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b600b546001600160a01b031681565b6008546001600160a01b031681565b6000611a84613225565b611a8c61208d565b1015905090565b600d546001600160a01b031681565b611aaa6134fa565b6001546001600160a01b03908116911614611b0c576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b600a546001600160a01b031681565b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611ba957600080fd5b505afa158015611bbd573d6000803e3d6000fd5b505050506040513d6020811015611bd357600080fd5b50516001600160a01b0316148015611c6157506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611c2a57600080fd5b505afa158015611c3e573d6000803e3d6000fd5b505050506040513d6020811015611c5457600080fd5b50516001600160a01b0316145b8015611ce357506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611cac57600080fd5b505afa158015611cc0573d6000803e3d6000fd5b505050506040513d6020811015611cd657600080fd5b50516001600160a01b0316145b8015611d655750600b546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611d2e57600080fd5b505afa158015611d42573d6000803e3d6000fd5b505050506040513d6020811015611d5857600080fd5b50516001600160a01b0316145b8015611de75750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611db057600080fd5b505afa158015611dc4573d6000803e3d6000fd5b505050506040513d6020811015611dda57600080fd5b50516001600160a01b0316145b611e26576040805162461bcd60e51b815260206004820152601e602482015260008051602061409a833981519152604482015290519081900360640190fd5b600654610100900460ff1615611e7b576040805162461bcd60e51b8152602060048201526015602482015274151c99585cdd5c9e4e881a5b9a5d1a585b1a5e9959605a1b604482015290519081900360640190fd5b600754604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015611ec657600080fd5b505afa158015611eda573d6000803e3d6000fd5b505050506040513d6020811015611ef057600080fd5b50516012556006805461ff00191661010017905560408051438152905133917f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce79919081900360200190a2565b6001546001600160a01b031690565b600061083e601254600760009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561177557600080fd5b60115481565b6002546001600160a01b03163314611ff05760405162461bcd60e51b81526004018080602001828103825260248152602001806140ea6024913960400191505060405180910390fd5b60138054908290556040805182815260208101849052815133927fe14a4b2db56e384a354fe79614355263a5b44513757cdbd7595802b447318961928290030190a25050565b6007546001600160a01b031681565b60105481565b6009546001600160a01b031681565b600f5481565b6006546201000090046001600160a01b031681565b600e5460009061083e906001600160a01b031661365d565b600061083e6003546108386004546120a760045442613b50565b9061359b565b600d5460009061083e906001600160a01b031661365d565b60135481565b600c546001600160a01b031681565b6002546001600160a01b031633146121235760405162461bcd60e51b81526004018080602001828103825260248152602001806140ea6024913960400191505060405180910390fd5b600e80546001600160a01b038381166001600160a01b03198316811790935560408051919092168082526020820193909352815133927f4c420de9ce56e7d1cb19d1be595af322a8a25d82f2e8116dbb1290b995b99056928290030190a25050565b600061083e6121986003546114db613225565b600454906134a0565b60045490565b6002546001600160a01b031633146121f05760405162461bcd60e51b81526004018080602001828103825260248152602001806140ea6024913960400191505060405180910390fd5b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561223457600080fd5b505afa158015612248573d6000803e3d6000fd5b505050506040513d602081101561225e57600080fd5b50516001600160a01b03161480156122ec57506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b1580156122b557600080fd5b505afa1580156122c9573d6000803e3d6000fd5b505050506040513d60208110156122df57600080fd5b50516001600160a01b0316145b801561236e57506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561233757600080fd5b505afa15801561234b573d6000803e3d6000fd5b505050506040513d602081101561236157600080fd5b50516001600160a01b0316145b80156123f05750600b546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b1580156123b957600080fd5b505afa1580156123cd573d6000803e3d6000fd5b505050506040513d60208110156123e357600080fd5b50516001600160a01b0316145b80156124725750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561243b57600080fd5b505afa15801561244f573d6000803e3d6000fd5b505050506040513d602081101561246557600080fd5b50516001600160a01b0316145b6124b1576040805162461bcd60e51b815260206004820152601e602482015260008051602061409a833981519152604482015290519081900360640190fd5b60065460ff16156124fe576040805162461bcd60e51b8152602060048201526012602482015271151c99585cdd5c9e4e881b5a59dc985d195960721b604482015290519081900360640190fd5b600754604080516329605e7760e01b81526001600160a01b038481166004830152915191909216916329605e7791602480830192600092919082900301818387803b15801561254c57600080fd5b505af1158015612560573d6000803e3d6000fd5b50506007546040805163f2fde38b60e01b81526001600160a01b038681166004830152915191909216935063f2fde38b9250602480830192600092919082900301818387803b1580156125b257600080fd5b505af11580156125c6573d6000803e3d6000fd5b5050600754604080516370a0823160e01b815230600482015290516001600160a01b03909216935063a9059cbb9250849184916370a08231916024808301926020929190829003018186803b15801561261e57600080fd5b505afa158015612632573d6000803e3d6000fd5b505050506040513d602081101561264857600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561269957600080fd5b505af11580156126ad573d6000803e3d6000fd5b505050506040513d60208110156126c357600080fd5b5050600854604080516329605e7760e01b81526001600160a01b038481166004830152915191909216916329605e7791602480830192600092919082900301818387803b15801561271357600080fd5b505af1158015612727573d6000803e3d6000fd5b50506008546040805163f2fde38b60e01b81526001600160a01b038681166004830152915191909216935063f2fde38b9250602480830192600092919082900301818387803b15801561277957600080fd5b505af115801561278d573d6000803e3d6000fd5b5050600854604080516370a0823160e01b815230600482015290516001600160a01b03909216935063a9059cbb9250849184916370a08231916024808301926020929190829003018186803b1580156127e557600080fd5b505afa1580156127f9573d6000803e3d6000fd5b505050506040513d602081101561280f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b505050506040513d602081101561288a57600080fd5b5050600954604080516329605e7760e01b81526001600160a01b038481166004830152915191909216916329605e7791602480830192600092919082900301818387803b1580156128da57600080fd5b505af11580156128ee573d6000803e3d6000fd5b50506009546040805163f2fde38b60e01b81526001600160a01b038681166004830152915191909216935063f2fde38b9250602480830192600092919082900301818387803b15801561294057600080fd5b505af1158015612954573d6000803e3d6000fd5b5050600954604080516370a0823160e01b815230600482015290516001600160a01b03909216935063a9059cbb9250849184916370a08231916024808301926020929190829003018186803b1580156129ac57600080fd5b505afa1580156129c0573d6000803e3d6000fd5b505050506040513d60208110156129d657600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b158015612a2757600080fd5b505af1158015612a3b573d6000803e3d6000fd5b505050506040513d6020811015612a5157600080fd5b50506006805460ff191660011790556040516001600160a01b038216907f0caca70b66aed56b0630989a049110023c5a3f37e0ea4b6ce96fc747663f3ebc90600090a250565b600b546001600160a01b0316331480612aba5750600c546001600160a01b031633145b612afc576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b604482015290519081900360640190fd5b601254612b0990826134a0565b60125560075461080d906001600160a01b0316333084613b60565b60145481565b6002546001600160a01b03163314612b735760405162461bcd60e51b81526004018080602001828103825260248152602001806140ea6024913960400191505060405180910390fd5b600d80546001600160a01b038381166001600160a01b03198316811790935560408051919092168082526020820193909352815133927fcafe5bd353cebaf68e66afe57f24a25988157e8bb99f4233603eec0ab74a5f01928290030190a25050565b612bdd61361f565b15612c195760405162461bcd60e51b81526004018080602001828103825260268152602001806141386026913960400191505060405180910390fd5b612c2161363e565b15612c5d5760405162461bcd60e51b81526004018080602001828103825260268152602001806141386026913960400191505060405180910390fd5b60065460ff1615612caa576040805162461bcd60e51b8152602060048201526012602482015271151c99585cdd5c9e4e881b5a59dc985d195960721b604482015290519081900360640190fd5b600454421015612cfa576040805162461bcd60e51b8152602060048201526016602482015275115c1bd8da0e881b9bdd081cdd185c9d1959081e595d60521b604482015290519081900360640190fd5b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015612d3e57600080fd5b505afa158015612d52573d6000803e3d6000fd5b505050506040513d6020811015612d6857600080fd5b50516001600160a01b0316148015612df657506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015612dbf57600080fd5b505afa158015612dd3573d6000803e3d6000fd5b505050506040513d6020811015612de957600080fd5b50516001600160a01b0316145b8015612e7857506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015612e4157600080fd5b505afa158015612e55573d6000803e3d6000fd5b505050506040513d6020811015612e6b57600080fd5b50516001600160a01b0316145b8015612efa5750600b546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015612ec357600080fd5b505afa158015612ed7573d6000803e3d6000fd5b505050506040513d6020811015612eed57600080fd5b50516001600160a01b0316145b8015612f7c5750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015612f4557600080fd5b505afa158015612f59573d6000803e3d6000fd5b505050506040513d6020811015612f6f57600080fd5b50516001600160a01b0316145b612fbb576040805162461bcd60e51b815260206004820152601e602482015260008051602061409a833981519152604482015290519081900360640190fd5b60008111612ffa5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f70602e913960400191505060405180910390fd5b600d54600090613012906001600160a01b031661365d565b905061301c610869565b81116130595760405162461bcd60e51b8152600401808060200182810382526032815260200180613f9e6032913960400191505060405180910390fd5b600754604080516370a0823160e01b8152306004820152905184926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156130a357600080fd5b505afa1580156130b7573d6000803e3d6000fd5b505050506040513d60208110156130cd57600080fd5b5051101561310c5760405162461bcd60e51b815260040180806020018281038252602581526020018061401e6025913960400191505060405180910390fd5b61312461311b60125484613860565b6012549061359b565b6012556008546040805163079cc67960e41b81523360048201526024810185905290516001600160a01b03909216916379cc67909160448082019260009290919082900301818387803b15801561317a57600080fd5b505af115801561318e573d6000803e3d6000fd5b50506007546131aa92506001600160a01b031690503384613bc0565b60408051838152905133917f9c3478f12dce08d85673d802af16ed5b9ebab8420ffd7b145d65d3157084b2ce919081900360200190a2506131e9613876565b50436000908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b600060055460045414156132425761323b610819565b9050610791565b61083e600161324f610819565b906134a0565b6002546001600160a01b0316331461329e5760405162461bcd60e51b81526004018080602001828103825260248152602001806140ea6024913960400191505060405180910390fd5b60648111156132ed576040805162461bcd60e51b8152602060048201526016602482015275696e76616c696420626f617264726f6f6d207261746560501b604482015290519081900360640190fd5b60148054908290556040805182815260208101849052815133927f64bb0915a6c2c90e2baa01746f922b8cd5be198d0d6323dc14dcf60334d937ce928290030190a25050565b61333b6134fa565b6001546001600160a01b0390811691161461339d576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166133e25760405162461bcd60e51b8152600401808060200182810382526026815260200180613f4a6026913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60008261344d5750600061349a565b8282028284828161345a57fe5b04146134975760405162461bcd60e51b81526004018080602001828103825260218152602001806140436021913960400191505060405180910390fd5b90505b92915050565b600082820183811015613497576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b6001600160a01b0381166135435760405162461bcd60e51b815260040180806020018281038252602d815260200180613ff1602d913960400191505060405180910390fd5b6040516001600160a01b038216906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b600061349783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c12565b600061349783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ca9565b4360009081526020818152604080832032845290915290205460ff1690565b4360009081526020818152604080832033845290915290205460ff1690565b60075460408051633ddac95360e01b81526001600160a01b039283166004820152670de0b6b3a764000060248201529051600092841691633ddac953916044808301926020929190829003018186803b1580156136b957600080fd5b505afa9250505080156136de57506040513d60208110156136d957600080fd5b505160015b61349a5760405162461bcd60e51b81526004018080602001828103825260368152602001806140646036913960400191505060405180910390fd5b600d546040805163398bac6360e01b815290516000926001600160a01b03169163398bac63916004808301926020929190829003018186803b15801561375e57600080fd5b505afa158015613772573d6000803e3d6000fd5b505050506040513d602081101561378857600080fd5b5051601054909150811461385c57600f546000906137a6908461359b565b90506000600860009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156137f857600080fd5b505afa15801561380c573d6000803e3d6000fd5b505050506040513d602081101561382257600080fd5b5051905061383e670de0b6b3a7640000610838846114db611f4b565b601181905561385190610e4b9083613860565b601155505060108190555b5050565b600081831061386f5781613497565b5090919050565b600d60009054906101000a90046001600160a01b03166001600160a01b0316636a2ab6026040518163ffffffff1660e01b815260040160206040518083038186803b1580156138c457600080fd5b505afa1580156138d8573d6000803e3d6000fd5b505050506040513d60208110156138ee57600080fd5b50511561395857600d60009054906101000a90046001600160a01b03166001600160a01b031663a2e620456040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561394557600080fd5b505af1925050508015613956575060015b505b600e60009054906101000a90046001600160a01b03166001600160a01b0316636a2ab6026040518163ffffffff1660e01b815260040160206040518083038186803b1580156139a657600080fd5b505afa1580156139ba573d6000803e3d6000fd5b505050506040513d60208110156139d057600080fd5b505115613a3657600e60009054906101000a90046001600160a01b03166001600160a01b031663a2e620456040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613a2757600080fd5b505af192505050801561080d57505b565b801580613abe575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613a9057600080fd5b505afa158015613aa4573d6000803e3d6000fd5b505050506040513d6020811015613aba57600080fd5b5051155b613af95760405162461bcd60e51b815260040180806020018281038252603681526020018061415e6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052613b4b908490613d0e565b505050565b60008183101561386f5781613497565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613bba908590613d0e565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613b4b908490613d0e565b60008184841115613ca15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c66578181015183820152602001613c4e565b50505050905090810190601f168015613c935780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613cf85760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613c66578181015183820152602001613c4e565b506000838581613d0457fe5b0495945050505050565b6060613d63826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613dbf9092919063ffffffff16565b805190915015613b4b57808060200190516020811015613d8257600080fd5b5051613b4b5760405162461bcd60e51b815260040180806020018281038252602a81526020018061410e602a913960400191505060405180910390fd5b6060613dce8484600085613dd6565b949350505050565b6060613de185613f43565b613e32576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613e715780518252601f199092019160209182019101613e52565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613ed3576040519150601f19603f3d011682016040523d82523d6000602084013e613ed8565b606091505b50915091508115613eec579150613dce9050565b805115613efc5780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315613c66578181015183820152602001613c4e565b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737354726561737572793a2063616e6e6f742072656465656d20626f6e64732077697468207a65726f20616d6f756e7454726561737572793a20636173685072696365206e6f7420656c696769626c6520666f7220626f6e6420707572636861736554726561737572793a20616d6f756e74206578636565647320626f6e64206361706f70657261746f723a207a65726f206164647265737320676976656e20666f72206e6577206f70657261746f7254726561737572793a20747265617375727920686173206e6f206d6f726520627564676574536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7754726561737572793a206661696c656420746f20636f6e73756c7420636173682070726963652066726f6d20746865206f7261636c6554726561737572793a206e656564206d6f7265207065726d697373696f6e000054726561737572793a2063616e6e6f7420707572636861736520626f6e64732077697468207a65726f20616d6f756e746f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657261746f725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564436f6e747261637447756172643a206f6e6520626c6f636b2c206f6e652066756e6374696f6e5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220b5ec361763ba3f98b3035d4052e1aca90fad0c897ffa0552aaeaf7839ec29f4964736f6c634300060c0033536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f770000000000000000000000006974ddda7a474bfe41a7182158d26f33f5a9e63c00000000000000000000000003cae4637024a037195584d6f8bd6ffa7518ef030000000000000000000000000e05ea0af35a84548d28af4a4019d5d5c9c604d40000000000000000000000001cf2200da754b7cc4a9b254a7ebede7ce9d7f7060000000000000000000000004f9c300a6c174a0b3fcc41c03c7e2da98d0de0e300000000000000000000000095787fe1f98eea68203127d43e34c270e637dcc2000000000000000000000000a1632b84f5f0c2708ee0fc2369dccdfb8a233040000000000000000000000000f33a33aa8fa6244f3fb29a07c1e0583a47055394000000000000000000000000d895df0b8d2e4ba142af373d2022369aaa6e7ac600000000000000000000000000000000000000000000000000000000600eeb00
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102a05760003560e01c80639358928b11610167578063c39a1ec6116100ce578063d7dff48911610087578063d7dff48914610529578063e06e9c6514610531578063e189ce1414610557578063efe97d0514610574578063f1c98ffd1461057c578063f2fde38b14610599576102a0565b8063c39a1ec6146104a8578063c4020ca2146104b0578063c5967c26146104d6578063c828371e146104de578063ce5494bb146104e6578063d5a5e5041461050c576102a0565b8063a9cfc46e11610120578063a9cfc46e14610478578063b60d428814610480578063b8e2cf8e14610488578063b97dd9e214610490578063c1a2977214610498578063c1aa3900146104a0576102a0565b80639358928b1461043357806394ab01621461043b57806395b1828a14610443578063961be39114610460578063a871694f14610468578063a8d5fd6514610470576102a0565b806354f04a111161020b5780636a2ab602116101c45780636a2ab602146104035780636d19921d1461040b578063715018a6146104135780637165485d1461041b5780638129fc1c146104235780638da5cb5b1461042b576102a0565b806354f04a11146103b8578063570ca735146103db57806359bf5d39146103e35780635b756179146103eb5780635e02c51e146103f357806364c9ec6f146103fb576102a0565b806327aef8221161025d57806327aef8221461036a57806329605e77146103725780632c678c6414610398578063398bac63146103a05780634456eda2146103a85780634c359b49146103b0576102a0565b80630e21750f146102a55780630f3a9f65146102cd578063132eeaa7146102ea578063158ef93e1461030e5780631ed1010a1461032a5780631ed2419514610350575b600080fd5b6102cb600480360360208110156102bb57600080fd5b50356001600160a01b03166105bf565b005b6102cb600480360360208110156102e357600080fd5b5035610679565b6102f26106c7565b604080516001600160a01b039092168252519081900360200190f35b6103166106d6565b604080519115158252519081900360200190f35b6102cb6004803603602081101561034057600080fd5b50356001600160a01b03166106e4565b61035861078d565b60408051918252519081900360200190f35b610358610794565b6102cb6004803603602081101561038857600080fd5b50356001600160a01b031661079a565b610316610810565b610358610819565b610316610843565b610358610869565b6102cb600480360360408110156103ce57600080fd5b50803590602001356108ea565b6102f2610fda565b610358610fe9565b6102cb610fef565b6102f2611a5c565b6102f2611a6b565b610316611a7a565b6102f2611a93565b6102cb611aa2565b6102f2611b56565b6102cb611b65565b6102f2611f3c565b610358611f4b565b610358611fa1565b6102cb6004803603602081101561045957600080fd5b5035611fa7565b6102f2612036565b610358612045565b6102f261204b565b61035861205a565b6102f2612060565b610358612075565b61035861208d565b6103586120ad565b6103586120c5565b6102f26120cb565b6102cb600480360360208110156104c657600080fd5b50356001600160a01b03166120da565b610358612185565b6103586121a1565b6102cb600480360360208110156104fc57600080fd5b50356001600160a01b03166121a7565b6102cb6004803603602081101561052257600080fd5b5035612a97565b610358612b24565b6102cb6004803603602081101561054757600080fd5b50356001600160a01b0316612b2a565b6102cb6004803603602081101561056d57600080fd5b5035612bd5565b610358613225565b6102cb6004803603602081101561059257600080fd5b5035613255565b6102cb600480360360208110156105af57600080fd5b50356001600160a01b0316613333565b6002546001600160a01b031633146106085760405162461bcd60e51b81526004018080602001828103825260248152602001806140ea6024913960400191505060405180910390fd5b600680546001600160a01b038381166201000081810262010000600160b01b031985161790945560408051949093049190911680845260208401919091528151909233927fa10cd50e390804229d0e9687c2fd0f4e5257229e7e59316ad26097b92fcf531b92918290030190a25050565b6002546001600160a01b031633146106c25760405162461bcd60e51b81526004018080602001828103825260248152602001806140ea6024913960400191505060405180910390fd5b600355565b600e546001600160a01b031681565b600654610100900460ff1681565b6002546001600160a01b0316331461072d5760405162461bcd60e51b81526004018080602001828103825260248152602001806140ea6024913960400191505060405180910390fd5b600a80546001600160a01b0319166001600160a01b0383169081179091556040805182815260208101929092528051839233927f0c3b8dd6dcdb1124b1462422d9266e323787d01a814009a5d35cf16741b87bd692918290030190a25050565b6003545b90565b60125481565b6107a26134fa565b6001546001600160a01b03908116911614610804576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61080d816134fe565b50565b60065460ff1681565b600061083e60035461083860045460055461359b90919063ffffffff16565b906135dd565b905090565b6002546000906001600160a01b031661085a6134fa565b6001600160a01b031614905090565b600a546000906001600160a01b031663292f1f1c610885611f4b565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156108b957600080fd5b505afa1580156108cd573d6000803e3d6000fd5b505050506040513d60208110156108e357600080fd5b5051905090565b6108f261361f565b1561092e5760405162461bcd60e51b81526004018080602001828103825260268152602001806141386026913960400191505060405180910390fd5b61093661363e565b156109725760405162461bcd60e51b81526004018080602001828103825260268152602001806141386026913960400191505060405180910390fd5b60065460ff16156109bf576040805162461bcd60e51b8152602060048201526012602482015271151c99585cdd5c9e4e881b5a59dc985d195960721b604482015290519081900360640190fd5b600454421015610a0f576040805162461bcd60e51b8152602060048201526016602482015275115c1bd8da0e881b9bdd081cdd185c9d1959081e595d60521b604482015290519081900360640190fd5b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610a5357600080fd5b505afa158015610a67573d6000803e3d6000fd5b505050506040513d6020811015610a7d57600080fd5b50516001600160a01b0316148015610b0b57506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610ad457600080fd5b505afa158015610ae8573d6000803e3d6000fd5b505050506040513d6020811015610afe57600080fd5b50516001600160a01b0316145b8015610b8d57506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610b5657600080fd5b505afa158015610b6a573d6000803e3d6000fd5b505050506040513d6020811015610b8057600080fd5b50516001600160a01b0316145b8015610c0f5750600b546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610bd857600080fd5b505afa158015610bec573d6000803e3d6000fd5b505050506040513d6020811015610c0257600080fd5b50516001600160a01b0316145b8015610c915750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610c5a57600080fd5b505afa158015610c6e573d6000803e3d6000fd5b505050506040513d6020811015610c8457600080fd5b50516001600160a01b0316145b610cd0576040805162461bcd60e51b815260206004820152601e602482015260008051602061409a833981519152604482015290519081900360640190fd5b60008211610d0f5760405162461bcd60e51b81526004018080602001828103825260308152602001806140ba6030913960400191505060405180910390fd5b600d54600090610d27906001600160a01b031661365d565b905081811115610d7e576040805162461bcd60e51b815260206004820152601a60248201527f54726561737572793a2063617368207072696365206d6f766564000000000000604482015290519081900360640190fd5b600f548110610dbe5760405162461bcd60e51b8152600401808060200182810382526032815260200180613f9e6032913960400191505060405180910390fd5b610dc781613719565b610df183610dec670de0b6b3a76400006108388560115461343e90919063ffffffff16565b613860565b925060008311610e325760405162461bcd60e51b8152600401808060200182810382526021815260200180613fd06021913960400191505060405180910390fd5b610e54610e4b8261083886670de0b6b3a764000061343e565b6011549061359b565b6011556007546040805163079cc67960e41b81523360048201526024810186905290516001600160a01b03909216916379cc67909160448082019260009290919082900301818387803b158015610eaa57600080fd5b505af1158015610ebe573d6000803e3d6000fd5b50506008546001600160a01b031691506340c10f19905033610eec8461083888670de0b6b3a764000061343e565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610f3257600080fd5b505af1158015610f46573d6000803e3d6000fd5b505050506040513d6020811015610f5c57600080fd5b505060408051848152905133917fdbf5270c3cf4729fec4fdac76fda864aa4f3d14d657ad21772ac28f627141ed9919081900360200190a250610f9d613876565b5050436000908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b6002546001600160a01b031690565b60125490565b610ff761361f565b156110335760405162461bcd60e51b81526004018080602001828103825260268152602001806141386026913960400191505060405180910390fd5b61103b61363e565b156110775760405162461bcd60e51b81526004018080602001828103825260268152602001806141386026913960400191505060405180910390fd5b60065460ff16156110c4576040805162461bcd60e51b8152602060048201526012602482015271151c99585cdd5c9e4e881b5a59dc985d195960721b604482015290519081900360640190fd5b600454421015611114576040805162461bcd60e51b8152602060048201526016602482015275115c1bd8da0e881b9bdd081cdd185c9d1959081e595d60521b604482015290519081900360640190fd5b6004544211611163576040805162461bcd60e51b8152602060048201526016602482015275115c1bd8da0e881b9bdd081cdd185c9d1959081e595d60521b604482015290519081900360640190fd5b61116b611a7a565b6111b1576040805162461bcd60e51b8152602060048201526012602482015271115c1bd8da0e881b9bdd08185b1b1bddd95960721b604482015290519081900360640190fd5b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b1580156111f557600080fd5b505afa158015611209573d6000803e3d6000fd5b505050506040513d602081101561121f57600080fd5b50516001600160a01b03161480156112ad57506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561127657600080fd5b505afa15801561128a573d6000803e3d6000fd5b505050506040513d60208110156112a057600080fd5b50516001600160a01b0316145b801561132f57506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b1580156112f857600080fd5b505afa15801561130c573d6000803e3d6000fd5b505050506040513d602081101561132257600080fd5b50516001600160a01b0316145b80156113b15750600b546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561137a57600080fd5b505afa15801561138e573d6000803e3d6000fd5b505050506040513d60208110156113a457600080fd5b50516001600160a01b0316145b80156114335750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b1580156113fc57600080fd5b505afa158015611410573d6000803e3d6000fd5b505050506040513d602081101561142657600080fd5b50516001600160a01b0316145b611472576040805162461bcd60e51b815260206004820152601e602482015260008051602061409a833981519152604482015290519081900360640190fd5b61147a613876565b600e54600090611492906001600160a01b031661365d565b905061149c610869565b81116114a85750611a1d565b60006114bf600f548361359b90919063ffffffff16565b905060006114e1670de0b6b3a7640000610838846114db611f4b565b9061343e565b600754604080516340c10f1960e01b81523060048201526024810184905290519293506001600160a01b03909116916340c10f19916044808201926020929091908290030181600087803b15801561153857600080fd5b505af115801561154c573d6000803e3d6000fd5b505050506040513d602081101561156257600080fd5b505060135460009061157d906103e89061083890859061343e565b90508015611690576006546007546115a9916001600160a01b0391821691620100009091041683613a38565b60065460075460408051635ff03ed360e11b81526001600160a01b0392831660048201526024810185905260606044820152602060648201527f54726561737572793a20536569676e696f7261676520416c6c6f636174696f6e60848201529051620100009093049091169163bfe07da69160a48082019260009290919082900301818387803b15801561163c57600080fd5b505af1158015611650573d6000803e3d6000fd5b5050604080514281526020810185905281517f4caa64211297e9263667fef70732dc65ca7a8e8c60dc72539ed94518628212d09450908190039091019150a15b61169a828261359b565b915060006117a783601254600860009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116f357600080fd5b505afa158015611707573d6000803e3d6000fd5b505050506040513d602081101561171d57600080fd5b50511161172b576000610dec565b601254600854604080516318160ddd60e01b81529051610dec93926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561177557600080fd5b505afa158015611789573d6000803e3d6000fd5b505050506040513d602081101561179f57600080fd5b50519061359b565b905080156117fb576012546117bc90826134a0565b601255604080514281526020810183905281517ff705142bf09f04297640495ddf7c59b7fd6f51894c5aea9602d631cf05f0efc2929181900390910190a15b6000611807848361359b565b90508015611a1657600061182b60646108386014548561343e90919063ffffffff16565b600b5460075491925061184b916001600160a01b03908116911683613a38565b600b54604080516397ffe1d760e01b81526004810184905290516001600160a01b03909216916397ffe1d79160248082019260009290919082900301818387803b15801561189857600080fd5b505af11580156118ac573d6000803e3d6000fd5b5050604080514281526020810186905281517f03ca7276ab7799bf73fb79d27ff0610cd7049574f2508ef8445162833d439aea9450908190039091019150a1600b54604080516001600160a01b039092168252426020830152818101839052517f43b868e79ec643c2be4611adb7ff79486990879691676be239e07c5df78e970f9181900360600190a16000611942838361359b565b600c54600754919250611962916001600160a01b03908116911683613a38565b600c54604080516397ffe1d760e01b81526004810184905290516001600160a01b03909216916397ffe1d79160248082019260009290919082900301818387803b1580156119af57600080fd5b505af11580156119c3573d6000803e3d6000fd5b5050600c54604080516001600160a01b039092168252426020830152818101859052517f43b868e79ec643c2be4611adb7ff79486990879691676be239e07c5df78e970f9350908190036060019150a150505b5050505050505b42600555436000908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b600b546001600160a01b031681565b6008546001600160a01b031681565b6000611a84613225565b611a8c61208d565b1015905090565b600d546001600160a01b031681565b611aaa6134fa565b6001546001600160a01b03908116911614611b0c576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b600a546001600160a01b031681565b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611ba957600080fd5b505afa158015611bbd573d6000803e3d6000fd5b505050506040513d6020811015611bd357600080fd5b50516001600160a01b0316148015611c6157506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611c2a57600080fd5b505afa158015611c3e573d6000803e3d6000fd5b505050506040513d6020811015611c5457600080fd5b50516001600160a01b0316145b8015611ce357506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611cac57600080fd5b505afa158015611cc0573d6000803e3d6000fd5b505050506040513d6020811015611cd657600080fd5b50516001600160a01b0316145b8015611d655750600b546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611d2e57600080fd5b505afa158015611d42573d6000803e3d6000fd5b505050506040513d6020811015611d5857600080fd5b50516001600160a01b0316145b8015611de75750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611db057600080fd5b505afa158015611dc4573d6000803e3d6000fd5b505050506040513d6020811015611dda57600080fd5b50516001600160a01b0316145b611e26576040805162461bcd60e51b815260206004820152601e602482015260008051602061409a833981519152604482015290519081900360640190fd5b600654610100900460ff1615611e7b576040805162461bcd60e51b8152602060048201526015602482015274151c99585cdd5c9e4e881a5b9a5d1a585b1a5e9959605a1b604482015290519081900360640190fd5b600754604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015611ec657600080fd5b505afa158015611eda573d6000803e3d6000fd5b505050506040513d6020811015611ef057600080fd5b50516012556006805461ff00191661010017905560408051438152905133917f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce79919081900360200190a2565b6001546001600160a01b031690565b600061083e601254600760009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561177557600080fd5b60115481565b6002546001600160a01b03163314611ff05760405162461bcd60e51b81526004018080602001828103825260248152602001806140ea6024913960400191505060405180910390fd5b60138054908290556040805182815260208101849052815133927fe14a4b2db56e384a354fe79614355263a5b44513757cdbd7595802b447318961928290030190a25050565b6007546001600160a01b031681565b60105481565b6009546001600160a01b031681565b600f5481565b6006546201000090046001600160a01b031681565b600e5460009061083e906001600160a01b031661365d565b600061083e6003546108386004546120a760045442613b50565b9061359b565b600d5460009061083e906001600160a01b031661365d565b60135481565b600c546001600160a01b031681565b6002546001600160a01b031633146121235760405162461bcd60e51b81526004018080602001828103825260248152602001806140ea6024913960400191505060405180910390fd5b600e80546001600160a01b038381166001600160a01b03198316811790935560408051919092168082526020820193909352815133927f4c420de9ce56e7d1cb19d1be595af322a8a25d82f2e8116dbb1290b995b99056928290030190a25050565b600061083e6121986003546114db613225565b600454906134a0565b60045490565b6002546001600160a01b031633146121f05760405162461bcd60e51b81526004018080602001828103825260248152602001806140ea6024913960400191505060405180910390fd5b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561223457600080fd5b505afa158015612248573d6000803e3d6000fd5b505050506040513d602081101561225e57600080fd5b50516001600160a01b03161480156122ec57506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b1580156122b557600080fd5b505afa1580156122c9573d6000803e3d6000fd5b505050506040513d60208110156122df57600080fd5b50516001600160a01b0316145b801561236e57506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561233757600080fd5b505afa15801561234b573d6000803e3d6000fd5b505050506040513d602081101561236157600080fd5b50516001600160a01b0316145b80156123f05750600b546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b1580156123b957600080fd5b505afa1580156123cd573d6000803e3d6000fd5b505050506040513d60208110156123e357600080fd5b50516001600160a01b0316145b80156124725750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561243b57600080fd5b505afa15801561244f573d6000803e3d6000fd5b505050506040513d602081101561246557600080fd5b50516001600160a01b0316145b6124b1576040805162461bcd60e51b815260206004820152601e602482015260008051602061409a833981519152604482015290519081900360640190fd5b60065460ff16156124fe576040805162461bcd60e51b8152602060048201526012602482015271151c99585cdd5c9e4e881b5a59dc985d195960721b604482015290519081900360640190fd5b600754604080516329605e7760e01b81526001600160a01b038481166004830152915191909216916329605e7791602480830192600092919082900301818387803b15801561254c57600080fd5b505af1158015612560573d6000803e3d6000fd5b50506007546040805163f2fde38b60e01b81526001600160a01b038681166004830152915191909216935063f2fde38b9250602480830192600092919082900301818387803b1580156125b257600080fd5b505af11580156125c6573d6000803e3d6000fd5b5050600754604080516370a0823160e01b815230600482015290516001600160a01b03909216935063a9059cbb9250849184916370a08231916024808301926020929190829003018186803b15801561261e57600080fd5b505afa158015612632573d6000803e3d6000fd5b505050506040513d602081101561264857600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561269957600080fd5b505af11580156126ad573d6000803e3d6000fd5b505050506040513d60208110156126c357600080fd5b5050600854604080516329605e7760e01b81526001600160a01b038481166004830152915191909216916329605e7791602480830192600092919082900301818387803b15801561271357600080fd5b505af1158015612727573d6000803e3d6000fd5b50506008546040805163f2fde38b60e01b81526001600160a01b038681166004830152915191909216935063f2fde38b9250602480830192600092919082900301818387803b15801561277957600080fd5b505af115801561278d573d6000803e3d6000fd5b5050600854604080516370a0823160e01b815230600482015290516001600160a01b03909216935063a9059cbb9250849184916370a08231916024808301926020929190829003018186803b1580156127e557600080fd5b505afa1580156127f9573d6000803e3d6000fd5b505050506040513d602081101561280f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b505050506040513d602081101561288a57600080fd5b5050600954604080516329605e7760e01b81526001600160a01b038481166004830152915191909216916329605e7791602480830192600092919082900301818387803b1580156128da57600080fd5b505af11580156128ee573d6000803e3d6000fd5b50506009546040805163f2fde38b60e01b81526001600160a01b038681166004830152915191909216935063f2fde38b9250602480830192600092919082900301818387803b15801561294057600080fd5b505af1158015612954573d6000803e3d6000fd5b5050600954604080516370a0823160e01b815230600482015290516001600160a01b03909216935063a9059cbb9250849184916370a08231916024808301926020929190829003018186803b1580156129ac57600080fd5b505afa1580156129c0573d6000803e3d6000fd5b505050506040513d60208110156129d657600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b158015612a2757600080fd5b505af1158015612a3b573d6000803e3d6000fd5b505050506040513d6020811015612a5157600080fd5b50506006805460ff191660011790556040516001600160a01b038216907f0caca70b66aed56b0630989a049110023c5a3f37e0ea4b6ce96fc747663f3ebc90600090a250565b600b546001600160a01b0316331480612aba5750600c546001600160a01b031633145b612afc576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b604482015290519081900360640190fd5b601254612b0990826134a0565b60125560075461080d906001600160a01b0316333084613b60565b60145481565b6002546001600160a01b03163314612b735760405162461bcd60e51b81526004018080602001828103825260248152602001806140ea6024913960400191505060405180910390fd5b600d80546001600160a01b038381166001600160a01b03198316811790935560408051919092168082526020820193909352815133927fcafe5bd353cebaf68e66afe57f24a25988157e8bb99f4233603eec0ab74a5f01928290030190a25050565b612bdd61361f565b15612c195760405162461bcd60e51b81526004018080602001828103825260268152602001806141386026913960400191505060405180910390fd5b612c2161363e565b15612c5d5760405162461bcd60e51b81526004018080602001828103825260268152602001806141386026913960400191505060405180910390fd5b60065460ff1615612caa576040805162461bcd60e51b8152602060048201526012602482015271151c99585cdd5c9e4e881b5a59dc985d195960721b604482015290519081900360640190fd5b600454421015612cfa576040805162461bcd60e51b8152602060048201526016602482015275115c1bd8da0e881b9bdd081cdd185c9d1959081e595d60521b604482015290519081900360640190fd5b6007546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015612d3e57600080fd5b505afa158015612d52573d6000803e3d6000fd5b505050506040513d6020811015612d6857600080fd5b50516001600160a01b0316148015612df657506008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015612dbf57600080fd5b505afa158015612dd3573d6000803e3d6000fd5b505050506040513d6020811015612de957600080fd5b50516001600160a01b0316145b8015612e7857506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015612e4157600080fd5b505afa158015612e55573d6000803e3d6000fd5b505050506040513d6020811015612e6b57600080fd5b50516001600160a01b0316145b8015612efa5750600b546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015612ec357600080fd5b505afa158015612ed7573d6000803e3d6000fd5b505050506040513d6020811015612eed57600080fd5b50516001600160a01b0316145b8015612f7c5750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015612f4557600080fd5b505afa158015612f59573d6000803e3d6000fd5b505050506040513d6020811015612f6f57600080fd5b50516001600160a01b0316145b612fbb576040805162461bcd60e51b815260206004820152601e602482015260008051602061409a833981519152604482015290519081900360640190fd5b60008111612ffa5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f70602e913960400191505060405180910390fd5b600d54600090613012906001600160a01b031661365d565b905061301c610869565b81116130595760405162461bcd60e51b8152600401808060200182810382526032815260200180613f9e6032913960400191505060405180910390fd5b600754604080516370a0823160e01b8152306004820152905184926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156130a357600080fd5b505afa1580156130b7573d6000803e3d6000fd5b505050506040513d60208110156130cd57600080fd5b5051101561310c5760405162461bcd60e51b815260040180806020018281038252602581526020018061401e6025913960400191505060405180910390fd5b61312461311b60125484613860565b6012549061359b565b6012556008546040805163079cc67960e41b81523360048201526024810185905290516001600160a01b03909216916379cc67909160448082019260009290919082900301818387803b15801561317a57600080fd5b505af115801561318e573d6000803e3d6000fd5b50506007546131aa92506001600160a01b031690503384613bc0565b60408051838152905133917f9c3478f12dce08d85673d802af16ed5b9ebab8420ffd7b145d65d3157084b2ce919081900360200190a2506131e9613876565b50436000908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b600060055460045414156132425761323b610819565b9050610791565b61083e600161324f610819565b906134a0565b6002546001600160a01b0316331461329e5760405162461bcd60e51b81526004018080602001828103825260248152602001806140ea6024913960400191505060405180910390fd5b60648111156132ed576040805162461bcd60e51b8152602060048201526016602482015275696e76616c696420626f617264726f6f6d207261746560501b604482015290519081900360640190fd5b60148054908290556040805182815260208101849052815133927f64bb0915a6c2c90e2baa01746f922b8cd5be198d0d6323dc14dcf60334d937ce928290030190a25050565b61333b6134fa565b6001546001600160a01b0390811691161461339d576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166133e25760405162461bcd60e51b8152600401808060200182810382526026815260200180613f4a6026913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60008261344d5750600061349a565b8282028284828161345a57fe5b04146134975760405162461bcd60e51b81526004018080602001828103825260218152602001806140436021913960400191505060405180910390fd5b90505b92915050565b600082820183811015613497576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b6001600160a01b0381166135435760405162461bcd60e51b815260040180806020018281038252602d815260200180613ff1602d913960400191505060405180910390fd5b6040516001600160a01b038216906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b600061349783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c12565b600061349783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ca9565b4360009081526020818152604080832032845290915290205460ff1690565b4360009081526020818152604080832033845290915290205460ff1690565b60075460408051633ddac95360e01b81526001600160a01b039283166004820152670de0b6b3a764000060248201529051600092841691633ddac953916044808301926020929190829003018186803b1580156136b957600080fd5b505afa9250505080156136de57506040513d60208110156136d957600080fd5b505160015b61349a5760405162461bcd60e51b81526004018080602001828103825260368152602001806140646036913960400191505060405180910390fd5b600d546040805163398bac6360e01b815290516000926001600160a01b03169163398bac63916004808301926020929190829003018186803b15801561375e57600080fd5b505afa158015613772573d6000803e3d6000fd5b505050506040513d602081101561378857600080fd5b5051601054909150811461385c57600f546000906137a6908461359b565b90506000600860009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156137f857600080fd5b505afa15801561380c573d6000803e3d6000fd5b505050506040513d602081101561382257600080fd5b5051905061383e670de0b6b3a7640000610838846114db611f4b565b601181905561385190610e4b9083613860565b601155505060108190555b5050565b600081831061386f5781613497565b5090919050565b600d60009054906101000a90046001600160a01b03166001600160a01b0316636a2ab6026040518163ffffffff1660e01b815260040160206040518083038186803b1580156138c457600080fd5b505afa1580156138d8573d6000803e3d6000fd5b505050506040513d60208110156138ee57600080fd5b50511561395857600d60009054906101000a90046001600160a01b03166001600160a01b031663a2e620456040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561394557600080fd5b505af1925050508015613956575060015b505b600e60009054906101000a90046001600160a01b03166001600160a01b0316636a2ab6026040518163ffffffff1660e01b815260040160206040518083038186803b1580156139a657600080fd5b505afa1580156139ba573d6000803e3d6000fd5b505050506040513d60208110156139d057600080fd5b505115613a3657600e60009054906101000a90046001600160a01b03166001600160a01b031663a2e620456040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613a2757600080fd5b505af192505050801561080d57505b565b801580613abe575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613a9057600080fd5b505afa158015613aa4573d6000803e3d6000fd5b505050506040513d6020811015613aba57600080fd5b5051155b613af95760405162461bcd60e51b815260040180806020018281038252603681526020018061415e6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052613b4b908490613d0e565b505050565b60008183101561386f5781613497565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613bba908590613d0e565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613b4b908490613d0e565b60008184841115613ca15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c66578181015183820152602001613c4e565b50505050905090810190601f168015613c935780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613cf85760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613c66578181015183820152602001613c4e565b506000838581613d0457fe5b0495945050505050565b6060613d63826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613dbf9092919063ffffffff16565b805190915015613b4b57808060200190516020811015613d8257600080fd5b5051613b4b5760405162461bcd60e51b815260040180806020018281038252602a81526020018061410e602a913960400191505060405180910390fd5b6060613dce8484600085613dd6565b949350505050565b6060613de185613f43565b613e32576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613e715780518252601f199092019160209182019101613e52565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613ed3576040519150601f19603f3d011682016040523d82523d6000602084013e613ed8565b606091505b50915091508115613eec579150613dce9050565b805115613efc5780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315613c66578181015183820152602001613c4e565b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737354726561737572793a2063616e6e6f742072656465656d20626f6e64732077697468207a65726f20616d6f756e7454726561737572793a20636173685072696365206e6f7420656c696769626c6520666f7220626f6e6420707572636861736554726561737572793a20616d6f756e74206578636565647320626f6e64206361706f70657261746f723a207a65726f206164647265737320676976656e20666f72206e6577206f70657261746f7254726561737572793a20747265617375727920686173206e6f206d6f726520627564676574536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7754726561737572793a206661696c656420746f20636f6e73756c7420636173682070726963652066726f6d20746865206f7261636c6554726561737572793a206e656564206d6f7265207065726d697373696f6e000054726561737572793a2063616e6e6f7420707572636861736520626f6e64732077697468207a65726f20616d6f756e746f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657261746f725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564436f6e747261637447756172643a206f6e6520626c6f636b2c206f6e652066756e6374696f6e5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220b5ec361763ba3f98b3035d4052e1aca90fad0c897ffa0552aaeaf7839ec29f4964736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006974ddda7a474bfe41a7182158d26f33f5a9e63c00000000000000000000000003cae4637024a037195584d6f8bd6ffa7518ef030000000000000000000000000e05ea0af35a84548d28af4a4019d5d5c9c604d40000000000000000000000001cf2200da754b7cc4a9b254a7ebede7ce9d7f7060000000000000000000000004f9c300a6c174a0b3fcc41c03c7e2da98d0de0e300000000000000000000000095787fe1f98eea68203127d43e34c270e637dcc2000000000000000000000000a1632b84f5f0c2708ee0fc2369dccdfb8a233040000000000000000000000000f33a33aa8fa6244f3fb29a07c1e0583a47055394000000000000000000000000d895df0b8d2e4ba142af373d2022369aaa6e7ac600000000000000000000000000000000000000000000000000000000600eeb00
-----Decoded View---------------
Arg [0] : _cash (address): 0x6974DddA7A474Bfe41A7182158D26F33F5a9E63c
Arg [1] : _bond (address): 0x03CAE4637024A037195584d6f8bd6fFA7518EF03
Arg [2] : _share (address): 0x0e05Ea0Af35a84548D28af4A4019D5d5C9c604d4
Arg [3] : _bondOracle (address): 0x1cf2200da754B7cc4a9B254A7eBEdE7CE9D7F706
Arg [4] : _seigniorageOracle (address): 0x4F9c300a6c174a0B3FCC41c03c7e2DA98D0de0E3
Arg [5] : _boardroom (address): 0x95787fe1f98eEA68203127D43E34C270e637dCc2
Arg [6] : _boardroomLp (address): 0xa1632b84F5f0c2708EE0FC2369dccdFb8a233040
Arg [7] : _fund (address): 0xf33a33aa8fa6244F3fB29a07C1e0583A47055394
Arg [8] : _curve (address): 0xD895dF0b8d2E4BA142af373D2022369aaA6E7AC6
Arg [9] : _startTime (uint256): 1611590400
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000006974ddda7a474bfe41a7182158d26f33f5a9e63c
Arg [1] : 00000000000000000000000003cae4637024a037195584d6f8bd6ffa7518ef03
Arg [2] : 0000000000000000000000000e05ea0af35a84548d28af4a4019d5d5c9c604d4
Arg [3] : 0000000000000000000000001cf2200da754b7cc4a9b254a7ebede7ce9d7f706
Arg [4] : 0000000000000000000000004f9c300a6c174a0b3fcc41c03c7e2da98d0de0e3
Arg [5] : 00000000000000000000000095787fe1f98eea68203127d43e34c270e637dcc2
Arg [6] : 000000000000000000000000a1632b84f5f0c2708ee0fc2369dccdfb8a233040
Arg [7] : 000000000000000000000000f33a33aa8fa6244f3fb29a07c1e0583a47055394
Arg [8] : 000000000000000000000000d895df0b8d2e4ba142af373d2022369aaa6e7ac6
Arg [9] : 00000000000000000000000000000000000000000000000000000000600eeb00
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.