More Info
Private Name Tags
ContractCreator:
Latest 25 from a total of 21,103 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Emergency Withdr... | 47930856 | 547 days ago | IN | 0 FTM | 0.0311165 | ||||
Deposit | 47930793 | 547 days ago | IN | 0 FTM | 0.04554696 | ||||
Withdraw | 47930204 | 547 days ago | IN | 0 FTM | 0.0713103 | ||||
Deposit | 47929897 | 547 days ago | IN | 0 FTM | 0.0844788 | ||||
Deposit | 34981439 | 727 days ago | IN | 0 FTM | 0.01054692 | ||||
Withdraw | 34490158 | 733 days ago | IN | 0 FTM | 0.06904677 | ||||
Deposit | 32781439 | 752 days ago | IN | 0 FTM | 0.17144825 | ||||
Withdraw | 32704172 | 753 days ago | IN | 0 FTM | 0.17055773 | ||||
Update Pool | 32701089 | 754 days ago | IN | 0 FTM | 0.00970098 | ||||
Deposit | 32700965 | 754 days ago | IN | 0 FTM | 0.01523566 | ||||
Deposit | 32700888 | 754 days ago | IN | 0 FTM | 0.14014681 | ||||
Withdraw | 31375085 | 769 days ago | IN | 0 FTM | 0.0291428 | ||||
Deposit | 31375036 | 769 days ago | IN | 0 FTM | 0.00825357 | ||||
Emergency Withdr... | 31061455 | 772 days ago | IN | 0 FTM | 0.08288787 | ||||
Emergency Withdr... | 31061435 | 772 days ago | IN | 0 FTM | 0.08287718 | ||||
Deposit | 31059459 | 772 days ago | IN | 0 FTM | 0.13623439 | ||||
Deposit | 31058754 | 772 days ago | IN | 0 FTM | 0.01175578 | ||||
Deposit | 31058367 | 772 days ago | IN | 0 FTM | 0.01091631 | ||||
Deposit | 31058171 | 772 days ago | IN | 0 FTM | 0.10614748 | ||||
Withdraw | 30655734 | 776 days ago | IN | 0 FTM | 0.11314343 | ||||
Withdraw | 30655719 | 776 days ago | IN | 0 FTM | 0.12135905 | ||||
Deposit | 30646492 | 776 days ago | IN | 0 FTM | 0.06842959 | ||||
Withdraw | 30646106 | 776 days ago | IN | 0 FTM | 0.06648924 | ||||
Deposit | 30646097 | 776 days ago | IN | 0 FTM | 0.00724087 | ||||
Deposit | 30643488 | 776 days ago | IN | 0 FTM | 0.06727483 |
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
6605456 | 1047 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
EsterVaultFarm
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-05-16 */ // SPDX-License-Identifier: MIT pragma solidity 0.6.12; // import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol"; 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; } } 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; } } 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 ); } contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override 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 virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); 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 `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub( amount, "ERC20: transfer amount exceeds allowance" ) ); 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 virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][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 virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].sub( subtractedValue, "ERC20: decreased allowance below zero" ) ); 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 virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub( amount, "ERC20: transfer amount exceeds balance" ); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @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 virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `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 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub( amount, "ERC20: burn amount exceeds balance" ); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This 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 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/SafeERC20.sol"; 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 on 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" ); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.3._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.3._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // 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); } } } } 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" ); } } } // import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/EnumerableSet.sol"; library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value 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 _at(Set storage set, uint256 index) private view returns (bytes32) { require( set._values.length > index, "EnumerableSet: index out of bounds" ); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value 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 at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value 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 at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value 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 at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol"; abstract 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; } } // "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol"; abstract 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; } } abstract contract ESTToken is ERC20 { function mint(address _to, uint256 _amount) public virtual; } // For interacting with our own strategy interface IStrategy { // Total want tokens managed by stratfegy function wantLockedTotal() external view returns (uint256); // Sum of all shares of users to wantLockedTotal function sharesTotal() external view returns (uint256); // Main want token compounding function function earn() external; function deposit(address _userAddress, uint256 _wantAmt) external returns (uint256); function withdraw(address _userAddress, uint256 _wantAmt) external returns (uint256); function inCaseTokensGetStuck( address _token, uint256 _amount, address _to ) external; } contract EsterVaultFarm is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 shares; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. // We do some fancy math here. Basically, any point in time, the amount of EST // entitled to a user but is pending to be distributed is: // // amount = user.shares / sharesTotal * wantLockedTotal // pending reward = (amount * pool.accESTPerShare) - user.rewardDebt // // Whenever a user deposits or withdraws want tokens to a pool. Here's what happens: // 1. The pool's `accESTPerShare` (and `lastRewardTime`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. } struct PoolInfo { IERC20 want; // Address of the want token. uint256 allocPoint; // How many allocation points assigned to this pool. EST to distribute per block. uint256 lastRewardTime; // Last block number that EST distribution occurs. uint256 accESTPerShare; // Accumulated EST per share, times 1e12. See below. address strat; // Strategy address that will EST compound want tokens } address public EST = 0x181F3F22C9a751E2ce673498A03E1FDFC0ebBFB6; address public burnAddress = 0x000000000000000000000000000000000000dEaD; uint256 public ownerESTReward = 100; uint256 public ESTMaxSupply = 3000001e18; uint256 public ESTPerSecond = 64000000000000000; // EST tokens created per block uint256 private constant maxEstPerSecond = 100000000000000000; uint256 public startTime = 1621260000; PoolInfo[] public poolInfo; // Info of each pool. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Info of each user that stakes LP tokens. uint256 public totalAllocPoint = 0; // Total allocation points. Must be the sum of all allocation points in all pools. event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw( address indexed user, uint256 indexed pid, uint256 amount ); function poolLength() external view returns (uint256) { return poolInfo.length; } // Add a new lp to the pool. Can only be called by the owner. // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do. (Only if want tokens are stored here.) function add( uint256 _allocPoint, IERC20 _want, bool _withUpdate, address _strat ) public onlyOwner { if (_withUpdate) { massUpdatePools(); } uint256 lastRewardTime = block.timestamp > startTime ? block.timestamp : startTime; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push( PoolInfo({ want: _want, allocPoint: _allocPoint, lastRewardTime: lastRewardTime, accESTPerShare: 0, strat: _strat }) ); } // Update the given pool's EST allocation point. Can only be called by the owner. function set( uint256 _pid, uint256 _allocPoint, bool _withUpdate ) public onlyOwner { if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add( _allocPoint ); poolInfo[_pid].allocPoint = _allocPoint; } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) { if (IERC20(EST).totalSupply() >= ESTMaxSupply) { return 0; } return _to.sub(_from); } // View function to see pending EST on frontend. function pendingEST(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accESTPerShare = pool.accESTPerShare; uint256 sharesTotal = IStrategy(pool.strat).sharesTotal(); if (block.timestamp > pool.lastRewardTime && sharesTotal != 0) { uint256 multiplier = getMultiplier(pool.lastRewardTime, block.timestamp); uint256 ESTReward = multiplier.mul(ESTPerSecond).mul(pool.allocPoint).div( totalAllocPoint ); accESTPerShare = accESTPerShare.add( ESTReward.mul(1e12).div(sharesTotal) ); } return user.shares.mul(accESTPerShare).div(1e12).sub(user.rewardDebt); } // View function to see staked Want tokens on frontend. function stakedWantTokens(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 sharesTotal = IStrategy(pool.strat).sharesTotal(); uint256 wantLockedTotal = IStrategy(poolInfo[_pid].strat).wantLockedTotal(); if (sharesTotal == 0) { return 0; } return user.shares.mul(wantLockedTotal).div(sharesTotal); } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardTime) { return; } uint256 sharesTotal = IStrategy(pool.strat).sharesTotal(); if (sharesTotal == 0) { pool.lastRewardTime = block.timestamp; return; } uint256 multiplier = getMultiplier(pool.lastRewardTime, block.timestamp); if (multiplier <= 0) { return; } uint256 ESTReward = multiplier.mul(ESTPerSecond).mul(pool.allocPoint).div( totalAllocPoint ); ESTToken(EST).mint( owner(), ESTReward.mul(ownerESTReward).div(1000) ); ESTToken(EST).mint(address(this), ESTReward); pool.accESTPerShare = pool.accESTPerShare.add( ESTReward.mul(1e12).div(sharesTotal) ); pool.lastRewardTime = block.timestamp; } // Want tokens moved from user -> ESTFarm (EST allocation) -> Strat (compounding) function deposit(uint256 _pid, uint256 _wantAmt) public nonReentrant { updatePool(_pid); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; if (user.shares > 0) { uint256 pending = user.shares.mul(pool.accESTPerShare).div(1e12).sub( user.rewardDebt ); if (pending > 0) { safeESTTransfer(msg.sender, pending); } } if (_wantAmt > 0) { pool.want.safeTransferFrom( address(msg.sender), address(this), _wantAmt ); pool.want.safeIncreaseAllowance(pool.strat, _wantAmt); uint256 sharesAdded = IStrategy(poolInfo[_pid].strat).deposit(msg.sender, _wantAmt); user.shares = user.shares.add(sharesAdded); } user.rewardDebt = user.shares.mul(pool.accESTPerShare).div(1e12); emit Deposit(msg.sender, _pid, _wantAmt); } // Withdraw LP tokens from MasterChef. function withdraw(uint256 _pid, uint256 _wantAmt) public nonReentrant { updatePool(_pid); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 wantLockedTotal = IStrategy(poolInfo[_pid].strat).wantLockedTotal(); uint256 sharesTotal = IStrategy(poolInfo[_pid].strat).sharesTotal(); require(user.shares > 0, "user.shares is 0"); require(sharesTotal > 0, "sharesTotal is 0"); // Withdraw pending EST uint256 pending = user.shares.mul(pool.accESTPerShare).div(1e12).sub( user.rewardDebt ); if (pending > 0) { safeESTTransfer(msg.sender, pending); } // Withdraw want tokens uint256 amount = user.shares.mul(wantLockedTotal).div(sharesTotal); if (_wantAmt > amount) { _wantAmt = amount; } if (_wantAmt > 0) { uint256 sharesRemoved = IStrategy(poolInfo[_pid].strat).withdraw(msg.sender, _wantAmt); if (sharesRemoved > user.shares) { user.shares = 0; } else { user.shares = user.shares.sub(sharesRemoved); } uint256 wantBal = IERC20(pool.want).balanceOf(address(this)); if (wantBal < _wantAmt) { _wantAmt = wantBal; } pool.want.safeTransfer(address(msg.sender), _wantAmt); } user.rewardDebt = user.shares.mul(pool.accESTPerShare).div(1e12); emit Withdraw(msg.sender, _pid, _wantAmt); } function setESTPerSecond(uint _estPerSecond) external onlyOwner { require(_estPerSecond <= maxEstPerSecond, "setEstPerSecond: too many ests!"); massUpdatePools(); ESTPerSecond = _estPerSecond; } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 wantLockedTotal = IStrategy(poolInfo[_pid].strat).wantLockedTotal(); uint256 sharesTotal = IStrategy(poolInfo[_pid].strat).sharesTotal(); uint256 amount = user.shares.mul(wantLockedTotal).div(sharesTotal); IStrategy(poolInfo[_pid].strat).withdraw(msg.sender, amount); pool.want.safeTransfer(address(msg.sender), amount); emit EmergencyWithdraw(msg.sender, _pid, amount); user.shares = 0; user.rewardDebt = 0; } // Safe EST transfer function, just in case if rounding error causes pool to not have enough function safeESTTransfer(address _to, uint256 _ESTAmt) internal { uint256 ESTBal = IERC20(EST).balanceOf(address(this)); if (_ESTAmt > ESTBal) { IERC20(EST).transfer(_to, ESTBal); } else { IERC20(EST).transfer(_to, _ESTAmt); } } function inCaseTokensGetStuck(address _token, uint256 _amount) public onlyOwner { require(_token != EST, "!safe"); IERC20(_token).safeTransfer(msg.sender, _amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","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":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"EST","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ESTMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ESTPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_want","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"},{"internalType":"address","name":"_strat","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_wantAmt","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"inCaseTokensGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerESTReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingEST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"want","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"accESTPerShare","type":"uint256"},{"internalType":"address","name":"strat","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_estPerSecond","type":"uint256"}],"name":"setESTPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"stakedWantTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_wantAmt","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600280546001600160a01b031990811673181f3f22c9a751e2ce673498a03e1fdfc0ebbfb6179091556003805490911661dead17905560646004556a027b46614d1d7c8a64000060055566e35fa931a000006006556360a276e06007556000600a5534801561007257600080fd5b50600061007d6100d0565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180556100d4565b3390565b612344806100e36000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80636d9e7e1d116100de5780638dbb1e3a11610097578063c6d758cb11610071578063c6d758cb146103fc578063d06076fd14610428578063e2bbb15814610430578063f2fde38b1461045357610173565b80638dbb1e3a1461038c57806393f1a40b146103af578063aada310d146103f457610173565b80636d9e7e1d1461031457806370d5ae0514610340578063715018a61461034857806378e97925146103505780637b84daec146103585780638da5cb5b1461038457610173565b8063454dab6111610130578063454dab611461026157806351eb05a6146102695780635312ea8e146102865780635f70edcf146102a3578063630b5ba1146102e157806364482f79146102e957610173565b8063081e3eda146101785780631526fe271461019257806317caf6f1146101f35780632541947f146101fb57806326070c541461021f578063441a3e701461023e575b600080fd5b610180610479565b60408051918252519081900360200190f35b6101af600480360360208110156101a857600080fd5b503561047f565b60405180866001600160a01b03168152602001858152602001848152602001838152602001826001600160a01b031681526020019550505050505060405180910390f35b6101806104ca565b6102036104d0565b604080516001600160a01b039092168252519081900360200190f35b61023c6004803603602081101561023557600080fd5b50356104df565b005b61023c6004803603604081101561025457600080fd5b50803590602001356105a1565b610180610a40565b61023c6004803603602081101561027f57600080fd5b5035610a46565b61023c6004803603602081101561029c57600080fd5b5035610c95565b61023c600480360360808110156102b957600080fd5b508035906001600160a01b036020820135811691604081013515159160609091013516610f7b565b61023c611133565b61023c600480360360608110156102ff57600080fd5b50803590602081013590604001351515611156565b6101806004803603604081101561032a57600080fd5b50803590602001356001600160a01b0316611227565b610203611386565b61023c611395565b610180611437565b6101806004803603604081101561036e57600080fd5b50803590602001356001600160a01b031661143d565b6102036115ad565b610180600480360360408110156103a257600080fd5b50803590602001356115bc565b6103db600480360360408110156103c557600080fd5b50803590602001356001600160a01b031661164f565b6040805192835260208301919091528051918290030190f35b610180611673565b61023c6004803603604081101561041257600080fd5b506001600160a01b038135169060200135611679565b610180611730565b61023c6004803603604081101561044657600080fd5b5080359060200135611736565b61023c6004803603602081101561046957600080fd5b50356001600160a01b031661196a565b60085490565b6008818154811061048c57fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0393841695509193909290911685565b600a5481565b6002546001600160a01b031681565b6104e7611a62565b6000546001600160a01b03908116911614610537576040805162461bcd60e51b815260206004820181905260248201526000805160206122c5833981519152604482015290519081900360640190fd5b67016345785d8a0000811115610594576040805162461bcd60e51b815260206004820152601f60248201527f7365744573745065725365636f6e643a20746f6f206d616e7920657374732100604482015290519081900360640190fd5b61059c611133565b600655565b600260015414156105f9576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260015561060782610a46565b60006008838154811061061657fe5b60009182526020808320868452600982526040808520338652909252908320600880546005909402909201945092918690811061064f57fe5b906000526020600020906005020160040160009054906101000a90046001600160a01b03166001600160a01b03166342da4eb36040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ac57600080fd5b505afa1580156106c0573d6000803e3d6000fd5b505050506040513d60208110156106d657600080fd5b505160088054919250600091879081106106ec57fe5b906000526020600020906005020160040160009054906101000a90046001600160a01b03166001600160a01b03166344a3955e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561074957600080fd5b505afa15801561075d573d6000803e3d6000fd5b505050506040513d602081101561077357600080fd5b505183549091506107be576040805162461bcd60e51b815260206004820152601060248201526f0757365722e73686172657320697320360841b604482015290519081900360640190fd5b60008111610806576040805162461bcd60e51b815260206004820152601060248201526f0736861726573546f74616c20697320360841b604482015290519081900360640190fd5b6000610840846001015461083a64e8d4a5100061083489600301548960000154611a6690919063ffffffff16565b90611abf565b90611b01565b90508015610852576108523382611b43565b83546000906108679084906108349087611a66565b905080871115610875578096505b86156109db5760006008898154811061088a57fe5b6000918252602080832060046005909302018201546040805163f3fef3a360e01b81523394810194909452602484018d9052516001600160a01b039091169363f3fef3a3936044808201949392918390030190829087803b1580156108ee57600080fd5b505af1158015610902573d6000803e3d6000fd5b505050506040513d602081101561091857600080fd5b5051865490915081111561092f576000865561093e565b855461093b9082611b01565b86555b8654604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561098857600080fd5b505afa15801561099c573d6000803e3d6000fd5b505050506040513d60208110156109b257600080fd5b50519050888110156109c2578098505b87546109d8906001600160a01b0316338b611cd4565b50505b600386015485546109f69164e8d4a510009161083491611a66565b6001860155604080518881529051899133917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a3505060018055505050505050565b60065481565b600060088281548110610a5557fe5b9060005260206000209060050201905080600201544211610a765750610c92565b60008160040160009054906101000a90046001600160a01b03166001600160a01b03166344a3955e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ac857600080fd5b505afa158015610adc573d6000803e3d6000fd5b505050506040513d6020811015610af257600080fd5b5051905080610b08575042600290910155610c92565b6000610b188360020154426115bc565b905060008111610b2a57505050610c92565b6000610b55600a546108348660010154610b4f60065487611a6690919063ffffffff16565b90611a66565b6002549091506001600160a01b03166340c10f19610b716115ad565b610b8c6103e861083460045487611a6690919063ffffffff16565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610bd257600080fd5b505af1158015610be6573d6000803e3d6000fd5b5050600254604080516340c10f1960e01b81523060048201526024810186905290516001600160a01b0390921693506340c10f19925060448082019260009290919082900301818387803b158015610c3d57600080fd5b505af1158015610c51573d6000803e3d6000fd5b50505050610c7f610c748461083464e8d4a5100085611a6690919063ffffffff16565b600386015490611d26565b6003850155505042600290920191909155505b50565b60026001541415610ced576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600181905550600060088281548110610d0457fe5b600091825260208083208584526009825260408085203386529092529083206008805460059094029092019450929185908110610d3d57fe5b906000526020600020906005020160040160009054906101000a90046001600160a01b03166001600160a01b03166342da4eb36040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9a57600080fd5b505afa158015610dae573d6000803e3d6000fd5b505050506040513d6020811015610dc457600080fd5b50516008805491925060009186908110610dda57fe5b906000526020600020906005020160040160009054906101000a90046001600160a01b03166001600160a01b03166344a3955e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e3757600080fd5b505afa158015610e4b573d6000803e3d6000fd5b505050506040513d6020811015610e6157600080fd5b50518354909150600090610e7b9083906108349086611a66565b905060088681548110610e8a57fe5b6000918252602080832060046005909302018201546040805163f3fef3a360e01b8152339481019490945260248401869052516001600160a01b039091169363f3fef3a3936044808201949392918390030190829087803b158015610eee57600080fd5b505af1158015610f02573d6000803e3d6000fd5b505050506040513d6020811015610f1857600080fd5b50508454610f30906001600160a01b03163383611cd4565b604080518281529051879133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a3505060008083556001928301555080555050565b610f83611a62565b6000546001600160a01b03908116911614610fd3576040805162461bcd60e51b815260206004820181905260248201526000805160206122c5833981519152604482015290519081900360640190fd5b8115610fe157610fe1611133565b60006007544211610ff457600754610ff6565b425b600a549091506110069086611d26565b600a556040805160a0810182526001600160a01b0395861681526020810196875290810191825260006060820181815293861660808301908152600880546001810182559252915160059091027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3810180549288166001600160a01b031993841617905596517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee488015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee587015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee686015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee7909401805494909316931692909217905550565b60085460005b818110156111525761114a81610a46565b600101611139565b5050565b61115e611a62565b6000546001600160a01b039081169116146111ae576040805162461bcd60e51b815260206004820181905260248201526000805160206122c5833981519152604482015290519081900360640190fd5b80156111bc576111bc611133565b6111f9826111f3600886815481106111d057fe5b906000526020600020906005020160010154600a54611b0190919063ffffffff16565b90611d26565b600a81905550816008848154811061120d57fe5b906000526020600020906005020160010181905550505050565b6000806008848154811061123757fe5b600091825260208083208784526009825260408085206001600160a01b03898116875290845281862060059590950290920160038101546004808301548451632251caaf60e11b8152945193995096979196919591909416936344a3955e93808201939190829003018186803b1580156112b057600080fd5b505afa1580156112c4573d6000803e3d6000fd5b505050506040513d60208110156112da57600080fd5b50516002850154909150421180156112f157508015155b156113515760006113068560020154426115bc565b9050600061132d600a546108348860010154610b4f60065487611a6690919063ffffffff16565b905061134c611345846108348464e8d4a51000611a66565b8590611d26565b935050505b611379836001015461083a64e8d4a51000610834868860000154611a6690919063ffffffff16565b9450505050505b92915050565b6003546001600160a01b031681565b61139d611a62565b6000546001600160a01b039081169116146113ed576040805162461bcd60e51b815260206004820181905260248201526000805160206122c5833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60075481565b6000806008848154811061144d57fe5b600091825260208083208784526009825260408085206001600160a01b03808a16875290845281862060046005909602909301858101548351632251caaf60e11b8152935191985093969593909116936344a3955e9383810193919291829003018186803b1580156114be57600080fd5b505afa1580156114d2573d6000803e3d6000fd5b505050506040513d60208110156114e857600080fd5b505160088054919250600091889081106114fe57fe5b906000526020600020906005020160040160009054906101000a90046001600160a01b03166001600160a01b03166342da4eb36040518163ffffffff1660e01b815260040160206040518083038186803b15801561155b57600080fd5b505afa15801561156f573d6000803e3d6000fd5b505050506040513d602081101561158557600080fd5b505190508161159b576000945050505050611380565b82546113799083906108349084611a66565b6000546001600160a01b031690565b600554600254604080516318160ddd60e01b81529051600093926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561160557600080fd5b505afa158015611619573d6000803e3d6000fd5b505050506040513d602081101561162f57600080fd5b50511061163e57506000611380565b6116488284611b01565b9392505050565b60096020908152600092835260408084209091529082529020805460019091015482565b60045481565b611681611a62565b6000546001600160a01b039081169116146116d1576040805162461bcd60e51b815260206004820181905260248201526000805160206122c5833981519152604482015290519081900360640190fd5b6002546001600160a01b038381169116141561171c576040805162461bcd60e51b8152602060048201526005602482015264217361666560d81b604482015290519081900360640190fd5b6111526001600160a01b0383163383611cd4565b60055481565b6002600154141561178e576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260015561179c82610a46565b6000600883815481106117ab57fe5b6000918252602080832086845260098252604080852033865290925292208054600590920290920192501561181c576000611808826001015461083a64e8d4a5100061083487600301548760000154611a6690919063ffffffff16565b9050801561181a5761181a3382611b43565b505b8215611909578154611839906001600160a01b0316333086611d80565b60048201548254611857916001600160a01b03918216911685611de0565b60006008858154811061186657fe5b600091825260208083206004600590930201820154604080516311f9fbc960e21b8152339481019490945260248401899052516001600160a01b03909116936347e7ef24936044808201949392918390030190829087803b1580156118ca57600080fd5b505af11580156118de573d6000803e3d6000fd5b505050506040513d60208110156118f457600080fd5b505182549091506119059082611d26565b8255505b600382015481546119249164e8d4a510009161083491611a66565b6001820155604080518481529051859133917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a35050600180555050565b611972611a62565b6000546001600160a01b039081169116146119c2576040805162461bcd60e51b815260206004820181905260248201526000805160206122c5833981519152604482015290519081900360640190fd5b6001600160a01b038116611a075760405162461bcd60e51b81526004018080602001828103825260268152602001806122586026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b600082611a7557506000611380565b82820282848281611a8257fe5b04146116485760405162461bcd60e51b81526004018080602001828103825260218152602001806122a46021913960400191505060405180910390fd5b600061164883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611ecb565b600061164883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f6d565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611b8e57600080fd5b505afa158015611ba2573d6000803e3d6000fd5b505050506040513d6020811015611bb857600080fd5b5051905080821115611c4c576002546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611c1a57600080fd5b505af1158015611c2e573d6000803e3d6000fd5b505050506040513d6020811015611c4457600080fd5b50611ccf9050565b6002546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611ca257600080fd5b505af1158015611cb6573d6000803e3d6000fd5b505050506040513d6020811015611ccc57600080fd5b50505b505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611ccf908490611fc7565b600082820183811015611648576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611dda908590611fc7565b50505050565b6000611e7682856001600160a01b031663dd62ed3e30876040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015611e4457600080fd5b505afa158015611e58573d6000803e3d6000fd5b505050506040513d6020811015611e6e57600080fd5b505190611d26565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052909150611dda908590611fc7565b60008183611f575760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f1c578181015183820152602001611f04565b50505050905090810190601f168015611f495780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611f6357fe5b0495945050505050565b60008184841115611fbf5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611f1c578181015183820152602001611f04565b505050900390565b606061201c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120789092919063ffffffff16565b805190915015611ccf5780806020019051602081101561203b57600080fd5b5051611ccf5760405162461bcd60e51b815260040180806020018281038252602a8152602001806122e5602a913960400191505060405180910390fd5b6060612087848460008561208f565b949350505050565b6060824710156120d05760405162461bcd60e51b815260040180806020018281038252602681526020018061227e6026913960400191505060405180910390fd5b6120d9856121eb565b61212a576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106121695780518252601f19909201916020918201910161214a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146121cb576040519150601f19603f3d011682016040523d82523d6000602084013e6121d0565b606091505b50915091506121e08282866121f1565b979650505050505050565b3b151590565b60608315612200575081611648565b8251156122105782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315611f1c578181015183820152602001611f0456fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220a1a946fbce89e01cb3113f45d08191373295a7f4b110e4bf0169cd26e272030564736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c80636d9e7e1d116100de5780638dbb1e3a11610097578063c6d758cb11610071578063c6d758cb146103fc578063d06076fd14610428578063e2bbb15814610430578063f2fde38b1461045357610173565b80638dbb1e3a1461038c57806393f1a40b146103af578063aada310d146103f457610173565b80636d9e7e1d1461031457806370d5ae0514610340578063715018a61461034857806378e97925146103505780637b84daec146103585780638da5cb5b1461038457610173565b8063454dab6111610130578063454dab611461026157806351eb05a6146102695780635312ea8e146102865780635f70edcf146102a3578063630b5ba1146102e157806364482f79146102e957610173565b8063081e3eda146101785780631526fe271461019257806317caf6f1146101f35780632541947f146101fb57806326070c541461021f578063441a3e701461023e575b600080fd5b610180610479565b60408051918252519081900360200190f35b6101af600480360360208110156101a857600080fd5b503561047f565b60405180866001600160a01b03168152602001858152602001848152602001838152602001826001600160a01b031681526020019550505050505060405180910390f35b6101806104ca565b6102036104d0565b604080516001600160a01b039092168252519081900360200190f35b61023c6004803603602081101561023557600080fd5b50356104df565b005b61023c6004803603604081101561025457600080fd5b50803590602001356105a1565b610180610a40565b61023c6004803603602081101561027f57600080fd5b5035610a46565b61023c6004803603602081101561029c57600080fd5b5035610c95565b61023c600480360360808110156102b957600080fd5b508035906001600160a01b036020820135811691604081013515159160609091013516610f7b565b61023c611133565b61023c600480360360608110156102ff57600080fd5b50803590602081013590604001351515611156565b6101806004803603604081101561032a57600080fd5b50803590602001356001600160a01b0316611227565b610203611386565b61023c611395565b610180611437565b6101806004803603604081101561036e57600080fd5b50803590602001356001600160a01b031661143d565b6102036115ad565b610180600480360360408110156103a257600080fd5b50803590602001356115bc565b6103db600480360360408110156103c557600080fd5b50803590602001356001600160a01b031661164f565b6040805192835260208301919091528051918290030190f35b610180611673565b61023c6004803603604081101561041257600080fd5b506001600160a01b038135169060200135611679565b610180611730565b61023c6004803603604081101561044657600080fd5b5080359060200135611736565b61023c6004803603602081101561046957600080fd5b50356001600160a01b031661196a565b60085490565b6008818154811061048c57fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0393841695509193909290911685565b600a5481565b6002546001600160a01b031681565b6104e7611a62565b6000546001600160a01b03908116911614610537576040805162461bcd60e51b815260206004820181905260248201526000805160206122c5833981519152604482015290519081900360640190fd5b67016345785d8a0000811115610594576040805162461bcd60e51b815260206004820152601f60248201527f7365744573745065725365636f6e643a20746f6f206d616e7920657374732100604482015290519081900360640190fd5b61059c611133565b600655565b600260015414156105f9576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260015561060782610a46565b60006008838154811061061657fe5b60009182526020808320868452600982526040808520338652909252908320600880546005909402909201945092918690811061064f57fe5b906000526020600020906005020160040160009054906101000a90046001600160a01b03166001600160a01b03166342da4eb36040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ac57600080fd5b505afa1580156106c0573d6000803e3d6000fd5b505050506040513d60208110156106d657600080fd5b505160088054919250600091879081106106ec57fe5b906000526020600020906005020160040160009054906101000a90046001600160a01b03166001600160a01b03166344a3955e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561074957600080fd5b505afa15801561075d573d6000803e3d6000fd5b505050506040513d602081101561077357600080fd5b505183549091506107be576040805162461bcd60e51b815260206004820152601060248201526f0757365722e73686172657320697320360841b604482015290519081900360640190fd5b60008111610806576040805162461bcd60e51b815260206004820152601060248201526f0736861726573546f74616c20697320360841b604482015290519081900360640190fd5b6000610840846001015461083a64e8d4a5100061083489600301548960000154611a6690919063ffffffff16565b90611abf565b90611b01565b90508015610852576108523382611b43565b83546000906108679084906108349087611a66565b905080871115610875578096505b86156109db5760006008898154811061088a57fe5b6000918252602080832060046005909302018201546040805163f3fef3a360e01b81523394810194909452602484018d9052516001600160a01b039091169363f3fef3a3936044808201949392918390030190829087803b1580156108ee57600080fd5b505af1158015610902573d6000803e3d6000fd5b505050506040513d602081101561091857600080fd5b5051865490915081111561092f576000865561093e565b855461093b9082611b01565b86555b8654604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561098857600080fd5b505afa15801561099c573d6000803e3d6000fd5b505050506040513d60208110156109b257600080fd5b50519050888110156109c2578098505b87546109d8906001600160a01b0316338b611cd4565b50505b600386015485546109f69164e8d4a510009161083491611a66565b6001860155604080518881529051899133917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a3505060018055505050505050565b60065481565b600060088281548110610a5557fe5b9060005260206000209060050201905080600201544211610a765750610c92565b60008160040160009054906101000a90046001600160a01b03166001600160a01b03166344a3955e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ac857600080fd5b505afa158015610adc573d6000803e3d6000fd5b505050506040513d6020811015610af257600080fd5b5051905080610b08575042600290910155610c92565b6000610b188360020154426115bc565b905060008111610b2a57505050610c92565b6000610b55600a546108348660010154610b4f60065487611a6690919063ffffffff16565b90611a66565b6002549091506001600160a01b03166340c10f19610b716115ad565b610b8c6103e861083460045487611a6690919063ffffffff16565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610bd257600080fd5b505af1158015610be6573d6000803e3d6000fd5b5050600254604080516340c10f1960e01b81523060048201526024810186905290516001600160a01b0390921693506340c10f19925060448082019260009290919082900301818387803b158015610c3d57600080fd5b505af1158015610c51573d6000803e3d6000fd5b50505050610c7f610c748461083464e8d4a5100085611a6690919063ffffffff16565b600386015490611d26565b6003850155505042600290920191909155505b50565b60026001541415610ced576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600181905550600060088281548110610d0457fe5b600091825260208083208584526009825260408085203386529092529083206008805460059094029092019450929185908110610d3d57fe5b906000526020600020906005020160040160009054906101000a90046001600160a01b03166001600160a01b03166342da4eb36040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9a57600080fd5b505afa158015610dae573d6000803e3d6000fd5b505050506040513d6020811015610dc457600080fd5b50516008805491925060009186908110610dda57fe5b906000526020600020906005020160040160009054906101000a90046001600160a01b03166001600160a01b03166344a3955e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e3757600080fd5b505afa158015610e4b573d6000803e3d6000fd5b505050506040513d6020811015610e6157600080fd5b50518354909150600090610e7b9083906108349086611a66565b905060088681548110610e8a57fe5b6000918252602080832060046005909302018201546040805163f3fef3a360e01b8152339481019490945260248401869052516001600160a01b039091169363f3fef3a3936044808201949392918390030190829087803b158015610eee57600080fd5b505af1158015610f02573d6000803e3d6000fd5b505050506040513d6020811015610f1857600080fd5b50508454610f30906001600160a01b03163383611cd4565b604080518281529051879133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a3505060008083556001928301555080555050565b610f83611a62565b6000546001600160a01b03908116911614610fd3576040805162461bcd60e51b815260206004820181905260248201526000805160206122c5833981519152604482015290519081900360640190fd5b8115610fe157610fe1611133565b60006007544211610ff457600754610ff6565b425b600a549091506110069086611d26565b600a556040805160a0810182526001600160a01b0395861681526020810196875290810191825260006060820181815293861660808301908152600880546001810182559252915160059091027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3810180549288166001600160a01b031993841617905596517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee488015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee587015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee686015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee7909401805494909316931692909217905550565b60085460005b818110156111525761114a81610a46565b600101611139565b5050565b61115e611a62565b6000546001600160a01b039081169116146111ae576040805162461bcd60e51b815260206004820181905260248201526000805160206122c5833981519152604482015290519081900360640190fd5b80156111bc576111bc611133565b6111f9826111f3600886815481106111d057fe5b906000526020600020906005020160010154600a54611b0190919063ffffffff16565b90611d26565b600a81905550816008848154811061120d57fe5b906000526020600020906005020160010181905550505050565b6000806008848154811061123757fe5b600091825260208083208784526009825260408085206001600160a01b03898116875290845281862060059590950290920160038101546004808301548451632251caaf60e11b8152945193995096979196919591909416936344a3955e93808201939190829003018186803b1580156112b057600080fd5b505afa1580156112c4573d6000803e3d6000fd5b505050506040513d60208110156112da57600080fd5b50516002850154909150421180156112f157508015155b156113515760006113068560020154426115bc565b9050600061132d600a546108348860010154610b4f60065487611a6690919063ffffffff16565b905061134c611345846108348464e8d4a51000611a66565b8590611d26565b935050505b611379836001015461083a64e8d4a51000610834868860000154611a6690919063ffffffff16565b9450505050505b92915050565b6003546001600160a01b031681565b61139d611a62565b6000546001600160a01b039081169116146113ed576040805162461bcd60e51b815260206004820181905260248201526000805160206122c5833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60075481565b6000806008848154811061144d57fe5b600091825260208083208784526009825260408085206001600160a01b03808a16875290845281862060046005909602909301858101548351632251caaf60e11b8152935191985093969593909116936344a3955e9383810193919291829003018186803b1580156114be57600080fd5b505afa1580156114d2573d6000803e3d6000fd5b505050506040513d60208110156114e857600080fd5b505160088054919250600091889081106114fe57fe5b906000526020600020906005020160040160009054906101000a90046001600160a01b03166001600160a01b03166342da4eb36040518163ffffffff1660e01b815260040160206040518083038186803b15801561155b57600080fd5b505afa15801561156f573d6000803e3d6000fd5b505050506040513d602081101561158557600080fd5b505190508161159b576000945050505050611380565b82546113799083906108349084611a66565b6000546001600160a01b031690565b600554600254604080516318160ddd60e01b81529051600093926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561160557600080fd5b505afa158015611619573d6000803e3d6000fd5b505050506040513d602081101561162f57600080fd5b50511061163e57506000611380565b6116488284611b01565b9392505050565b60096020908152600092835260408084209091529082529020805460019091015482565b60045481565b611681611a62565b6000546001600160a01b039081169116146116d1576040805162461bcd60e51b815260206004820181905260248201526000805160206122c5833981519152604482015290519081900360640190fd5b6002546001600160a01b038381169116141561171c576040805162461bcd60e51b8152602060048201526005602482015264217361666560d81b604482015290519081900360640190fd5b6111526001600160a01b0383163383611cd4565b60055481565b6002600154141561178e576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260015561179c82610a46565b6000600883815481106117ab57fe5b6000918252602080832086845260098252604080852033865290925292208054600590920290920192501561181c576000611808826001015461083a64e8d4a5100061083487600301548760000154611a6690919063ffffffff16565b9050801561181a5761181a3382611b43565b505b8215611909578154611839906001600160a01b0316333086611d80565b60048201548254611857916001600160a01b03918216911685611de0565b60006008858154811061186657fe5b600091825260208083206004600590930201820154604080516311f9fbc960e21b8152339481019490945260248401899052516001600160a01b03909116936347e7ef24936044808201949392918390030190829087803b1580156118ca57600080fd5b505af11580156118de573d6000803e3d6000fd5b505050506040513d60208110156118f457600080fd5b505182549091506119059082611d26565b8255505b600382015481546119249164e8d4a510009161083491611a66565b6001820155604080518481529051859133917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a35050600180555050565b611972611a62565b6000546001600160a01b039081169116146119c2576040805162461bcd60e51b815260206004820181905260248201526000805160206122c5833981519152604482015290519081900360640190fd5b6001600160a01b038116611a075760405162461bcd60e51b81526004018080602001828103825260268152602001806122586026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b600082611a7557506000611380565b82820282848281611a8257fe5b04146116485760405162461bcd60e51b81526004018080602001828103825260218152602001806122a46021913960400191505060405180910390fd5b600061164883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611ecb565b600061164883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f6d565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611b8e57600080fd5b505afa158015611ba2573d6000803e3d6000fd5b505050506040513d6020811015611bb857600080fd5b5051905080821115611c4c576002546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611c1a57600080fd5b505af1158015611c2e573d6000803e3d6000fd5b505050506040513d6020811015611c4457600080fd5b50611ccf9050565b6002546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611ca257600080fd5b505af1158015611cb6573d6000803e3d6000fd5b505050506040513d6020811015611ccc57600080fd5b50505b505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611ccf908490611fc7565b600082820183811015611648576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611dda908590611fc7565b50505050565b6000611e7682856001600160a01b031663dd62ed3e30876040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015611e4457600080fd5b505afa158015611e58573d6000803e3d6000fd5b505050506040513d6020811015611e6e57600080fd5b505190611d26565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052909150611dda908590611fc7565b60008183611f575760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f1c578181015183820152602001611f04565b50505050905090810190601f168015611f495780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611f6357fe5b0495945050505050565b60008184841115611fbf5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611f1c578181015183820152602001611f04565b505050900390565b606061201c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120789092919063ffffffff16565b805190915015611ccf5780806020019051602081101561203b57600080fd5b5051611ccf5760405162461bcd60e51b815260040180806020018281038252602a8152602001806122e5602a913960400191505060405180910390fd5b6060612087848460008561208f565b949350505050565b6060824710156120d05760405162461bcd60e51b815260040180806020018281038252602681526020018061227e6026913960400191505060405180910390fd5b6120d9856121eb565b61212a576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106121695780518252601f19909201916020918201910161214a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146121cb576040519150601f19603f3d011682016040523d82523d6000602084013e6121d0565b606091505b50915091506121e08282866121f1565b979650505050505050565b3b151590565b60608315612200575081611648565b8251156122105782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315611f1c578181015183820152602001611f0456fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220a1a946fbce89e01cb3113f45d08191373295a7f4b110e4bf0169cd26e272030564736f6c634300060c0033
Deployed Bytecode Sourcemap
45141:11627:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47610:95;;;:::i;:::-;;;;;;;;;;;;;;;;47030:26;;;;;;;;;;;;;;;;-1:-1:-1;47030:26:0;;:::i;:::-;;;;;-1:-1:-1;;;;;47030:26:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47030:26:0;;;;;;;;;;;;;;;;;;;47200:34;;;:::i;46587:63::-;;;:::i;:::-;;;;-1:-1:-1;;;;;46587:63:0;;;;;;;;;;;;;;55156:230;;;;;;;;;;;;;;;;-1:-1:-1;55156:230:0;;:::i;:::-;;53480:1668;;;;;;;;;;;;;;;;-1:-1:-1;53480:1668:0;;;;;;;:::i;46830:47::-;;;:::i;51250:1004::-;;;;;;;;;;;;;;;;-1:-1:-1;51250:1004:0;;:::i;55457:687::-;;;;;;;;;;;;;;;;-1:-1:-1;55457:687:0;;:::i;47915:652::-;;;;;;;;;;;;;;;;-1:-1:-1;47915:652:0;;;-1:-1:-1;;;;;47915:652:0;;;;;;;;;;;;;;;;;;;;;:::i;50994:180::-;;;:::i;48662:362::-;;;;;;;;;;;;;;;;-1:-1:-1;48662:362:0;;;;;;;;;;;;;;:::i;49407:900::-;;;;;;;;;;;;;;;;-1:-1:-1;49407:900:0;;;;;;-1:-1:-1;;;;;49407:900:0;;:::i;46659:71::-;;;:::i;41768:148::-;;;:::i;46984:37::-;;;:::i;50376:535::-;;;;;;;;;;;;;;;;-1:-1:-1;50376:535:0;;;;;;-1:-1:-1;;;;;50376:535:0;;:::i;41126:79::-;;;:::i;49100:245::-;;;;;;;;;;;;;;;;-1:-1:-1;49100:245:0;;;;;;;:::i;47085:64::-;;;;;;;;;;;;;;;;-1:-1:-1;47085:64:0;;;;;;-1:-1:-1;;;;;47085:64:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;46739:35;;;:::i;56553:212::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;56553:212:0;;;;;;;;:::i;46783:40::-;;;:::i;52349:1079::-;;;;;;;;;;;;;;;;-1:-1:-1;52349:1079:0;;;;;;;:::i;42071:281::-;;;;;;;;;;;;;;;;-1:-1:-1;42071:281:0;-1:-1:-1;;;;;42071:281:0;;:::i;47610:95::-;47682:8;:15;47610:95;:::o;47030:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47030:26:0;;;;-1:-1:-1;47030:26:0;;;;;;;;:::o;47200:34::-;;;;:::o;46587:63::-;;;-1:-1:-1;;;;;46587:63:0;;:::o;55156:230::-;41348:12;:10;:12::i;:::-;41338:6;;-1:-1:-1;;;;;41338:6:0;;;:22;;;41330:67;;;;;-1:-1:-1;;;41330:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;41330:67:0;;;;;;;;;;;;;;;46959:18:::1;55239:13;:32;;55231:76;;;::::0;;-1:-1:-1;;;55231:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;55320:17;:15;:17::i;:::-;55350:12;:28:::0;55156:230::o;53480:1668::-;43353:1;43958:7;;:19;;43950:63;;;;;-1:-1:-1;;;43950:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43353:1;44091:7;:18;53561:16:::1;53572:4:::0;53561:10:::1;:16::i;:::-;53590:21;53614:8;53623:4;53614:14;;;;;;;;;::::0;;;::::1;::::0;;;53663;;;:8:::1;:14:::0;;;;;;53678:10:::1;53663:26:::0;;;;;;;;53751:8:::1;:14:::0;;53614::::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;53663:26:0;53614:14;53672:4;;53751:14;::::1;;;;;;;;;;;;;;;:20;;;;;;;;;;-1:-1:-1::0;;;;;53751:20:0::1;-1:-1:-1::0;;;;;53741:47:0::1;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;53741:49:0;53833:8:::1;:14:::0;;53741:49;;-1:-1:-1;53801:19:0::1;::::0;53842:4;;53833:14;::::1;;;;;;;;;;;;;;;:20;;;;;;;;;;-1:-1:-1::0;;;;;53833:20:0::1;-1:-1:-1::0;;;;;53823:43:0::1;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;53823:45:0;53889:11;;53823:45;;-1:-1:-1;53881:44:0::1;;;::::0;;-1:-1:-1;;;53881:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;53881:44:0;;;;;;;;;;;;;::::1;;53958:1;53944:11;:15;53936:44;;;::::0;;-1:-1:-1;;;53936:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;53936:44:0;;;;;;;;;;;;;::::1;;54026:15;54057:99;54126:4;:15;;;54057:46;54098:4;54057:36;54073:4;:19;;;54057:4;:11;;;:15;;:36;;;;:::i;:::-;:40:::0;::::1;:46::i;:::-;:50:::0;::::1;:99::i;:::-;54026:130:::0;-1:-1:-1;54171:11:0;;54167:80:::1;;54199:36;54215:10;54227:7;54199:15;:36::i;:::-;54309:11:::0;;54292:14:::1;::::0;54309:49:::1;::::0;54346:11;;54309:32:::1;::::0;54325:15;54309::::1;:32::i;:49::-;54292:66;;54384:6;54373:8;:17;54369:67;;;54418:6;54407:17;;54369:67;54450:12:::0;;54446:568:::1;;54479:21;54530:8;54539:4;54530:14;;;;;;;;;::::0;;;::::1;::::0;;;:20:::1;:14;::::0;;::::1;;:20:::0;::::1;::::0;54520:62:::1;::::0;;-1:-1:-1;;;54520:62:0;;54561:10:::1;54520:62:::0;;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;54530:20:0;;::::1;::::0;54520:40:::1;::::0;:62;;;;;54530:14;54520:62;;;;;;;;;54530:20;54520:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;54520:62:0;54619:11;;54520:62;;-1:-1:-1;54603:27:0;::::1;54599:168;;;54665:1;54651:15:::0;;54599:168:::1;;;54721:11:::0;;:30:::1;::::0;54737:13;54721:15:::1;:30::i;:::-;54707:44:::0;;54599:168:::1;54808:9:::0;;54801:42:::1;::::0;;-1:-1:-1;;;54801:42:0;;54837:4:::1;54801:42;::::0;::::1;::::0;;;54783:15:::1;::::0;-1:-1:-1;;;;;54808:9:0::1;::::0;54801:27:::1;::::0;:42;;;;;::::1;::::0;;;;;;;;54808:9;54801:42;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;54801:42:0;;-1:-1:-1;54862:18:0;;::::1;54858:77;;;54912:7;54901:18;;54858:77;54949:9:::0;;:53:::1;::::0;-1:-1:-1;;;;;54949:9:0::1;54980:10;54993:8:::0;54949:22:::1;:53::i;:::-;54446:568;;;55058:19;::::0;::::1;::::0;55042:11;;:46:::1;::::0;55083:4:::1;::::0;55042:36:::1;::::0;:15:::1;:36::i;:46::-;55024:15;::::0;::::1;:64:::0;55104:36:::1;::::0;;;;;;;55125:4;;55113:10:::1;::::0;55104:36:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;43309:1:0;44270:22;;-1:-1:-1;;;;;;53480:1668:0:o;46830:47::-;;;;:::o;51250:1004::-;51302:21;51326:8;51335:4;51326:14;;;;;;;;;;;;;;;;;;51302:38;;51374:4;:19;;;51355:15;:38;51351:77;;51410:7;;;51351:77;51438:19;51470:4;:10;;;;;;;;;;-1:-1:-1;;;;;51470:10:0;-1:-1:-1;;;;;51460:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51460:35:0;;-1:-1:-1;51510:16:0;51506:107;;-1:-1:-1;51565:15:0;51543:19;;;;:37;51595:7;;51506:107;51623:18;51644:51;51658:4;:19;;;51679:15;51644:13;:51::i;:::-;51623:72;;51724:1;51710:10;:15;51706:54;;51742:7;;;;;51706:54;51770:17;51803:102;51875:15;;51803:49;51836:4;:15;;;51803:28;51818:12;;51803:10;:14;;:28;;;;:::i;:::-;:32;;:49::i;:102::-;51927:3;;51770:135;;-1:-1:-1;;;;;;51927:3:0;51918:18;51951:7;:5;:7::i;:::-;51973:39;52007:4;51973:29;51987:14;;51973:9;:13;;:29;;;;:::i;:39::-;51918:105;;;;;;;;;;;;;-1:-1:-1;;;;;51918:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52043:3:0;;52034:44;;;-1:-1:-1;;;52034:44:0;;52061:4;52034:44;;;;;;;;;;;;-1:-1:-1;;;;;52043:3:0;;;;-1:-1:-1;52034:18:0;;-1:-1:-1;52034:44:0;;;;;52043:3;;52034:44;;;;;;;;52043:3;;52034:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52113:85;52151:36;52175:11;52151:19;52165:4;52151:9;:13;;:19;;;;:::i;:36::-;52113:19;;;;;:23;:85::i;:::-;52091:19;;;:107;-1:-1:-1;;52231:15:0;52209:19;;;;:37;;;;-1:-1:-1;51250:1004:0;;:::o;55457:687::-;43353:1;43958:7;;:19;;43950:63;;;;;-1:-1:-1;;;43950:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43353:1;44091:7;:18;;;;55529:21:::1;55553:8;55562:4;55553:14;;;;;;;;;::::0;;;::::1;::::0;;;55602;;;:8:::1;:14:::0;;;;;;55617:10:::1;55602:26:::0;;;;;;;;55690:8:::1;:14:::0;;55553::::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;55602:26:0;55553:14;55611:4;;55690:14;::::1;;;;;;;;;;;;;;;:20;;;;;;;;;;-1:-1:-1::0;;;;;55690:20:0::1;-1:-1:-1::0;;;;;55680:47:0::1;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;55680:49:0;55772:8:::1;:14:::0;;55680:49;;-1:-1:-1;55740:19:0::1;::::0;55781:4;;55772:14;::::1;;;;;;;;;;;;;;;:20;;;;;;;;;;-1:-1:-1::0;;;;;55772:20:0::1;-1:-1:-1::0;;;;;55762:43:0::1;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;55762:45:0;55835:11;;55762:45;;-1:-1:-1;55818:14:0::1;::::0;55835:49:::1;::::0;55762:45;;55835:32:::1;::::0;55851:15;55835::::1;:32::i;:49::-;55818:66;;55907:8;55916:4;55907:14;;;;;;;;;::::0;;;::::1;::::0;;;:20:::1;:14;::::0;;::::1;;:20:::0;::::1;::::0;55897:60:::1;::::0;;-1:-1:-1;;;55897:60:0;;55938:10:::1;55897:60:::0;;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;55907:20:0;;::::1;::::0;55897:40:::1;::::0;:60;;;;;55907:14;55897:60;;;;;;;;;55907:20;55897:60;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;55970:9:0;;:51:::1;::::0;-1:-1:-1;;;;;55970:9:0::1;56001:10;56014:6:::0;55970:22:::1;:51::i;:::-;56037:43;::::0;;;;;;;56067:4;;56055:10:::1;::::0;56037:43:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;56105:1:0::1;56091:15:::0;;;56117::::1;::::0;;::::1;:19:::0;-1:-1:-1;44270:22:0;;-1:-1:-1;;55457:687:0:o;47915:652::-;41348:12;:10;:12::i;:::-;41338:6;;-1:-1:-1;;;;;41338:6:0;;;:22;;;41330:67;;;;;-1:-1:-1;;;41330:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;41330:67:0;;;;;;;;;;;;;;;48072:11:::1;48068:61;;;48100:17;:15;:17::i;:::-;48139:22;48195:9;;48177:15;:27;:57;;48225:9;;48177:57;;;48207:15;48177:57;48263:15;::::0;48139:95;;-1:-1:-1;48263:32:0::1;::::0;48283:11;48263:19:::1;:32::i;:::-;48245:15;:50:::0;48334:214:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;48334:214:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;48334:214:0;;;;;;;;::::1;::::0;;;;;;48306:8:::1;:253:::0;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;48306:253:0;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;-1:-1:-1;47915:652:0:o;50994:180::-;51056:8;:15;51039:14;51082:85;51110:6;51104:3;:12;51082:85;;;51140:15;51151:3;51140:10;:15::i;:::-;51118:5;;51082:85;;;;50994:180;:::o;48662:362::-;41348:12;:10;:12::i;:::-;41338:6;;-1:-1:-1;;;;;41338:6:0;;;:22;;;41330:67;;;;;-1:-1:-1;;;41330:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;41330:67:0;;;;;;;;;;;;;;;48794:11:::1;48790:61;;;48822:17;:15;:17::i;:::-;48879:87;48944:11;48879:46;48899:8;48908:4;48899:14;;;;;;;;;;;;;;;;;;:25;;;48879:15;;:19;;:46;;;;:::i;:::-;:50:::0;::::1;:87::i;:::-;48861:15;:105;;;;49005:11;48977:8;48986:4;48977:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;48662:362:::0;;;:::o;49407:900::-;49506:7;49531:21;49555:8;49564:4;49555:14;;;;;;;;;;;;;;;;49604;;;:8;:14;;;;;;-1:-1:-1;;;;;49604:21:0;;;;;;;;;;;49555:14;;;;;;;;49661:19;;;;49723:10;;;;;49713:35;;-1:-1:-1;;;49713:35:0;;;;49555:14;;-1:-1:-1;49604:21:0;;49661:19;;49555:14;;49723:10;;;;;49713:33;;:35;;;;;;;;;;;49723:10;49713:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49713:35:0;49781:19;;;;49713:35;;-1:-1:-1;49763:15:0;:37;:57;;;;-1:-1:-1;49804:16:0;;;49763:57;49759:461;;;49837:18;49875:51;49889:4;:19;;;49910:15;49875:13;:51::i;:::-;49837:89;;49941:17;49978:110;50054:15;;49978:49;50011:4;:15;;;49978:28;49993:12;;49978:10;:14;;:28;;;;:::i;:110::-;49941:147;-1:-1:-1;50120:88:0;50157:36;50181:11;50157:19;49941:147;50171:4;50157:13;:19::i;:36::-;50120:14;;:18;:88::i;:::-;50103:105;;49759:461;;;50237:62;50283:4;:15;;;50237:41;50273:4;50237:31;50253:14;50237:4;:11;;;:15;;:31;;;;:::i;:62::-;50230:69;;;;;;49407:900;;;;;:::o;46659:71::-;;;-1:-1:-1;;;;;46659:71:0;;:::o;41768:148::-;41348:12;:10;:12::i;:::-;41338:6;;-1:-1:-1;;;;;41338:6:0;;;:22;;;41330:67;;;;;-1:-1:-1;;;41330:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;41330:67:0;;;;;;;;;;;;;;;41875:1:::1;41859:6:::0;;41838:40:::1;::::0;-1:-1:-1;;;;;41859:6:0;;::::1;::::0;41838:40:::1;::::0;41875:1;;41838:40:::1;41906:1;41889:19:::0;;-1:-1:-1;;;;;;41889:19:0::1;::::0;;41768:148::o;46984:37::-;;;;:::o;50376:535::-;50481:7;50506:21;50530:8;50539:4;50530:14;;;;;;;;;;;;;;;;50579;;;:8;:14;;;;;;-1:-1:-1;;;;;50579:21:0;;;;;;;;;;;50645:10;50530:14;;;;;;;50645:10;;;;50635:35;;-1:-1:-1;;;50635:35:0;;;;50530:14;;-1:-1:-1;50579:21:0;;50530:14;50645:10;;;;;50635:33;;:35;;;;50530:14;;50635:35;;;;;;50645:10;50635:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50635:35:0;50730:8;:14;;50635:35;;-1:-1:-1;50681:23:0;;50739:4;;50730:14;;;;;;;;;;;;;;;;:20;;;;;;;;;;-1:-1:-1;;;;;50730:20:0;-1:-1:-1;;;;;50720:47:0;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50720:49:0;;-1:-1:-1;50784:16:0;50780:57;;50824:1;50817:8;;;;;;;;50780:57;50854:11;;:49;;50891:11;;50854:32;;50870:15;50854;:32::i;41126:79::-;41164:7;41191:6;-1:-1:-1;;;;;41191:6:0;41126:79;:::o;49100:245::-;49257:12;;49235:3;;49228:25;;;-1:-1:-1;;;49228:25:0;;;;49199:7;;49257:12;-1:-1:-1;;;;;49235:3:0;;49228:23;;:25;;;;;;;;;;;;;;49235:3;49228:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49228:25:0;:41;49224:82;;-1:-1:-1;49293:1:0;49286:8;;49224:82;49323:14;:3;49331:5;49323:7;:14::i;:::-;49316:21;49100:245;-1:-1:-1;;;49100:245:0:o;47085:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46739:35::-;;;;:::o;56553:212::-;41348:12;:10;:12::i;:::-;41338:6;;-1:-1:-1;;;;;41338:6:0;;;:22;;;41330:67;;;;;-1:-1:-1;;;41330:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;41330:67:0;;;;;;;;;;;;;;;56685:3:::1;::::0;-1:-1:-1;;;;;56675:13:0;;::::1;56685:3:::0;::::1;56675:13;;56667:31;;;::::0;;-1:-1:-1;;;56667:31:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;56667:31:0;;;;;;;;;;;;;::::1;;56709:48;-1:-1:-1::0;;;;;56709:27:0;::::1;56737:10;56749:7:::0;56709:27:::1;:48::i;46783:40::-:0;;;;:::o;52349:1079::-;43353:1;43958:7;;:19;;43950:63;;;;;-1:-1:-1;;;43950:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43353:1;44091:7;:18;52429:16:::1;52440:4:::0;52429:10:::1;:16::i;:::-;52456:21;52480:8;52489:4;52480:14;;;;;;;;;::::0;;;::::1;::::0;;;52529;;;:8:::1;:14:::0;;;;;;52544:10:::1;52529:26:::0;;;;;;;52572:11;;52480:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;52572:15:0;52568:292:::1;;52604:15;52639:107;52712:4;:15;;;52639:46;52680:4;52639:36;52655:4;:19;;;52639:4;:11;;;:15;;:36;;;;:::i;:107::-;52604:142:::0;-1:-1:-1;52765:11:0;;52761:88:::1;;52797:36;52813:10;52825:7;52797:15;:36::i;:::-;52568:292;;52874:12:::0;;52870:425:::1;;52903:9:::0;;:138:::1;::::0;-1:-1:-1;;;;;52903:9:0::1;52956:10;52994:4;53018:8:::0;52903:26:::1;:138::i;:::-;53090:10;::::0;::::1;::::0;53058:9;;:53:::1;::::0;-1:-1:-1;;;;;53058:9:0;;::::1;::::0;53090:10:::1;53102:8:::0;53058:31:::1;:53::i;:::-;53126:19;53175:8;53184:4;53175:14;;;;;;;;;::::0;;;::::1;::::0;;;:20:::1;:14;::::0;;::::1;;:20:::0;::::1;::::0;53165:61:::1;::::0;;-1:-1:-1;;;53165:61:0;;53205:10:::1;53165:61:::0;;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;53175:20:0;;::::1;::::0;53165:39:::1;::::0;:61;;;;;53175:14;53165:61;;;;;;;;;53175:20;53165:61;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;53165:61:0;53255:11;;53165:61;;-1:-1:-1;53255:28:0::1;::::0;53165:61;53255:15:::1;:28::i;:::-;53241:42:::0;;-1:-1:-1;52870:425:0::1;53339:19;::::0;::::1;::::0;53323:11;;:46:::1;::::0;53364:4:::1;::::0;53323:36:::1;::::0;:15:::1;:36::i;:46::-;53305:15;::::0;::::1;:64:::0;53385:35:::1;::::0;;;;;;;53405:4;;53393:10:::1;::::0;53385:35:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;43309:1:0;44270:22;;-1:-1:-1;;52349:1079:0:o;42071:281::-;41348:12;:10;:12::i;:::-;41338:6;;-1:-1:-1;;;;;41338:6:0;;;:22;;;41330:67;;;;;-1:-1:-1;;;41330:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;41330:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42174:22:0;::::1;42152:110;;;;-1:-1:-1::0;;;42152:110:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42299:6;::::0;;42278:38:::1;::::0;-1:-1:-1;;;;;42278:38:0;;::::1;::::0;42299:6;::::1;::::0;42278:38:::1;::::0;::::1;42327:6;:17:::0;;-1:-1:-1;;;;;;42327:17:0::1;-1:-1:-1::0;;;;;42327:17:0;;;::::1;::::0;;;::::1;::::0;;42071:281::o;208:106::-;296:10;208:106;:::o;2213:471::-;2271:7;2516:6;2512:47;;-1:-1:-1;2546:1:0;2539:8;;2512:47;2583:5;;;2587:1;2583;:5;:1;2607:5;;;;;:10;2599:56;;;;-1:-1:-1;;;2599:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3160:132;3218:7;3245:39;3249:1;3252;3245:39;;;;;;;;;;;;;;;;;:3;:39::i;1289:136::-;1347:7;1374:43;1378:1;1381;1374:43;;;;;;;;;;;;;;;;;:3;:43::i;56250:295::-;56349:3;;56342:36;;;-1:-1:-1;;;56342:36:0;;56372:4;56342:36;;;;;;56325:14;;-1:-1:-1;;;;;56349:3:0;;56342:21;;:36;;;;;;;;;;;;;;56349:3;56342:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56342:36:0;;-1:-1:-1;56393:16:0;;;56389:149;;;56433:3;;56426:33;;;-1:-1:-1;;;56426:33:0;;-1:-1:-1;;;;;56426:33:0;;;;;;;;;;;;;;;56433:3;;;;;56426:20;;:33;;;;;;;;;;;;;;56433:3;;56426:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56389:149:0;;-1:-1:-1;56389:149:0;;56499:3;;56492:34;;;-1:-1:-1;;;56492:34:0;;-1:-1:-1;;;;;56492:34:0;;;;;;;;;;;;;;;56499:3;;;;;56492:20;;:34;;;;;;;;;;;;;;56499:3;;56492:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56389:149:0;56250:295;;;:::o;27259:248::-;27430:58;;;-1:-1:-1;;;;;27430:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27430:58:0;-1:-1:-1;;;27430:58:0;;;27376:123;;27410:5;;27376:19;:123::i;825:181::-;883:7;915:5;;;939:6;;;;931:46;;;;;-1:-1:-1;;;931:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;27515:285;27713:68;;;-1:-1:-1;;;;;27713:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27713:68:0;-1:-1:-1;;;27713:68:0;;;27659:133;;27693:5;;27659:19;:133::i;:::-;27515:285;;;;:::o;28784:436::-;28915:20;28951:50;28995:5;28951;-1:-1:-1;;;;;28951:15:0;;28975:4;28982:7;28951:39;;;;;;;;;;;;;-1:-1:-1;;;;;28951:39:0;;;;;;-1:-1:-1;;;;;28951:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28951:39:0;;:43;:50::i;:::-;29066:135;;;-1:-1:-1;;;;;29066:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29066:135:0;-1:-1:-1;;;29066:135:0;;;28915:86;;-1:-1:-1;29012:200:0;;29046:5;;29012:19;:200::i;3788:312::-;3908:7;3943:12;3936:5;3928:28;;;;-1:-1:-1;;;3928:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3967:9;3983:1;3979;:5;;;;;;;3788:312;-1:-1:-1;;;;;3788:312:0:o;1728:226::-;1848:7;1884:12;1876:6;;;;1868:29;;;;-1:-1:-1;;;1868:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1920:5:0;;;1728:226::o;30149:885::-;30573:23;30612:118;30658:4;30612:118;;;;;;;;;;;;;;;;;30620:5;-1:-1:-1;;;;;30612:27:0;;;:118;;;;;:::i;:::-;30745:17;;30573:157;;-1:-1:-1;30745:21:0;30741:286;;30918:10;30907:30;;;;;;;;;;;;;;;-1:-1:-1;30907:30:0;30881:134;;;;-1:-1:-1;;;30881:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22255:229;22392:12;22424:52;22446:6;22454:4;22460:1;22463:12;22424:21;:52::i;:::-;22417:59;22255:229;-1:-1:-1;;;;22255:229:0:o;23471:621::-;23641:12;23713:5;23688:21;:30;;23666:118;;;;-1:-1:-1;;;23666:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23803:18;23814:6;23803:10;:18::i;:::-;23795:60;;;;;-1:-1:-1;;;23795:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23929:12;23943:23;23983:6;-1:-1:-1;;;;;23983:11:0;24002:5;24009:4;23983:31;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23983:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23928:86;;;;24032:52;24050:7;24059:10;24071:12;24032:17;:52::i;:::-;24025:59;23471:621;-1:-1:-1;;;;;;;23471:621:0:o;19218:444::-;19598:20;19646:8;;;19218:444::o;26383:777::-;26533:12;26562:7;26558:595;;;-1:-1:-1;26593:10:0;26586:17;;26558:595;26707:17;;:21;26703:439;;26970:10;26964:17;27031:15;27018:10;27014:2;27010:19;27003:44;26918:148;27106:20;;-1:-1:-1;;;27106:20:0;;;;;;;;;;;;;;;;;27113:12;;27106:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://a1a946fbce89e01cb3113f45d08191373295a7f4b110e4bf0169cd26e2720305
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 24 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
FTM | 100.00% | $0.000451 | 309,423.3625 | $139.44 |
[ 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.