Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
9685356 | 1686 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
DaiBackstopSyndicateV0
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-03-16 */ pragma solidity 0.5.16; interface IDaiBackstopSyndicate { event AuctionEntered(uint256 auctionId, uint256 mkrAsk, uint256 daiBid); event AuctionFinalized(uint256 auctionId); enum Status { ACCEPTING_DEPOSITS, ACTIVATED, DEACTIVATED } // Anyone can deposit Dai up until the auctions have started at 1:1 function enlist(uint256 daiAmount) external returns (uint256 backstopTokensMinted); // Anyone can withdraw at any point as long as Dai is not locked in auctions function defect(uint256 backstopTokenAmount) external returns (uint256 daiRedeemed, uint256 mkrRedeemed); // Anyone can enter an auction for the syndicate, bidding Dai in return for MKR function enterAuction(uint256 auctionId) external; // Anyone can finalize an auction, returning the Dai or MKR to the syndicate function finalizeAuction(uint256 auctionId) external; // An owner can halt all new deposits and auctions (but not withdrawals or ongoing auctions) function ceaseFire() external; function getStatus() external view returns (Status status); function getActiveAuctions() external view returns (uint256[] memory activeAuctions); } interface IJoin { function join(address, uint256) external; function exit(address, uint256) external; } interface IVat { function dai(address) external view returns (uint256); function hope(address) external; function move(address, address, uint256) external; } interface IFlopper { // --- Auth --- // caller authorization (1 = authorized, 0 = not authorized) function wards(address) external view returns (uint256); // authorize caller function rely(address usr) external; // deauthorize caller function deny(address usr) external; // Bid objects function bids(uint256) external view returns ( uint256 bid, uint256 lot, address guy, uint48 tic, uint48 end ); // DAI contract address function vat() external view returns (address); // MKR contract address function gem() external view returns (address); // num decimals (constant) function ONE() external pure returns (uint256); // minimum bid increase (config - 5% initial) function beg() external view returns (uint256); // initial lot increase (config - 50% initial) function pad() external view returns (uint256); // bid lifetime (config - 3 hours initial) function ttl() external view returns (uint48); // total auction length (config - 2 days initial) function tau() external view returns (uint48); // number of auctions function kicks() external view returns (uint256); // status of the auction (1 = active, 0 = disabled) function live() external view returns (uint256); // user who shut down flopper mechanism and paid off last bid function vow() external view returns (address); // --- Events --- event Kick(uint256 id, uint256 lot, uint256 bid, address indexed gal); // --- Admin --- function file(bytes32 what, uint256 data) external; // --- Auction --- // create an auction // access control: authed // state machine: after auction expired // gal - recipient of the dai // lot - amount of mkr to mint // bid - amount of dai to pay // id - id of the auction function kick(address gal, uint256 lot, uint256 bid) external returns (uint256 id); // extend the auction and increase minimum maker amount minted // access control: not-authed // state machine: after auction expiry, before first bid // id - id of the auction function tick(uint256 id) external; // bid up auction and refund locked up dai to previous bidder // access control: not-authed // state machine: before auction expired // id - id of the auction // lot - amount of mkr to mint // bid - amount of dai to pay function dent(uint256 id, uint256 lot, uint256 bid) external; // finalize auction // access control: not-authed // state machine: after auction expired // id - id of the auction function deal(uint256 id) external; // --- Shutdown --- // shutdown flopper mechanism // access control: authed // state machine: anytime function cage() external; // get cancelled bid back // access control: authed // state machine: after shutdown function yank(uint256 id) external; } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); 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) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); 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) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see `ERC20Detailed`. */ 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. * * > 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); } /** * @dev Implementation of the `IERC20` interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using `_mint`. * For a generic mechanism see `ERC20Mintable`. * * *For a detailed writeup see our guide [How to implement supply * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).* * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an `Approval` event is emitted on calls to `transferFrom`. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard `decreaseAllowance` and `increaseAllowance` * functions have been added to mitigate the well-known issues around setting * allowances. See `IERC20.approve`. */ contract ERC20 is IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See `IERC20.totalSupply`. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See `IERC20.balanceOf`. */ function balanceOf(address account) public view returns (uint256) { return _balances[account]; } /** * @dev See `IERC20.transfer`. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public returns (bool) { _transfer(msg.sender, recipient, amount); return true; } /** * @dev See `IERC20.allowance`. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See `IERC20.approve`. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 value) public returns (bool) { _approve(msg.sender, spender, value); return true; } /** * @dev See `IERC20.transferFrom`. * * Emits an `Approval` event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of `ERC20`; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `value`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount)); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to `approve` that can be used as a mitigation for * problems described in `IERC20.approve`. * * Emits an `Approval` event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to `approve` that can be used as a mitigation for * problems described in `IERC20.approve`. * * Emits an `Approval` event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue)); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to `transfer`, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a `Transfer` event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _balances[sender] = _balances[sender].sub(amount); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a `Transfer` event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destoys `amount` tokens from `account`, reducing the * total supply. * * Emits a `Transfer` event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 value) internal { require(account != address(0), "ERC20: burn from the zero address"); _totalSupply = _totalSupply.sub(value); _balances[account] = _balances[account].sub(value); emit Transfer(account, address(0), value); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an `Approval` event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 value) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = value; emit Approval(owner, spender, value); } /** * @dev Destoys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See `_burn` and `_approve`. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount)); } } contract SimpleFlopper { // A "flopper" is a contract for auctioning off MKR in exchange for Dai. IFlopper internal constant _auction = IFlopper( 0x4D95A049d5B0b7d32058cd3F2163015747522e99 ); // Getters // /// @notice Get the status of the flopper contract /// @return bool status true if auction contract is enabled function isEnabled() public view returns (bool status) { return (_auction.live() == 1) ? true : false; } /// @notice Get the id of the latest auction /// @return auctionID uint256 id function getTotalNumberOfAuctions() public view returns (uint256 auctionID) { return _auction.kicks(); } /// @notice Get the address of the MKR token /// @return MKR address of maker token function getMKRAddress() public view returns (address mkr) { return _auction.gem(); } /// @notice Get the address of the DAI token /// @return DAI address of maker token function getDaiAddress() public view returns (address dai) { return _auction.vat(); } /// @notice Get the address of the auction contract (Flopper) /// @return Auction address function getFlopperAddress() public view returns (address flopper) { return address(_auction); } /// @notice Get the flopper contract config /// @return bidIncrement uint256 minimum bid increment as percentage (initial = 1.05E18) /// @return repriceIncrement uint256 reprice increment as percentage (initial = 1.50E18) /// @return bidDuration uint256 duration of a bid in seconds (initial = 3 hours) /// @return auctionDuration uint256 initial duration of an auction in seconds (initial = 2 days) function getAuctionInformation() public view returns ( uint256 bidIncrement, uint256 repriceIncrement, uint256 bidDuration, uint256 auctionDuration ) { return (_auction.beg(), _auction.pad(), _auction.ttl(), _auction.tau()); } /// @notice Get the winning bid for an auction /// @return amountDAI uint256 amount of DAI to be burned /// @return amountMKR uint256 amount of MKR to be minted /// @return bidder address account who placed bid /// @return bidDeadline uint48 deadline of bid /// @return auctionDeadline uint48 deadline of auction function getCurrentBid(uint256 auctionID) public view returns ( uint256 amountDAI, uint256 amountMKR, address bidder, uint48 bidDeadline, uint48 auctionDeadline ) { return _auction.bids(auctionID); } // Setters // /// @notice Extend and reprice expired auction with no bid /// @dev state machine: after auction expiry, before first bid /// @param auctionID uint256 id of the auction function _reprice(uint256 auctionID) internal { _auction.tick(auctionID); } /// @notice Add bid to a live auction, if first bid this transfers DAI to vat /// @dev state machine: before auction expired /// @param auctionID uint256 id of the auction function _bid(uint256 auctionID, uint256 amountMKR, uint256 amountDAI) internal { _auction.dent(auctionID, amountMKR, amountDAI); } /// @notice Finalize an auction with a winning bid and release maker /// @dev state machine: after auction expired /// @param auctionID uint256 id of the auction function _finalize(uint256 auctionID) internal { _auction.deal(auctionID); } } /** * @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. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be aplied to your functions to restrict their use to * the owner. * * In order to transfer ownership, a recipient must be specified, at which point * the specified recipient can call `acceptOwnership` and take ownership. */ contract TwoStepOwnable { address private _owner; address private _newPotentialOwner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initialize contract by setting transaction submitter as initial owner. */ constructor() internal { _owner = tx.origin; emit OwnershipTransferred(address(0), _owner); } /** * @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(isOwner(), "TwoStepOwnable: caller is not the owner."); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Allows a new account (`newOwner`) to accept ownership. * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { require( newOwner != address(0), "TwoStepOwnable: new potential owner is the zero address." ); _newPotentialOwner = newOwner; } /** * @dev Cancel a transfer of ownership to a new account. * Can only be called by the current owner. */ function cancelOwnershipTransfer() public onlyOwner { delete _newPotentialOwner; } /** * @dev Transfers ownership of the contract to the caller. * Can only be called by a new potential owner set by the current owner. */ function acceptOwnership() public { require( msg.sender == _newPotentialOwner, "TwoStepOwnable: current owner must set caller as new potential owner." ); delete _newPotentialOwner; emit OwnershipTransferred(_owner, msg.sender); _owner = msg.sender; } } /** * Adapted from OpenZeppelin's address version of the same, written by Alberto Cuesta Cañada: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/5dfe7215a9156465d550030eadc08770503b2b2f/ * contracts/utils/EnumerableSet.sol */ library EnumerableSet { struct AuctionIDSet { // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (uint256 => uint256) index; uint256[] values; } /** * @dev Add a value to a set. O(1). * Returns false if the value was already in the set. */ function add(AuctionIDSet storage set, uint256 value) internal returns (bool) { if (!contains(set, value)) { set.values.push(value); // The element is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set.index[value] = set.values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * Returns false if the value was not present in the set. */ function remove(AuctionIDSet storage set, uint256 value) internal returns (bool) { if (contains(set, value)){ uint256 toDeleteIndex = set.index[value] - 1; uint256 lastIndex = set.values.length - 1; // If the element we're deleting is the last one, we can just remove it without doing a swap if (lastIndex != toDeleteIndex) { uint256 lastValue = set.values[lastIndex]; // Move the last value to the index where the deleted value is set.values[toDeleteIndex] = lastValue; // Update the index for the moved value set.index[lastValue] = toDeleteIndex + 1; // All indexes are 1-based } // Delete the index entry for the deleted value delete set.index[value]; // Delete the old entry for the moved value set.values.pop(); return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AuctionIDSet storage set, uint256 value) internal view returns (bool) { return set.index[value] != 0; } /** * @dev Returns an array with all values in the set. O(N). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * WARNING: This function may run out of gas on large sets: use {length} and * {get} instead in these cases. */ function enumerate(AuctionIDSet storage set) internal view returns (uint256[] memory) { uint256[] memory output = new uint256[](set.values.length); for (uint256 i; i < set.values.length; i++){ output[i] = set.values[i]; } return output; } /** * @dev Returns the number of elements on the set. O(1). */ function length(AuctionIDSet storage set) internal view returns (uint256) { return set.values.length; } /** @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function get(AuctionIDSet storage set, uint256 index) internal view returns (uint256) { return set.values[index]; } } contract DaiBackstopSyndicateV0 is IDaiBackstopSyndicate, SimpleFlopper, TwoStepOwnable, ERC20 { using SafeMath for uint256; using EnumerableSet for EnumerableSet.AuctionIDSet; // Track the status of the Syndicate. Status internal _status; // Track each active auction as an enumerable set. EnumerableSet.AuctionIDSet internal _activeAuctions; // The backstop price is 100 Dai for 1 MKR (logic implemented in bidder) uint256 internal constant _MKR_BACKSTOP_BID_PRICE_DENOMINATED_IN_DAI = 100; IERC20 internal constant _DAI = IERC20( 0x6B175474E89094C44Da98b954EedeAC495271d0F ); IERC20 internal constant _MKR = IERC20( 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2 ); IJoin internal constant _DAI_JOIN = IJoin( 0x9759A6Ac90977b93B58547b4A71c78317f391A28 ); IVat internal constant _VAT = IVat( 0x35D1b3F3D7966A1DFe207aa4514C12a259A0492B ); constructor() public { _status = Status.ACCEPTING_DEPOSITS; _VAT.hope(address(_DAI_JOIN)); _DAI.approve(address(_DAI_JOIN), uint256(-1)); } /// @notice User deposits DAI in the BackStop Syndicate and receives Syndicate shares /// @param daiAmount Amount of DAI to deposit /// @return Amount of Backstop Syndicate shares participant receives function enlist( uint256 daiAmount ) external notWhenDeactivated returns (uint256 backstopTokensMinted) { require( _status == Status.ACCEPTING_DEPOSITS, "DaiBackstopSyndicate/enlist: Cannot deposit once the first auction bid has been made." ); require( _DAI.transferFrom(msg.sender, address(this), daiAmount), "DaiBackstopSyndicate/enlist: Could not transfer Dai amount from caller." ); // Place the supplied Dai into the central Maker ledger for use in auctions. _DAI_JOIN.join(address(this), daiAmount); // Mint tokens 1:1 to the caller in exchange for the supplied Dai. backstopTokensMinted = daiAmount; _mint(msg.sender, backstopTokensMinted); } /// @notice User withdraws DAI and MKR from BackStop Syndicate based on Syndicate shares owned /// @param backstopTokenAmount Amount of shares to burn /// @return daiRedeemed: Amount of DAI withdrawn /// @return mkrRedeemed: Amount of MKR withdrawn function defect( uint256 backstopTokenAmount ) external returns (uint256 daiRedeemed, uint256 mkrRedeemed) { // Determine the % ownership. (scaled up by 1e18) uint256 shareFloat = (backstopTokenAmount.mul(1e18)).div(totalSupply()); // Burn the tokens. _burn(msg.sender, backstopTokenAmount); // Determine the Dai currently being used to bid in auctions. uint256 vatDaiLockedInAuctions = _getActiveAuctionVatDaiTotal(); // Determine the Dai currently locked up on behalf of this contract. uint256 vatDaiBalance = _VAT.dai(address(this)); // Combine Dai locked in auctions with the balance on the contract. uint256 combinedVatDai = vatDaiLockedInAuctions.add(vatDaiBalance); // Determine the Maker currently held by the contract. uint256 makerBalance = _MKR.balanceOf(address(this)); // Determine the amount of Dai and MKR to redeem based on the share. uint256 vatDaiRedeemed = combinedVatDai.mul(shareFloat) / 1e18; mkrRedeemed = makerBalance.mul(shareFloat) / 1e18; // daiRedeemed is the e18 version of vatDaiRedeemed (e45). Needed for dai token, otherwise we keep decimals of vatDai daiRedeemed = vatDaiRedeemed / 1e27; // Ensure that sufficient Dai liquidity is currently available to withdraw. require( vatDaiRedeemed <= vatDaiBalance, "DaiBackstopSyndicate/defect: Insufficient Dai (in use in auctions)" ); // Redeem the Dai and MKR, giving user vatDai if global settlement, otherwise, tokens if (SimpleFlopper.isEnabled()) { _DAI_JOIN.exit(msg.sender, daiRedeemed); } else { _VAT.move(address(this), msg.sender, vatDaiRedeemed); } require(_MKR.transfer(msg.sender, mkrRedeemed), "DaiBackstopSyndicate/defect: MKR redemption failed."); } /// @notice Triggers syndicate participation in an auction, bidding 50k DAI for 500 MKR /// @param auctionId ID of the auction to participate in function enterAuction(uint256 auctionId) external notWhenDeactivated { require( !_activeAuctions.contains(auctionId), "DaiBackstopSyndicate/enterAuction: Auction already active." ); // dai has 45 decimal places (uint256 amountDai, , , , ) = SimpleFlopper.getCurrentBid(auctionId); // lot needs to have 18 decimal places, and we're expecting 1 mkr == 100 dai uint256 expectedLot = (amountDai / 1e27) / 100; // Place the bid, reverting on failure. SimpleFlopper._bid(auctionId, expectedLot, amountDai); // Prevent further deposits. if (_status != Status.ACTIVATED) { _status = Status.ACTIVATED; } // Register auction if successful participation. _activeAuctions.add(auctionId); // Emit an event to signal that the auction was entered. emit AuctionEntered(auctionId, expectedLot, amountDai); } // Anyone can finalize an auction if it's ready function finalizeAuction(uint256 auctionId) external { require( _activeAuctions.contains(auctionId), "DaiBackstopSyndicate/enterAuction: Auction already finalized" ); // If auction was finalized, end should be 0x0. (,, address bidder,, uint48 end) = SimpleFlopper.getCurrentBid(auctionId); // If auction isn't closed, we try to close it ourselves if (end != 0) { // If we are the winning bidder, we finalize the auction // Otherwise we got outbid and we withdraw DAI if (bidder == address(this)) { SimpleFlopper._finalize(auctionId); } } // Remove the auction from the set of active auctions. _activeAuctions.remove(auctionId); // Emit an event to signal that the auction was finalized. emit AuctionFinalized(auctionId); } /// @notice The owner can pause new deposits and auctions. Existing auctions /// and withdrawals will be unaffected. function ceaseFire() external onlyOwner { _status = Status.DEACTIVATED; } function getStatus() external view returns (Status status) { status = _status; } function getActiveAuctions() external view returns (uint256[] memory activeAuctions) { activeAuctions = _activeAuctions.enumerate(); } function _getActiveAuctionVatDaiTotal() internal view returns (uint256 vatDai) { vatDai = 0; uint256[] memory activeAuctions = _activeAuctions.enumerate(); uint256 auctionVatDai; address bidder; for (uint256 i = 0; i < activeAuctions.length; i++) { // Dai bid size is returned from getCurrentBid with 45 decimals (auctionVatDai,, bidder,,) = SimpleFlopper.getCurrentBid(activeAuctions[i]); if (bidder == address(this)) { // we are keeping the 45 decimals in case we need to return vatDai vatDai.add(auctionVatDai); } } } modifier notWhenDeactivated() { require( _status != Status.DEACTIVATED, "DaiBackstopSyndicate/notWhenDeactivated: Syndicate is deactivated, please withdraw." ); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mkrAsk","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daiBid","type":"uint256"}],"name":"AuctionEntered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"AuctionFinalized","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":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cancelOwnershipTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"ceaseFire","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"backstopTokenAmount","type":"uint256"}],"name":"defect","outputs":[{"internalType":"uint256","name":"daiRedeemed","type":"uint256"},{"internalType":"uint256","name":"mkrRedeemed","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"daiAmount","type":"uint256"}],"name":"enlist","outputs":[{"internalType":"uint256","name":"backstopTokensMinted","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"enterAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"finalizeAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getActiveAuctions","outputs":[{"internalType":"uint256[]","name":"activeAuctions","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAuctionInformation","outputs":[{"internalType":"uint256","name":"bidIncrement","type":"uint256"},{"internalType":"uint256","name":"repriceIncrement","type":"uint256"},{"internalType":"uint256","name":"bidDuration","type":"uint256"},{"internalType":"uint256","name":"auctionDuration","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"auctionID","type":"uint256"}],"name":"getCurrentBid","outputs":[{"internalType":"uint256","name":"amountDAI","type":"uint256"},{"internalType":"uint256","name":"amountMKR","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint48","name":"bidDeadline","type":"uint48"},{"internalType":"uint48","name":"auctionDeadline","type":"uint48"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDaiAddress","outputs":[{"internalType":"address","name":"dai","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFlopperAddress","outputs":[{"internalType":"address","name":"flopper","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMKRAddress","outputs":[{"internalType":"address","name":"mkr","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStatus","outputs":[{"internalType":"enum IDaiBackstopSyndicate.Status","name":"status","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalNumberOfAuctions","outputs":[{"internalType":"uint256","name":"auctionID","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isEnabled","outputs":[{"internalType":"bool","name":"status","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50600080546001600160a01b03191632178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36005805460ff19169055604080516328ec8bf160e21b8152739759a6ac90977b93b58547b4a71c78317f391a28600482015290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163a3b22fc491602480830192600092919082900301818387803b1580156100ca57600080fd5b505af11580156100de573d6000803e3d6000fd5b50506040805163095ea7b360e01b8152739759a6ac90977b93b58547b4a71c78317f391a28600482015260001960248201529051736b175474e89094c44da98b954eedeac495271d0f935063095ea7b3925060448083019260209291908290030181600087803b15801561015157600080fd5b505af1158015610165573d6000803e3d6000fd5b505050506040513d602081101561017b57600080fd5b50506121118061018c6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80638a539972116100f9578063c49c2eb611610097578063dd62ed3e11610071578063dd62ed3e146104b6578063e8083863146104e4578063e918ad9114610501578063f2fde38b1461051e576101a9565b8063c49c2eb6146103fb578063cf44b5d514610403578063da4e364f1461045b576101a9565b8063a457c2d7116100d3578063a457c2d714610393578063a9059cbb146103bf578063b2a8c6fe146103eb578063bafebc6f146103f3576101a9565b80638a5399721461034d5780638da5cb5b146103835780638f32d59b1461038b576101a9565b80633d8b7894116101665780634e69d560116101405780634e69d560146102eb5780636aa633b61461031757806370a082311461031f57806379ba509714610345576101a9565b80633d8b7894146102985780633f1fc678146102b557806345a89214146102e3576101a9565b8063095ea7b3146101ae57806318160ddd146101ee57806323452b9c1461020857806323b872dd1461021257806333187dbb14610248578063395093511461026c575b600080fd5b6101da600480360360408110156101c457600080fd5b506001600160a01b038135169060200135610544565b604080519115158252519081900360200190f35b6101f661055b565b60408051918252519081900360200190f35b610210610561565b005b6101da6004803603606081101561022857600080fd5b506001600160a01b038135811691602081013590911690604001356105b6565b61025061060d565b604080516001600160a01b039092168252519081900360200190f35b6101da6004803603604081101561028257600080fd5b506001600160a01b03813516906020013561068d565b6101f6600480360360208110156102ae57600080fd5b50356106c9565b6102bd6108b4565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610250610ab2565b6102f3610b01565b6040518082600281111561030357fe5b60ff16815260200191505060405180910390f35b6101da610b0a565b6101f66004803603602081101561033557600080fd5b50356001600160a01b0316610b9b565b610210610bb6565b61036a6004803603602081101561036357600080fd5b5035610c5b565b6040805192835260208301919091528051918290030190f35b610250611020565b6101da61102f565b6101da600480360360408110156103a957600080fd5b506001600160a01b038135169060200135611040565b6101da600480360360408110156103d557600080fd5b506001600160a01b03813516906020013561107c565b610210611089565b6102506110db565b6101f66110f3565b61040b611142565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561044757818101518382015260200161042f565b505050509050019250505060405180910390f35b6104786004803603602081101561047157600080fd5b503561114e565b6040805195865260208601949094526001600160a01b039092168484015265ffffffffffff9081166060850152166080830152519081900360a00190f35b6101f6600480360360408110156104cc57600080fd5b506001600160a01b0381358116916020013516611201565b610210600480360360208110156104fa57600080fd5b503561122c565b6102106004803603602081101561051757600080fd5b50356112ff565b6102106004803603602081101561053457600080fd5b50356001600160a01b0316611459565b6000610551338484611503565b5060015b92915050565b60045490565b61056961102f565b6105a45760405162461bcd60e51b8152600401808060200182810382526028815260200180611fb86028913960400191505060405180910390fd5b600180546001600160a01b0319169055565b60006105c38484846115ef565b6001600160a01b0384166000908152600360209081526040808320338085529252909120546106039186916105fe908663ffffffff61173316565b611503565b5060019392505050565b6000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561065c57600080fd5b505afa158015610670573d6000803e3d6000fd5b505050506040513d602081101561068657600080fd5b5051905090565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916105519185906105fe908663ffffffff61179016565b6000600260055460ff1660028111156106de57fe5b141561071b5760405162461bcd60e51b8152600401808060200182810382526053815260200180611e486053913960600191505060405180910390fd5b600060055460ff16600281111561072e57fe5b1461076a5760405162461bcd60e51b8152600401808060200182810382526055815260200180611f1e6055913960600191505060405180910390fd5b604080516323b872dd60e01b8152336004820152306024820152604481018490529051736b175474e89094c44da98b954eedeac495271d0f916323b872dd9160648083019260209291908290030181600087803b1580156107ca57600080fd5b505af11580156107de573d6000803e3d6000fd5b505050506040513d60208110156107f457600080fd5b50516108315760405162461bcd60e51b8152600401808060200182810382526047815260200180611e9b6047913960600191505060405180910390fd5b60408051633b4da69f60e01b8152306004820152602481018490529051739759a6ac90977b93b58547b4a71c78317f391a2891633b4da69f91604480830192600092919082900301818387803b15801561088a57600080fd5b505af115801561089e573d6000803e3d6000fd5b505050508190506108af33826117f1565b919050565b600080600080734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b0316637d780d826040518163ffffffff1660e01b815260040160206040518083038186803b15801561090757600080fd5b505afa15801561091b573d6000803e3d6000fd5b505050506040513d602081101561093157600080fd5b5051604080516324d8499b60e21b81529051734d95a049d5b0b7d32058cd3f2163015747522e9991639361266c916004808301926020929190829003018186803b15801561097e57600080fd5b505afa158015610992573d6000803e3d6000fd5b505050506040513d60208110156109a857600080fd5b505160408051634e8b1dd560e01b81529051734d95a049d5b0b7d32058cd3f2163015747522e9991634e8b1dd5916004808301926020929190829003018186803b1580156109f557600080fd5b505afa158015610a09573d6000803e3d6000fd5b505050506040513d6020811015610a1f57600080fd5b50516040805163cfc4af5560e01b81529051734d95a049d5b0b7d32058cd3f2163015747522e999163cfc4af55916004808301926020929190829003018186803b158015610a6c57600080fd5b505afa158015610a80573d6000803e3d6000fd5b505050506040513d6020811015610a9657600080fd5b5051929791965065ffffffffffff908116955090911692509050565b6000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b0316637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b15801561065c57600080fd5b60055460ff1690565b6000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663957aa58c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b5957600080fd5b505afa158015610b6d573d6000803e3d6000fd5b505050506040513d6020811015610b8357600080fd5b5051600114610b93576000610b96565b60015b905090565b6001600160a01b031660009081526002602052604090205490565b6001546001600160a01b03163314610bff5760405162461bcd60e51b8152600401808060200182810382526045815260200180611f736045913960600191505060405180910390fd5b600180546001600160a01b03191690556000805460405133926001600160a01b03909216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03191633179055565b6000806000610c8f610c6b61055b565b610c8386670de0b6b3a764000063ffffffff6118e316565b9063ffffffff61193c16565b9050610c9b33856119a6565b6000610ca5611a81565b60408051633612d9a360e11b815230600482015290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b158015610cfc57600080fd5b505afa158015610d10573d6000803e3d6000fd5b505050506040513d6020811015610d2657600080fd5b505190506000610d3c838363ffffffff61179016565b604080516370a0823160e01b81523060048201529051919250600091739f8f72aa9304c8b593d555f12ef6589cc3a579a2916370a08231916024808301926020929190829003018186803b158015610d9357600080fd5b505afa158015610da7573d6000803e3d6000fd5b505050506040513d6020811015610dbd57600080fd5b505190506000670de0b6b3a7640000610ddc848863ffffffff6118e316565b81610de357fe5b049050670de0b6b3a7640000610dff838863ffffffff6118e316565b81610e0657fe5b0496506b033b2e3c9fd0803ce80000008104975083811115610e595760405162461bcd60e51b8152600401808060200182810382526042815260200180611db16042913960600191505060405180910390fd5b610e61610b0a565b15610edc576040805163ef693bed60e01b8152336004820152602481018a90529051739759a6ac90977b93b58547b4a71c78317f391a289163ef693bed91604480830192600092919082900301818387803b158015610ebf57600080fd5b505af1158015610ed3573d6000803e3d6000fd5b50505050610f54565b6040805163bb35783b60e01b81523060048201523360248201526044810183905290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163bb35783b91606480830192600092919082900301818387803b158015610f3b57600080fd5b505af1158015610f4f573d6000803e3d6000fd5b505050505b6040805163a9059cbb60e01b8152336004820152602481018990529051739f8f72aa9304c8b593d555f12ef6589cc3a579a29163a9059cbb9160448083019260209291908290030181600087803b158015610fae57600080fd5b505af1158015610fc2573d6000803e3d6000fd5b505050506040513d6020811015610fd857600080fd5b50516110155760405162461bcd60e51b8152600401808060200182810382526033815260200180611e156033913960400191505060405180910390fd5b505050505050915091565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916105519185906105fe908663ffffffff61173316565b60006105513384846115ef565b61109161102f565b6110cc5760405162461bcd60e51b8152600401808060200182810382526028815260200180611fb86028913960400191505060405180910390fd5b6005805460ff19166002179055565b734d95a049d5b0b7d32058cd3f2163015747522e9990565b6000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663cfdd33026040518163ffffffff1660e01b815260040160206040518083038186803b15801561065c57600080fd5b6060610b966006611af5565b6000806000806000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b0316634423c5f1876040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b1580156111ae57600080fd5b505afa1580156111c2573d6000803e3d6000fd5b505050506040513d60a08110156111d857600080fd5b508051602082015160408301516060840151608090940151929a91995097509195509350915050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b61123d60068263ffffffff611b7b16565b6112785760405162461bcd60e51b815260040180806020018281038252603c815260200180611ee2603c913960400191505060405180910390fd5b6000806112848361114e565b945050935050508065ffffffffffff166000146112b5576001600160a01b0382163014156112b5576112b583611b90565b6112c660068463ffffffff611c0516565b506040805184815290517f2d7633a748a750b559b97738629efd586b561319b152bb42ba14d590706d31da9181900360200190a1505050565b600260055460ff16600281111561131257fe5b141561134f5760405162461bcd60e51b8152600401808060200182810382526053815260200180611e486053913960600191505060405180910390fd5b61136060068263ffffffff611b7b16565b1561139c5760405162461bcd60e51b815260040180806020018281038252603a815260200180612001603a913960400191505060405180910390fd5b60006113a78261114e565b505050509050600060646b033b2e3c9fd0803ce800000083816113c657fe5b04816113ce57fe5b0490506113dc838284611cce565b600160055460ff1660028111156113ef57fe5b14611402576005805460ff191660011790555b61141360068463ffffffff611d4c16565b50604080518481526020810183905280820184905290517f35f50010a71a711fbfb0ada2814c5caf05bf153ccea88acca671ab6a5615d7c79181900360600190a1505050565b61146161102f565b61149c5760405162461bcd60e51b8152600401808060200182810382526028815260200180611fb86028913960400191505060405180910390fd5b6001600160a01b0381166114e15760405162461bcd60e51b81526004018080602001828103825260388152602001806120a56038913960400191505060405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166115485760405162461bcd60e51b81526004018080602001828103825260248152602001806120816024913960400191505060405180910390fd5b6001600160a01b03821661158d5760405162461bcd60e51b8152600401808060200182810382526022815260200180611df36022913960400191505060405180910390fd5b6001600160a01b03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166116345760405162461bcd60e51b815260040180806020018281038252602581526020018061205c6025913960400191505060405180910390fd5b6001600160a01b0382166116795760405162461bcd60e51b8152600401808060200182810382526023815260200180611d8e6023913960400191505060405180910390fd5b6001600160a01b0383166000908152600260205260409020546116a2908263ffffffff61173316565b6001600160a01b0380851660009081526002602052604080822093909355908416815220546116d7908263ffffffff61179016565b6001600160a01b0380841660008181526002602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008282111561178a576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000828201838110156117ea576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b03821661184c576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b60045461185f908263ffffffff61179016565b6004556001600160a01b03821660009081526002602052604090205461188b908263ffffffff61179016565b6001600160a01b03831660008181526002602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000826118f257506000610555565b828202828482816118ff57fe5b04146117ea5760405162461bcd60e51b8152600401808060200182810382526021815260200180611fe06021913960400191505060405180910390fd5b6000808211611992576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b600082848161199d57fe5b04949350505050565b6001600160a01b0382166119eb5760405162461bcd60e51b815260040180806020018281038252602181526020018061203b6021913960400191505060405180910390fd5b6004546119fe908263ffffffff61173316565b6004556001600160a01b038216600090815260026020526040902054611a2a908263ffffffff61173316565b6001600160a01b0383166000818152600260209081526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b60006060611a8f6006611af5565b9050600080805b8351811015611aee57611abb848281518110611aae57fe5b602002602001015161114e565b50929550935050506001600160a01b038216301415611ae657611ae4858463ffffffff61179016565b505b600101611a96565b5050505090565b6060808260010180549050604051908082528060200260200182016040528015611b29578160200160208202803883390190505b50905060005b6001840154811015611b7457836001018181548110611b4a57fe5b9060005260206000200154828281518110611b6157fe5b6020908102919091010152600101611b2f565b5092915050565b60009081526020919091526040902054151590565b734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663c959c42b826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611bea57600080fd5b505af1158015611bfe573d6000803e3d6000fd5b5050505050565b6000611c118383611b7b565b15611cc65760008281526020849052604090205460018401546000199182019101808214611c89576000856001018281548110611c4a57fe5b9060005260206000200154905080866001018481548110611c6757fe5b6000918252602080832090910192909255918252869052604090206001830190555b60008481526020869052604081205560018501805480611ca557fe5b60019003818190600052602060002001600090559055600192505050610555565b506000610555565b60408051632ff9d1c160e11b81526004810185905260248101849052604481018390529051734d95a049d5b0b7d32058cd3f2163015747522e9991635ff3a38291606480830192600092919082900301818387803b158015611d2f57600080fd5b505af1158015611d43573d6000803e3d6000fd5b50505050505050565b6000611d588383611b7b565b611cc657506001808301805480830182556000828152602080822090920185905591548483529085905260409091205561055556fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f6465666563743a20496e73756666696369656e74204461692028696e2075736520696e2061756374696f6e732945524332303a20617070726f766520746f20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f6465666563743a204d4b5220726564656d7074696f6e206661696c65642e4461694261636b73746f7053796e6469636174652f6e6f745768656e44656163746976617465643a2053796e6469636174652069732064656163746976617465642c20706c656173652077697468647261772e4461694261636b73746f7053796e6469636174652f656e6c6973743a20436f756c64206e6f74207472616e736665722044616920616d6f756e742066726f6d2063616c6c65722e4461694261636b73746f7053796e6469636174652f656e74657241756374696f6e3a2041756374696f6e20616c72656164792066696e616c697a65644461694261636b73746f7053796e6469636174652f656e6c6973743a2043616e6e6f74206465706f736974206f6e6365207468652066697273742061756374696f6e2062696420686173206265656e206d6164652e54776f537465704f776e61626c653a2063757272656e74206f776e6572206d757374207365742063616c6c6572206173206e657720706f74656e7469616c206f776e65722e54776f537465704f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65722e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774461694261636b73746f7053796e6469636174652f656e74657241756374696f6e3a2041756374696f6e20616c7265616479206163746976652e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737354776f537465704f776e61626c653a206e657720706f74656e7469616c206f776e657220697320746865207a65726f20616464726573732ea265627a7a7231582006cadbbf977d42e18db869a0197e2e7891b75f31b7cbcdb2cbbc6f1bf9fc09cf64736f6c63430005100032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a95760003560e01c80638a539972116100f9578063c49c2eb611610097578063dd62ed3e11610071578063dd62ed3e146104b6578063e8083863146104e4578063e918ad9114610501578063f2fde38b1461051e576101a9565b8063c49c2eb6146103fb578063cf44b5d514610403578063da4e364f1461045b576101a9565b8063a457c2d7116100d3578063a457c2d714610393578063a9059cbb146103bf578063b2a8c6fe146103eb578063bafebc6f146103f3576101a9565b80638a5399721461034d5780638da5cb5b146103835780638f32d59b1461038b576101a9565b80633d8b7894116101665780634e69d560116101405780634e69d560146102eb5780636aa633b61461031757806370a082311461031f57806379ba509714610345576101a9565b80633d8b7894146102985780633f1fc678146102b557806345a89214146102e3576101a9565b8063095ea7b3146101ae57806318160ddd146101ee57806323452b9c1461020857806323b872dd1461021257806333187dbb14610248578063395093511461026c575b600080fd5b6101da600480360360408110156101c457600080fd5b506001600160a01b038135169060200135610544565b604080519115158252519081900360200190f35b6101f661055b565b60408051918252519081900360200190f35b610210610561565b005b6101da6004803603606081101561022857600080fd5b506001600160a01b038135811691602081013590911690604001356105b6565b61025061060d565b604080516001600160a01b039092168252519081900360200190f35b6101da6004803603604081101561028257600080fd5b506001600160a01b03813516906020013561068d565b6101f6600480360360208110156102ae57600080fd5b50356106c9565b6102bd6108b4565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610250610ab2565b6102f3610b01565b6040518082600281111561030357fe5b60ff16815260200191505060405180910390f35b6101da610b0a565b6101f66004803603602081101561033557600080fd5b50356001600160a01b0316610b9b565b610210610bb6565b61036a6004803603602081101561036357600080fd5b5035610c5b565b6040805192835260208301919091528051918290030190f35b610250611020565b6101da61102f565b6101da600480360360408110156103a957600080fd5b506001600160a01b038135169060200135611040565b6101da600480360360408110156103d557600080fd5b506001600160a01b03813516906020013561107c565b610210611089565b6102506110db565b6101f66110f3565b61040b611142565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561044757818101518382015260200161042f565b505050509050019250505060405180910390f35b6104786004803603602081101561047157600080fd5b503561114e565b6040805195865260208601949094526001600160a01b039092168484015265ffffffffffff9081166060850152166080830152519081900360a00190f35b6101f6600480360360408110156104cc57600080fd5b506001600160a01b0381358116916020013516611201565b610210600480360360208110156104fa57600080fd5b503561122c565b6102106004803603602081101561051757600080fd5b50356112ff565b6102106004803603602081101561053457600080fd5b50356001600160a01b0316611459565b6000610551338484611503565b5060015b92915050565b60045490565b61056961102f565b6105a45760405162461bcd60e51b8152600401808060200182810382526028815260200180611fb86028913960400191505060405180910390fd5b600180546001600160a01b0319169055565b60006105c38484846115ef565b6001600160a01b0384166000908152600360209081526040808320338085529252909120546106039186916105fe908663ffffffff61173316565b611503565b5060019392505050565b6000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561065c57600080fd5b505afa158015610670573d6000803e3d6000fd5b505050506040513d602081101561068657600080fd5b5051905090565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916105519185906105fe908663ffffffff61179016565b6000600260055460ff1660028111156106de57fe5b141561071b5760405162461bcd60e51b8152600401808060200182810382526053815260200180611e486053913960600191505060405180910390fd5b600060055460ff16600281111561072e57fe5b1461076a5760405162461bcd60e51b8152600401808060200182810382526055815260200180611f1e6055913960600191505060405180910390fd5b604080516323b872dd60e01b8152336004820152306024820152604481018490529051736b175474e89094c44da98b954eedeac495271d0f916323b872dd9160648083019260209291908290030181600087803b1580156107ca57600080fd5b505af11580156107de573d6000803e3d6000fd5b505050506040513d60208110156107f457600080fd5b50516108315760405162461bcd60e51b8152600401808060200182810382526047815260200180611e9b6047913960600191505060405180910390fd5b60408051633b4da69f60e01b8152306004820152602481018490529051739759a6ac90977b93b58547b4a71c78317f391a2891633b4da69f91604480830192600092919082900301818387803b15801561088a57600080fd5b505af115801561089e573d6000803e3d6000fd5b505050508190506108af33826117f1565b919050565b600080600080734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b0316637d780d826040518163ffffffff1660e01b815260040160206040518083038186803b15801561090757600080fd5b505afa15801561091b573d6000803e3d6000fd5b505050506040513d602081101561093157600080fd5b5051604080516324d8499b60e21b81529051734d95a049d5b0b7d32058cd3f2163015747522e9991639361266c916004808301926020929190829003018186803b15801561097e57600080fd5b505afa158015610992573d6000803e3d6000fd5b505050506040513d60208110156109a857600080fd5b505160408051634e8b1dd560e01b81529051734d95a049d5b0b7d32058cd3f2163015747522e9991634e8b1dd5916004808301926020929190829003018186803b1580156109f557600080fd5b505afa158015610a09573d6000803e3d6000fd5b505050506040513d6020811015610a1f57600080fd5b50516040805163cfc4af5560e01b81529051734d95a049d5b0b7d32058cd3f2163015747522e999163cfc4af55916004808301926020929190829003018186803b158015610a6c57600080fd5b505afa158015610a80573d6000803e3d6000fd5b505050506040513d6020811015610a9657600080fd5b5051929791965065ffffffffffff908116955090911692509050565b6000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b0316637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b15801561065c57600080fd5b60055460ff1690565b6000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663957aa58c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b5957600080fd5b505afa158015610b6d573d6000803e3d6000fd5b505050506040513d6020811015610b8357600080fd5b5051600114610b93576000610b96565b60015b905090565b6001600160a01b031660009081526002602052604090205490565b6001546001600160a01b03163314610bff5760405162461bcd60e51b8152600401808060200182810382526045815260200180611f736045913960600191505060405180910390fd5b600180546001600160a01b03191690556000805460405133926001600160a01b03909216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03191633179055565b6000806000610c8f610c6b61055b565b610c8386670de0b6b3a764000063ffffffff6118e316565b9063ffffffff61193c16565b9050610c9b33856119a6565b6000610ca5611a81565b60408051633612d9a360e11b815230600482015290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b158015610cfc57600080fd5b505afa158015610d10573d6000803e3d6000fd5b505050506040513d6020811015610d2657600080fd5b505190506000610d3c838363ffffffff61179016565b604080516370a0823160e01b81523060048201529051919250600091739f8f72aa9304c8b593d555f12ef6589cc3a579a2916370a08231916024808301926020929190829003018186803b158015610d9357600080fd5b505afa158015610da7573d6000803e3d6000fd5b505050506040513d6020811015610dbd57600080fd5b505190506000670de0b6b3a7640000610ddc848863ffffffff6118e316565b81610de357fe5b049050670de0b6b3a7640000610dff838863ffffffff6118e316565b81610e0657fe5b0496506b033b2e3c9fd0803ce80000008104975083811115610e595760405162461bcd60e51b8152600401808060200182810382526042815260200180611db16042913960600191505060405180910390fd5b610e61610b0a565b15610edc576040805163ef693bed60e01b8152336004820152602481018a90529051739759a6ac90977b93b58547b4a71c78317f391a289163ef693bed91604480830192600092919082900301818387803b158015610ebf57600080fd5b505af1158015610ed3573d6000803e3d6000fd5b50505050610f54565b6040805163bb35783b60e01b81523060048201523360248201526044810183905290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163bb35783b91606480830192600092919082900301818387803b158015610f3b57600080fd5b505af1158015610f4f573d6000803e3d6000fd5b505050505b6040805163a9059cbb60e01b8152336004820152602481018990529051739f8f72aa9304c8b593d555f12ef6589cc3a579a29163a9059cbb9160448083019260209291908290030181600087803b158015610fae57600080fd5b505af1158015610fc2573d6000803e3d6000fd5b505050506040513d6020811015610fd857600080fd5b50516110155760405162461bcd60e51b8152600401808060200182810382526033815260200180611e156033913960400191505060405180910390fd5b505050505050915091565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916105519185906105fe908663ffffffff61173316565b60006105513384846115ef565b61109161102f565b6110cc5760405162461bcd60e51b8152600401808060200182810382526028815260200180611fb86028913960400191505060405180910390fd5b6005805460ff19166002179055565b734d95a049d5b0b7d32058cd3f2163015747522e9990565b6000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663cfdd33026040518163ffffffff1660e01b815260040160206040518083038186803b15801561065c57600080fd5b6060610b966006611af5565b6000806000806000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b0316634423c5f1876040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b1580156111ae57600080fd5b505afa1580156111c2573d6000803e3d6000fd5b505050506040513d60a08110156111d857600080fd5b508051602082015160408301516060840151608090940151929a91995097509195509350915050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b61123d60068263ffffffff611b7b16565b6112785760405162461bcd60e51b815260040180806020018281038252603c815260200180611ee2603c913960400191505060405180910390fd5b6000806112848361114e565b945050935050508065ffffffffffff166000146112b5576001600160a01b0382163014156112b5576112b583611b90565b6112c660068463ffffffff611c0516565b506040805184815290517f2d7633a748a750b559b97738629efd586b561319b152bb42ba14d590706d31da9181900360200190a1505050565b600260055460ff16600281111561131257fe5b141561134f5760405162461bcd60e51b8152600401808060200182810382526053815260200180611e486053913960600191505060405180910390fd5b61136060068263ffffffff611b7b16565b1561139c5760405162461bcd60e51b815260040180806020018281038252603a815260200180612001603a913960400191505060405180910390fd5b60006113a78261114e565b505050509050600060646b033b2e3c9fd0803ce800000083816113c657fe5b04816113ce57fe5b0490506113dc838284611cce565b600160055460ff1660028111156113ef57fe5b14611402576005805460ff191660011790555b61141360068463ffffffff611d4c16565b50604080518481526020810183905280820184905290517f35f50010a71a711fbfb0ada2814c5caf05bf153ccea88acca671ab6a5615d7c79181900360600190a1505050565b61146161102f565b61149c5760405162461bcd60e51b8152600401808060200182810382526028815260200180611fb86028913960400191505060405180910390fd5b6001600160a01b0381166114e15760405162461bcd60e51b81526004018080602001828103825260388152602001806120a56038913960400191505060405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166115485760405162461bcd60e51b81526004018080602001828103825260248152602001806120816024913960400191505060405180910390fd5b6001600160a01b03821661158d5760405162461bcd60e51b8152600401808060200182810382526022815260200180611df36022913960400191505060405180910390fd5b6001600160a01b03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166116345760405162461bcd60e51b815260040180806020018281038252602581526020018061205c6025913960400191505060405180910390fd5b6001600160a01b0382166116795760405162461bcd60e51b8152600401808060200182810382526023815260200180611d8e6023913960400191505060405180910390fd5b6001600160a01b0383166000908152600260205260409020546116a2908263ffffffff61173316565b6001600160a01b0380851660009081526002602052604080822093909355908416815220546116d7908263ffffffff61179016565b6001600160a01b0380841660008181526002602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008282111561178a576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000828201838110156117ea576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b03821661184c576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b60045461185f908263ffffffff61179016565b6004556001600160a01b03821660009081526002602052604090205461188b908263ffffffff61179016565b6001600160a01b03831660008181526002602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000826118f257506000610555565b828202828482816118ff57fe5b04146117ea5760405162461bcd60e51b8152600401808060200182810382526021815260200180611fe06021913960400191505060405180910390fd5b6000808211611992576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b600082848161199d57fe5b04949350505050565b6001600160a01b0382166119eb5760405162461bcd60e51b815260040180806020018281038252602181526020018061203b6021913960400191505060405180910390fd5b6004546119fe908263ffffffff61173316565b6004556001600160a01b038216600090815260026020526040902054611a2a908263ffffffff61173316565b6001600160a01b0383166000818152600260209081526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b60006060611a8f6006611af5565b9050600080805b8351811015611aee57611abb848281518110611aae57fe5b602002602001015161114e565b50929550935050506001600160a01b038216301415611ae657611ae4858463ffffffff61179016565b505b600101611a96565b5050505090565b6060808260010180549050604051908082528060200260200182016040528015611b29578160200160208202803883390190505b50905060005b6001840154811015611b7457836001018181548110611b4a57fe5b9060005260206000200154828281518110611b6157fe5b6020908102919091010152600101611b2f565b5092915050565b60009081526020919091526040902054151590565b734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663c959c42b826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611bea57600080fd5b505af1158015611bfe573d6000803e3d6000fd5b5050505050565b6000611c118383611b7b565b15611cc65760008281526020849052604090205460018401546000199182019101808214611c89576000856001018281548110611c4a57fe5b9060005260206000200154905080866001018481548110611c6757fe5b6000918252602080832090910192909255918252869052604090206001830190555b60008481526020869052604081205560018501805480611ca557fe5b60019003818190600052602060002001600090559055600192505050610555565b506000610555565b60408051632ff9d1c160e11b81526004810185905260248101849052604481018390529051734d95a049d5b0b7d32058cd3f2163015747522e9991635ff3a38291606480830192600092919082900301818387803b158015611d2f57600080fd5b505af1158015611d43573d6000803e3d6000fd5b50505050505050565b6000611d588383611b7b565b611cc657506001808301805480830182556000828152602080822090920185905591548483529085905260409091205561055556fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f6465666563743a20496e73756666696369656e74204461692028696e2075736520696e2061756374696f6e732945524332303a20617070726f766520746f20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f6465666563743a204d4b5220726564656d7074696f6e206661696c65642e4461694261636b73746f7053796e6469636174652f6e6f745768656e44656163746976617465643a2053796e6469636174652069732064656163746976617465642c20706c656173652077697468647261772e4461694261636b73746f7053796e6469636174652f656e6c6973743a20436f756c64206e6f74207472616e736665722044616920616d6f756e742066726f6d2063616c6c65722e4461694261636b73746f7053796e6469636174652f656e74657241756374696f6e3a2041756374696f6e20616c72656164792066696e616c697a65644461694261636b73746f7053796e6469636174652f656e6c6973743a2043616e6e6f74206465706f736974206f6e6365207468652066697273742061756374696f6e2062696420686173206265656e206d6164652e54776f537465704f776e61626c653a2063757272656e74206f776e6572206d757374207365742063616c6c6572206173206e657720706f74656e7469616c206f776e65722e54776f537465704f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65722e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774461694261636b73746f7053796e6469636174652f656e74657241756374696f6e3a2041756374696f6e20616c7265616479206163746976652e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737354776f537465704f776e61626c653a206e657720706f74656e7469616c206f776e657220697320746865207a65726f20616464726573732ea265627a7a7231582006cadbbf977d42e18db869a0197e2e7891b75f31b7cbcdb2cbbc6f1bf9fc09cf64736f6c63430005100032
Deployed Bytecode Sourcemap
28329:7354:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28329:7354:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13399:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13399:148:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;12422:91;;;:::i;:::-;;;;;;;;;;;;;;;;24212:90;;;:::i;:::-;;14018:256;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14018:256:0;;;;;;;;;;;;;;;;;:::i;19859:93::-;;;:::i;:::-;;;;-1:-1:-1;;;;;19859:93:0;;;;;;;;;;;;;;14683:206;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14683:206:0;;;;;;;;:::i;29638:739::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29638:739:0;;:::i;20579:257::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19670:93;;;:::i;34634:88::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19260:112;;;:::i;12576:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12576:110:0;-1:-1:-1;;;;;12576:110:0;;:::i;24460:298::-;;;:::i;30644:1820::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30644:1820:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23299:73;;;:::i;23641:86::-;;;:::i;15392:216::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15392:216:0;;;;;;;;:::i;12899:156::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12899:156:0;;;;;;;;:::i;34547:81::-;;;:::i;20054:104::-;;;:::i;19462:112::-;;;:::i;34728:142::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;34728:142:0;;;;;;;;;;;;;;;;;21173:235;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21173:235:0;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;21173:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13118:134;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13118:134:0;;;;;;;;;;:::i;33579:839::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33579:839:0;;:::i;32621:901::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32621:901:0;;:::i;23860:225::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23860:225:0;-1:-1:-1;;;;;23860:225:0;;:::i;13399:148::-;13464:4;13481:36;13490:10;13502:7;13511:5;13481:8;:36::i;:::-;-1:-1:-1;13535:4:0;13399:148;;;;;:::o;12422:91::-;12493:12;;12422:91;:::o;24212:90::-;23493:9;:7;:9::i;:::-;23485:62;;;;-1:-1:-1;;;23485:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24278:18;24271:25;;-1:-1:-1;;;;;;24271:25:0;;;24212:90::o;14018:256::-;14107:4;14124:36;14134:6;14142:9;14153:6;14124:9;:36::i;:::-;-1:-1:-1;;;;;14200:19:0;;;;;;:11;:19;;;;;;;;14188:10;14200:31;;;;;;;;;14171:73;;14180:6;;14200:43;;14236:6;14200:43;:35;:43;:::i;:::-;14171:8;:73::i;:::-;-1:-1:-1;14262:4:0;14018:256;;;;;:::o;19859:93::-;19905:11;19070:42;-1:-1:-1;;;;;19932:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19932:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19932:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19932:14:0;;-1:-1:-1;19859:93:0;:::o;14683:206::-;14789:10;14763:4;14810:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;14810:32:0;;;;;;;;;;14763:4;;14780:79;;14801:7;;14810:48;;14847:10;14810:48;:36;:48;:::i;29638:739::-;29720:28;35547:18;35536:7;;;;:29;;;;;;;;;;35520:146;;;;-1:-1:-1;;;35520:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29784:25;29773:7;;;;:36;;;;;;;;;29757:155;;;;-1:-1:-1;;;29757:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29937:55;;;-1:-1:-1;;;29937:55:0;;29955:10;29937:55;;;;29975:4;29937:55;;;;;;;;;;;;28915:42;;29937:17;;:55;;;;;;;;;;;;;;-1:-1:-1;28915:42:0;29937:55;;;5:2:-1;;;;30:1;27;20:12;5:2;29937:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29937:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29937:55:0;29921:160;;;;-1:-1:-1;;;29921:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30172:40;;;-1:-1:-1;;;30172:40:0;;30195:4;30172:40;;;;;;;;;;;;29116:42;;30172:14;;:40;;;;;-1:-1:-1;;30172:40:0;;;;;;;-1:-1:-1;29116:42:0;30172:40;;;5:2:-1;;;;30:1;27;20:12;5:2;30172:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30172:40:0;;;;30316:9;30293:32;;30332:39;30338:10;30350:20;30332:5;:39::i;:::-;29638:739;;;:::o;20579:257::-;20639:20;20666:24;20697:19;20723:23;19070:42;-1:-1:-1;;;;;20767:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20767:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20767:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20767:14:0;20783;;;-1:-1:-1;;;20783:14:0;;;;19070:42;;20783:12;;:14;;;;;20767;;20783;;;;;;;19070:42;20783:14;;;5:2:-1;;;;30:1;27;20:12;5:2;20783:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20783:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20783:14:0;20799;;;-1:-1:-1;;;20799:14:0;;;;19070:42;;20799:12;;:14;;;;;20783;;20799;;;;;;;19070:42;20799:14;;;5:2:-1;;;;30:1;27;20:12;5:2;20799:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20799:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20799:14:0;20815;;;-1:-1:-1;;;20815:14:0;;;;19070:42;;20815:12;;:14;;;;;20799;;20815;;;;;;;19070:42;20815:14;;;5:2:-1;;;;30:1;27;20:12;5:2;20815:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20815:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20815:14:0;20759:71;;;;-1:-1:-1;20759:71:0;;;;;-1:-1:-1;20759:71:0;;;;-1:-1:-1;20579:257:0;-1:-1:-1;20579:257:0:o;19670:93::-;19716:11;19070:42;-1:-1:-1;;;;;19743:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;34634:88:0;34709:7;;;;;34634:88::o;19260:112::-;19302:11;19070:42;-1:-1:-1;;;;;19330:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19330:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19330:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19330:15:0;19349:1;19330:20;19329:37;;19361:5;19329:37;;;19354:4;19329:37;19322:44;;19260:112;:::o;12576:110::-;-1:-1:-1;;;;;12660:18:0;12633:7;12660:18;;;:9;:18;;;;;;;12576:110::o;24460:298::-;24531:18;;-1:-1:-1;;;;;24531:18:0;24517:10;:32;24501:135;;;;-1:-1:-1;;;24501:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24652:18;24645:25;;-1:-1:-1;;;;;;24645:25:0;;;-1:-1:-1;24705:6:0;;24684:40;;24713:10;;-1:-1:-1;;;;;24705:6:0;;;;24684:40;;;24733:6;:19;;-1:-1:-1;;;;;;24733:19:0;24742:10;24733:19;;;24460:298::o;30644:1820::-;30717:19;30738;30821:18;30842:50;30878:13;:11;:13::i;:::-;30843:29;:19;30867:4;30843:29;:23;:29;:::i;:::-;30842:35;:50;:35;:50;:::i;:::-;30821:71;;30926:38;30932:10;30944:19;30926:5;:38::i;:::-;31040:30;31073;:28;:30::i;:::-;31210:23;;;-1:-1:-1;;;31210:23:0;;31227:4;31210:23;;;;;;31040:63;;-1:-1:-1;31186:21:0;;29211:42;;31210:8;;:23;;;;;;;;;;;;;;29211:42;31210:23;;;5:2:-1;;;;30:1;27;20:12;5:2;31210:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31210:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31210:23:0;;-1:-1:-1;31315:22:0;31340:41;:22;31210:23;31340:41;:26;:41;:::i;:::-;31473:29;;;-1:-1:-1;;;31473:29:0;;31496:4;31473:29;;;;;;31315:66;;-1:-1:-1;31450:20:0;;29014:42;;31473:14;;:29;;;;;;;;;;;;;;29014:42;31473:29;;;5:2:-1;;;;30:1;27;20:12;5:2;31473:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31473:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31473:29:0;;-1:-1:-1;31585:22:0;31643:4;31610:30;:14;31629:10;31610:30;:18;:30;:::i;:::-;:37;;;;;;;-1:-1:-1;31699:4:0;31668:28;:12;31685:10;31668:28;:16;:28;:::i;:::-;:35;;;;;;;-1:-1:-1;31866:4:0;31849:14;:21;31835:35;;31996:13;31978:14;:31;;31962:124;;;;-1:-1:-1;;;31962:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32190:25;:23;:25::i;:::-;32186:162;;;32226:39;;;-1:-1:-1;;;32226:39:0;;32241:10;32226:39;;;;;;;;;;;;29116:42;;32226:14;;:39;;;;;-1:-1:-1;;32226:39:0;;;;;;;-1:-1:-1;29116:42:0;32226:39;;;5:2:-1;;;;30:1;27;20:12;5:2;32226:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32226:39:0;;;;32186:162;;;32288:52;;;-1:-1:-1;;;32288:52:0;;32306:4;32288:52;;;;32313:10;32288:52;;;;;;;;;;;;29211:42;;32288:9;;:52;;;;;-1:-1:-1;;32288:52:0;;;;;;;-1:-1:-1;29211:42:0;32288:52;;;5:2:-1;;;;30:1;27;20:12;5:2;32288:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32288:52:0;;;;32186:162;32364:38;;;-1:-1:-1;;;32364:38:0;;32378:10;32364:38;;;;;;;;;;;;29014:42;;32364:13;;:38;;;;;;;;;;;;;;-1:-1:-1;29014:42:0;32364:38;;;5:2:-1;;;;30:1;27;20:12;5:2;32364:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32364:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32364:38:0;32356:102;;;;-1:-1:-1;;;32356:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30644:1820;;;;;;;;;:::o;23299:73::-;23337:7;23360:6;-1:-1:-1;;;;;23360:6:0;23299:73;:::o;23641:86::-;23681:4;23715:6;-1:-1:-1;;;;;23715:6:0;23701:10;:20;;23641:86::o;15392:216::-;15503:10;15477:4;15524:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;15524:32:0;;;;;;;;;;15477:4;;15494:84;;15515:7;;15524:53;;15561:15;15524:53;:36;:53;:::i;12899:156::-;12968:4;12985:40;12995:10;13007:9;13018:6;12985:9;:40::i;34547:81::-;23493:9;:7;:9::i;:::-;23485:62;;;;-1:-1:-1;;;23485:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34594:7;:28;;-1:-1:-1;;34594:28:0;34604:18;34594:28;;;34547:81::o;20054:104::-;19070:42;20054:104;:::o;19462:112::-;19519:17;19070:42;-1:-1:-1;;;;;19552:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;34728:142:0;34780:31;34837:27;:15;:25;:27::i;21173:235::-;21242:17;21266;21290:14;21311:18;21336:22;19070:42;-1:-1:-1;;;;;21378:13:0;;21392:9;21378:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21378:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21378:24:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;21378:24:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21378:24:0;-1:-1:-1;21378:24:0;;-1:-1:-1;21378:24:0;-1:-1:-1;21173:235:0;-1:-1:-1;;21173:235:0:o;13118:134::-;-1:-1:-1;;;;;13217:18:0;;;13190:7;13217:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;13118:134::o;33579:839::-;33655:35;:15;33680:9;33655:35;:24;:35;:::i;:::-;33639:129;;;;-1:-1:-1;;;33639:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33834:14;33851:10;33865:38;33893:9;33865:27;:38::i;:::-;33830:73;;;;;;;33978:3;:8;;33985:1;33978:8;33974:232;;-1:-1:-1;;;;;34119:23:0;;34137:4;34119:23;34115:84;;;34155:34;34179:9;34155:23;:34::i;:::-;34274:33;:15;34297:9;34274:33;:22;:33;:::i;:::-;-1:-1:-1;34385:27:0;;;;;;;;;;;;;;;;;33579:839;;;:::o;32621:901::-;35547:18;35536:7;;;;:29;;;;;;;;;;35520:146;;;;-1:-1:-1;;;35520:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32714:35;:15;32739:9;32714:35;:24;:35;:::i;:::-;32713:36;32697:128;;;;-1:-1:-1;;;32697:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32869:17;32898:38;32926:9;32898:27;:38::i;:::-;32868:68;;;;;;33027:19;33070:3;33062:4;33050:9;:16;;;;;;33049:24;;;;;;33027:46;;33127:53;33146:9;33157:11;33170:9;33127:18;:53::i;:::-;33238:16;33227:7;;;;:27;;;;;;;;;33223:76;;33265:7;:26;;-1:-1:-1;;33265:26:0;33275:16;33265:26;;;33223:76;33361:30;:15;33381:9;33361:30;:19;:30;:::i;:::-;-1:-1:-1;33467:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35673:1;;32621:901;:::o;23860:225::-;23493:9;:7;:9::i;:::-;23485:62;;;;-1:-1:-1;;;23485:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23945:22:0;;23929:112;;;;-1:-1:-1;;;23929:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24050:18;:29;;-1:-1:-1;;;;;;24050:29:0;-1:-1:-1;;;;;24050:29:0;;;;;;;;;;23860:225::o;18194:335::-;-1:-1:-1;;;;;18287:19:0;;18279:68;;;;-1:-1:-1;;;18279:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18366:21:0;;18358:68;;;;-1:-1:-1;;;18358:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18439:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;18490:31;;;;;;;;;;;;;;;;;18194:335;;;:::o;16098:429::-;-1:-1:-1;;;;;16196:20:0;;16188:70;;;;-1:-1:-1;;;16188:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16277:23:0;;16269:71;;;;-1:-1:-1;;;16269:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16373:17:0;;;;;;:9;:17;;;;;;:29;;16395:6;16373:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;16353:17:0;;;;;;;:9;:17;;;;;;:49;;;;16436:20;;;;;;;:32;;16461:6;16436:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;16413:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;16484:35;;;;;;;16413:20;;16484:35;;;;;;;;;;;;;16098:429;;;:::o;5844:184::-;5902:7;5935:1;5930;:6;;5922:49;;;;;-1:-1:-1;;;5922:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5994:5:0;;;5844:184::o;5388:181::-;5446:7;5478:5;;;5502:6;;;;5494:46;;;;;-1:-1:-1;;;5494:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5560:1;5388:181;-1:-1:-1;;;5388:181:0:o;16808:308::-;-1:-1:-1;;;;;16884:21:0;;16876:65;;;;;-1:-1:-1;;;16876:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16969:12;;:24;;16986:6;16969:24;:16;:24;:::i;:::-;16954:12;:39;-1:-1:-1;;;;;17025:18:0;;;;;;:9;:18;;;;;;:30;;17048:6;17025:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;17004:18:0;;;;;;:9;:18;;;;;;;;:51;;;;17071:37;;;;;;;17004:18;;;;17071:37;;;;;;;;;;16808:308;;:::o;6279:471::-;6337:7;6582:6;6578:47;;-1:-1:-1;6612:1:0;6605:8;;6578:47;6649:5;;;6653:1;6649;:5;:1;6673:5;;;;;:10;6665:56;;;;-1:-1:-1;;;6665:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7218:333;7276:7;7375:1;7371;:5;7363:44;;;;;-1:-1:-1;;;7363:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7418:9;7434:1;7430;:5;;;;;;;7218:333;-1:-1:-1;;;;7218:333:0:o;17448:306::-;-1:-1:-1;;;;;17523:21:0;;17515:67;;;;-1:-1:-1;;;17515:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17610:12;;:23;;17627:5;17610:23;:16;:23;:::i;:::-;17595:12;:38;-1:-1:-1;;;;;17665:18:0;;;;;;:9;:18;;;;;;:29;;17688:5;17665:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;17644:18:0;;;;;;:9;:18;;;;;;;;:50;;;;17710:36;;;;;;;17644:18;;17710:36;;;;;;;;;;;17448:306;;:::o;34876:601::-;34939:14;34979:31;35013:27;:15;:25;:27::i;:::-;34979:61;-1:-1:-1;35049:21:0;;;35098:374;35122:14;:21;35118:1;:25;35098:374;;;35259:46;35287:14;35302:1;35287:17;;;;;;;;;;;;;;35259:27;:46::i;:::-;-1:-1:-1;35230:75:0;;-1:-1:-1;35230:75:0;-1:-1:-1;;;;;;;;35318:23:0;;35336:4;35318:23;35314:151;;;35430:25;:6;35441:13;35430:25;:10;:25;:::i;:::-;;35314:151;35145:3;;35098:374;;;;34876:601;;;;:::o;27368:286::-;27451:16;27479:23;27519:3;:10;;:17;;;;27505:32;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;27505:32:0;;27479:58;;27549:9;27544:85;27564:10;;;:17;27560:21;;27544:85;;;27608:3;:10;;27619:1;27608:13;;;;;;;;;;;;;;;;27596:6;27603:1;27596:9;;;;;;;;;;;;;;;;;:25;27583:3;;27544:85;;;-1:-1:-1;27642:6:0;27368:286;-1:-1:-1;;27368:286:0:o;26876:147::-;26973:4;26996:16;;;;;;;;;;;;:21;;;26876:147::o;22197:84::-;19070:42;-1:-1:-1;;;;;22251:13:0;;22265:9;22251:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22251:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22251:24:0;;;;22197:84;:::o;25879:919::-;25964:4;25984:20;25993:3;25998:5;25984:8;:20::i;:::-;25980:813;;;26014:21;26038:16;;;;;;;;;;;26057:1;26087:10;;:17;-1:-1:-1;;26038:20:0;;;;26087:21;26223:26;;;26219:343;;26262:17;26282:3;:10;;26293:9;26282:21;;;;;;;;;;;;;;;;26262:41;;26416:9;26388:3;:10;;26399:13;26388:25;;;;;;;;;;;;;;;;;;;:37;;;;26485:20;;;;;;;;;26524:1;26508:17;;26485:40;;26219:343;26634:9;:16;;;;;;;;;;26627:23;26712:10;;;:16;;;;;;;;;;;;;;;;;;;;;;;;26746:4;26739:11;;;;;;25980:813;-1:-1:-1;26780:5:0;26773:12;;21881:139;21968:46;;;-1:-1:-1;;;21968:46:0;;;;;;;;;;;;;;;;;;;;;;19070:42;;21968:13;;:46;;;;;-1:-1:-1;;21968:46:0;;;;;;;-1:-1:-1;19070:42:0;21968:46;;;5:2:-1;;;;30:1;27;20:12;5:2;21968:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21968:46:0;;;;21881:139;;;:::o;25371:382::-;25453:4;25474:20;25483:3;25488:5;25474:8;:20::i;:::-;25469:279;;-1:-1:-1;25505:10:0;;;;27::-1;;23:18;;;45:23;;-1:-1;25505:22:0;;;;;;;;;;;;;25668:17;;25649:16;;;;;;;;;;;:36;25694:11;
Swarm Source
bzzr://06cadbbf977d42e18db869a0197e2e7891b75f31b7cbcdb2cbbc6f1bf9fc09cf
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.