Source Code
Latest 25 from a total of 246 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Migrate | 24410331 | 18 days ago | IN | 0 ETH | 0.00000405 | ||||
| Set Migrator | 24410328 | 18 days ago | IN | 0 ETH | 0.00000153 | ||||
| Set Migrator | 24410300 | 18 days ago | IN | 0 ETH | 0.00000166 | ||||
| Migrate | 24410291 | 18 days ago | IN | 0 ETH | 0.0000049 | ||||
| Set Migrator | 24410279 | 18 days ago | IN | 0 ETH | 0.00000138 | ||||
| Migrate | 24410257 | 18 days ago | IN | 0 ETH | 0.00000467 | ||||
| Set Migrator | 24410254 | 18 days ago | IN | 0 ETH | 0.0000013 | ||||
| Migrate | 24410217 | 18 days ago | IN | 0 ETH | 0.00001106 | ||||
| Set Migrator | 24410215 | 18 days ago | IN | 0 ETH | 0.00000412 | ||||
| Set Fee Address | 24410169 | 18 days ago | IN | 0 ETH | 0.00000335 | ||||
| Set Migrator | 24410166 | 18 days ago | IN | 0 ETH | 0.00000407 | ||||
| Set Migrator | 24410144 | 18 days ago | IN | 0 ETH | 0.00000406 | ||||
| Set Migrator | 24410120 | 18 days ago | IN | 0 ETH | 0.00000428 | ||||
| Migrate | 24410109 | 18 days ago | IN | 0 ETH | 0.00010874 | ||||
| Set Migrator | 24410084 | 18 days ago | IN | 0 ETH | 0.00000373 | ||||
| Migrate | 24410078 | 18 days ago | IN | 0 ETH | 0.00010863 | ||||
| Set Migrator | 24410068 | 18 days ago | IN | 0 ETH | 0.00003029 | ||||
| Emergency Withdr... | 24410042 | 18 days ago | IN | 0 ETH | 0.00000611 | ||||
| Migrate | 24410022 | 18 days ago | IN | 0 ETH | 0.0000826 | ||||
| Set Migrator | 24410018 | 18 days ago | IN | 0 ETH | 0.00000428 | ||||
| Set Migrator | 24409992 | 18 days ago | IN | 0 ETH | 0.00000456 | ||||
| Emergency Withdr... | 24409983 | 18 days ago | IN | 0 ETH | 0.000007 | ||||
| Migrate | 24409975 | 18 days ago | IN | 0 ETH | 0.00004472 | ||||
| Emergency Withdr... | 24409957 | 18 days ago | IN | 0 ETH | 0.00004635 | ||||
| Migrate | 24409948 | 18 days ago | IN | 0 ETH | 0.00001434 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MasterChef
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-01-07
*/
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
/**
* @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) {
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, reverting 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) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* 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);
return a - b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* 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);
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* 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;
}
}
pragma solidity >=0.6.4;
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the token decimals.
*/
function decimals() external view returns (uint8);
/**
* @dev Returns the token symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the token name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the bep token owner.
*/
function getOwner() external view returns (address);
/**
* @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);
}
// File: contracts\libs\Address.sol
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies 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.4._
*/
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.4._
*/
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);
}
}
}
}
// File: contracts\libs\SafeERC20.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: contracts\libs\Context.sol
pragma solidity >=0.6.0 <0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: contracts\libs\Ownable.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
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 virtual 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;
}
}
// File: contracts\libs\ERC20.sol
pragma solidity >=0.4.0;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-ERC20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, Ownable {
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 bep token owner.
*/
function getOwner() external override view returns (address) {
return owner();
}
/**
* @dev Returns the name of the token.
*/
function name() public override view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public override view returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
*/
function decimals() public override view returns (uint8) {
return _decimals;
}
/**
* @dev See {ERC20-totalSupply}.
*/
function totalSupply() public override view returns (uint256) {
return _totalSupply;
}
/**
* @dev See {ERC20-balanceOf}.
*/
function balanceOf(address account) public override view returns (uint256) {
return _balances[account];
}
/**
* @dev See {ERC20-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 override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {ERC20-allowance}.
*/
function allowance(address owner, address spender) public override view returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {ERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {ERC20-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 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 {ERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
_approve(_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 {ERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, 'ERC20: decreased allowance below zero'));
return true;
}
/**
* @dev Creates `amount` tokens and assigns them to `msg.sender`, increasing
* the total supply.
*
* Requirements
*
* - `msg.sender` must be the token owner
*/
function mint(uint256 amount) public onlyOwner returns (bool) {
_mint(_msgSender(), amount);
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer (address sender, address recipient, uint256 amount) internal {
require(sender != address(0), 'ERC20: transfer from the zero address');
require(recipient != address(0), 'ERC20: transfer to the zero address');
_balances[sender] = _balances[sender].sub(amount, '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 {
require(account != address(0), 'ERC20: mint to the zero address');
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev 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 {
require(account != address(0), 'ERC20: burn from the zero address');
_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 is internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve (address owner, address spender, uint256 amount) internal {
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 Destroys `amount` tokens from `account`.`amount` is then deducted
* from the caller's allowance.
*
* See {_burn} and {_approve}.
*/
function _burnFrom(address account, uint256 amount) internal {
_burn(account, amount);
_approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, 'ERC20: burn amount exceeds allowance'));
}
}
interface IMigratorChef {
// Perform LP token migration from legacy PancakeSwap to CakeSwap.
// Take the current LP token address and return the new LP token address.
// Migrator should have full access to the caller's LP token.
// Return the new LP token address.
//
// XXX Migrator must have allowance access to PancakeSwap LP tokens.
// CakeSwap must mint EXACTLY the same amount of CakeSwap LP tokens or
// else something bad will happen. Traditional PancakeSwap does not
// do that so be careful!
function migrate(IERC20 token) external returns (IERC20);
}
// File: contracts\MasterChef.sol
pragma solidity 0.6.12;
// MasterChef is the master of Ssgt. He can make Ssgt and he is a fair guy.
//
// Note that it's ownable and the owner wields tremendous power. The ownership
// will be transferred to a governance smart contract once SSGT is sufficiently
// distributed and the community can show to govern itself.
//
// Have fun reading it. Hopefully it's bug-free. God bless.
contract MasterChef is Ownable {
using SafeMath for uint256;
using SafeERC20 for IERC20;
// Info of each user.
struct UserInfo {
uint256 amount; // 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 SSGTs
// entitled to a user but is pending to be distributed is:
//
// pending reward = (user.amount * pool.accSsgtPerShare) - user.rewardDebt
//
// Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens:
// 1. The pool's `accSsgtPerShare` (and `lastRewardBlock`) 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.
}
// Info of each pool.
struct PoolInfo {
IERC20 lpToken; // Address of LP token contract.
uint256 allocPoint; // How many allocation points assigned to this pool. SSGTs to distribute per block.
uint256 lastRewardBlock; // Last block number that SSGTs distribution occurs.
uint256 accSsgtPerShare; // Accumulated SSGTs per share, times 1e12. See below.
uint16 depositFeeBP; // Deposit fee in basis points
}
// The SSGT TOKEN!
IERC20 public ssgt;
// SSGT tokens created per block.
uint256 public ssgtPerBlock;
// Bonus muliplier for early ssgt makers.
uint256 public constant BONUS_MULTIPLIER = 1;
// Deposit Fee address
address public feeAddress;
// The migrator contract. It has a lot of power. Can only be set through governance (owner).
IMigratorChef public migrator;
// Info of each pool.
PoolInfo[] public poolInfo;
// Info of each user that stakes LP tokens.
mapping (uint256 => mapping (address => UserInfo)) public userInfo;
// Total allocation points. Must be the sum of all allocation points in all pools.
uint256 public totalAllocPoint = 0;
// The block number when SSGT mining starts.
uint256 public startBlock;
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);
constructor(
IERC20 _ssgt,
address _feeAddress,
uint256 _ssgtPerBlock,
uint256 _startBlock
) public {
ssgt = _ssgt;
feeAddress = _feeAddress;
ssgtPerBlock = _ssgtPerBlock;
startBlock = _startBlock;
}
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.
function add(uint256 _allocPoint, IERC20 _lpToken, uint16 _depositFeeBP, bool _withUpdate) public onlyOwner {
require(_depositFeeBP <= 10000, "add: invalid deposit fee basis points");
if (_withUpdate) {
massUpdatePools();
}
uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
totalAllocPoint = totalAllocPoint.add(_allocPoint);
poolInfo.push(PoolInfo({
lpToken: _lpToken,
allocPoint: _allocPoint,
lastRewardBlock: lastRewardBlock,
accSsgtPerShare: 0,
depositFeeBP: _depositFeeBP
}));
}
// Update the given pool's SSGT allocation point and deposit fee. Can only be called by the owner.
function set(uint256 _pid, uint256 _allocPoint, uint16 _depositFeeBP, bool _withUpdate) public onlyOwner {
require(_depositFeeBP <= 10000, "set: invalid deposit fee basis points");
if (_withUpdate) {
massUpdatePools();
}
totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
poolInfo[_pid].allocPoint = _allocPoint;
poolInfo[_pid].depositFeeBP = _depositFeeBP;
}
// Set the migrator contract. Can only be called by the owner.
function setMigrator(IMigratorChef _migrator) public onlyOwner {
migrator = _migrator;
}
// Migrate lp token to another lp contract. Can be called by anyone. We trust that migrator contract is good.
function migrate(uint256 _pid) public {
require(address(migrator) != address(0), "migrate: no migrator");
PoolInfo storage pool = poolInfo[_pid];
IERC20 lpToken = pool.lpToken;
uint256 bal = lpToken.balanceOf(address(this));
lpToken.safeApprove(address(migrator), bal);
IERC20 newLpToken = migrator.migrate(lpToken);
require(bal == newLpToken.balanceOf(address(this)), "migrate: bad");
pool.lpToken = newLpToken;
}
// Return reward multiplier over the given _from to _to block.
function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) {
return _to.sub(_from).mul(BONUS_MULTIPLIER);
}
// View function to see pending SSGTs on frontend.
function pendingSsgt(uint256 _pid, address _user) external view returns (uint256) {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_user];
uint256 accSsgtPerShare = pool.accSsgtPerShare;
uint256 lpSupply = pool.lpToken.balanceOf(address(this));
if (block.number > pool.lastRewardBlock && lpSupply != 0) {
uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
uint256 ssgtReward = multiplier.mul(ssgtPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
accSsgtPerShare = accSsgtPerShare.add(ssgtReward.mul(1e12).div(lpSupply));
}
return user.amount.mul(accSsgtPerShare).div(1e12).sub(user.rewardDebt);
}
// 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.number <= pool.lastRewardBlock) {
return;
}
uint256 lpSupply = pool.lpToken.balanceOf(address(this));
if (lpSupply == 0 || pool.allocPoint == 0) {
pool.lastRewardBlock = block.number;
return;
}
uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
uint256 ssgtReward = multiplier.mul(ssgtPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
pool.accSsgtPerShare = pool.accSsgtPerShare.add(ssgtReward.mul(1e12).div(lpSupply));
pool.lastRewardBlock = block.number;
}
// Deposit LP tokens to MasterChef for SSGT allocation.
function deposit(uint256 _pid, uint256 _amount) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
updatePool(_pid);
if (user.amount > 0) {
uint256 pending = user.amount.mul(pool.accSsgtPerShare).div(1e12).sub(user.rewardDebt);
if(pending > 0) {
safeSsgtTransfer(msg.sender, pending);
}
}
if(_amount > 0) {
pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
if(pool.depositFeeBP > 0){
uint256 depositFee = _amount.mul(pool.depositFeeBP).div(10000);
pool.lpToken.safeTransfer(feeAddress, depositFee);
user.amount = user.amount.add(_amount).sub(depositFee);
}else{
user.amount = user.amount.add(_amount);
}
}
user.rewardDebt = user.amount.mul(pool.accSsgtPerShare).div(1e12);
emit Deposit(msg.sender, _pid, _amount);
}
// Withdraw LP tokens from MasterChef.
function withdraw(uint256 _pid, uint256 _amount) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
require(user.amount >= _amount, "withdraw: not good");
updatePool(_pid);
uint256 pending = user.amount.mul(pool.accSsgtPerShare).div(1e12).sub(user.rewardDebt);
if(pending > 0) {
safeSsgtTransfer(msg.sender, pending);
}
if(_amount > 0) {
user.amount = user.amount.sub(_amount);
pool.lpToken.safeTransfer(address(msg.sender), _amount);
}
user.rewardDebt = user.amount.mul(pool.accSsgtPerShare).div(1e12);
emit Withdraw(msg.sender, _pid, _amount);
}
// Withdraw without caring about rewards. EMERGENCY ONLY.
function emergencyWithdraw(uint256 _pid) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
uint256 amount = user.amount;
user.amount = 0;
user.rewardDebt = 0;
pool.lpToken.safeTransfer(address(msg.sender), amount);
emit EmergencyWithdraw(msg.sender, _pid, amount);
}
// Safe ssgt transfer function, just in case if rounding error causes pool to not have enough SSGTs.
function safeSsgtTransfer(address _to, uint256 _amount) internal {
uint256 ssgtBal = ssgt.balanceOf(address(this));
if (_amount > ssgtBal) {
ssgt.transfer(_to, ssgtBal);
} else {
ssgt.transfer(_to, _amount);
}
}
function setFeeAddress(address _feeAddress) public{
require(msg.sender == feeAddress, "setFeeAddress: FORBIDDEN");
feeAddress = _feeAddress;
}
//Pancake has to add hidden dummy pools inorder to alter the emission, here we make it simple and transparent to all.
function updateEmissionRate(uint256 _ssgtPerBlock) public onlyOwner {
massUpdatePools();
ssgtPerBlock = _ssgtPerBlock;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IERC20","name":"_ssgt","type":"address"},{"internalType":"address","name":"_feeAddress","type":"address"},{"internalType":"uint256","name":"_ssgtPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"contract IMigratorChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingSsgt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accSsgtPerShare","type":"uint256"},{"internalType":"uint16","name":"depositFeeBP","type":"uint16"}],"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":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMigratorChef","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ssgt","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ssgtPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","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":"_ssgtPerBlock","type":"uint256"}],"name":"updateEmissionRate","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":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405260006007553480156200001657600080fd5b506040516200307438038062003074833981810160405260808110156200003c57600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919050505060006200007d620001b560201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35083600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816002819055508060088190555050505050620001bd565b600033905090565b612ea780620001cd6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80637cd07e47116100de5780638dbb1e3a11610097578063d963842211610071578063d96384221461061a578063e2885c2c1461066c578063e2bbb158146106ce578063f2fde38b146107065761018e565b80638dbb1e3a1461053157806393f1a40b1461057d578063c80c563b146105e65761018e565b80637cd07e47146103e157806380aeb2b61461041557806384e82a33146104335780638705fcd41461049b5780638aa28550146104df5780638da5cb5b146104fd5761018e565b8063441a3e701161014b57806351eb05a61161012557806351eb05a6146103715780635312ea8e1461039f578063630b5ba1146103cd578063715018a6146103d75761018e565b8063441a3e70146102ed578063454b06081461032557806348cd4cb1146103535761018e565b8063081e3eda146101935780630ba84cd2146101b15780631526fe27146101df57806317caf6f11461025757806323cf31181461027557806341275358146102b9575b600080fd5b61019b61074a565b6040518082815260200191505060405180910390f35b6101dd600480360360208110156101c757600080fd5b8101908080359060200190929190505050610757565b005b61020b600480360360208110156101f557600080fd5b8101908080359060200190929190505050610818565b604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018261ffff1681526020019550505050505060405180910390f35b61025f610889565b6040518082815260200191505060405180910390f35b6102b76004803603602081101561028b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061088f565b005b6102c1610982565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103236004803603604081101561030357600080fd5b8101908080359060200190929190803590602001909291905050506109a8565b005b6103516004803603602081101561033b57600080fd5b8101908080359060200190929190505050610c06565b005b61035b611030565b6040518082815260200191505060405180910390f35b61039d6004803603602081101561038757600080fd5b8101908080359060200190929190505050611036565b005b6103cb600480360360208110156103b557600080fd5b8101908080359060200190929190505050611206565b005b6103d561133a565b005b6103df611367565b005b6103e96114d4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61041d6114fa565b6040518082815260200191505060405180910390f35b6104996004803603608081101561044957600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff169060200190929190803515159060200190929190505050611500565b005b6104dd600480360360208110156104b157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061174d565b005b6104e7611854565b6040518082815260200191505060405180910390f35b610505611859565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105676004803603604081101561054757600080fd5b810190808035906020019092919080359060200190929190505050611882565b6040518082815260200191505060405180910390f35b6105c96004803603604081101561059357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118b2565b604051808381526020018281526020019250505060405180910390f35b6105ee6118e3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61066a6004803603608081101561063057600080fd5b810190808035906020019092919080359060200190929190803561ffff169060200190929190803515159060200190929190505050611909565b005b6106b86004803603604081101561068257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ad3565b6040518082815260200191505060405180910390f35b610704600480360360408110156106e457600080fd5b810190808035906020019092919080359060200190929190505050611d19565b005b6107486004803603602081101561071c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612016565b005b6000600580549050905090565b61075f612208565b73ffffffffffffffffffffffffffffffffffffffff1661077d611859565b73ffffffffffffffffffffffffffffffffffffffff1614610806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61080e61133a565b8060028190555050565b6005818154811061082557fe5b90600052602060002090600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040160009054906101000a900461ffff16905085565b60075481565b610897612208565b73ffffffffffffffffffffffffffffffffffffffff166108b5611859565b73ffffffffffffffffffffffffffffffffffffffff161461093e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600583815481106109b757fe5b9060005260206000209060050201905060006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015610a95576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f77697468647261773a206e6f7420676f6f64000000000000000000000000000081525060200191505060405180910390fd5b610a9e84611036565b6000610ae88260010154610ada64e8d4a51000610acc8760030154876000015461221090919063ffffffff16565b61229690919063ffffffff16565b61231f90919063ffffffff16565b90506000811115610afe57610afd33826123a2565b5b6000841115610b7657610b1e84836000015461231f90919063ffffffff16565b8260000181905550610b7533858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661261b9092919063ffffffff16565b5b610ba864e8d4a51000610b9a8560030154856000015461221090919063ffffffff16565b61229690919063ffffffff16565b8260010181905550843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568866040518082815260200191505060405180910390a35050505050565b600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610ccb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6d6967726174653a206e6f206d69677261746f7200000000000000000000000081525060200191505060405180910390fd5b600060058281548110610cda57fe5b9060005260206000209060050201905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610d7c57600080fd5b505afa158015610d90573d6000803e3d6000fd5b505050506040513d6020811015610da657600080fd5b81019080805190602001909291905050509050610e06600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff166126bd9092919063ffffffff16565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ce5494bb846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015610e9357600080fd5b505af1158015610ea7573d6000803e3d6000fd5b505050506040513d6020811015610ebd57600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f3757600080fd5b505afa158015610f4b573d6000803e3d6000fd5b505050506040513d6020811015610f6157600080fd5b81019080805190602001909291905050508214610fe6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f6d6967726174653a20626164000000000000000000000000000000000000000081525060200191505060405180910390fd5b808460000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b60085481565b60006005828154811061104557fe5b90600052602060002090600502019050806002015443116110665750611203565b60008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156110f357600080fd5b505afa158015611107573d6000803e3d6000fd5b505050506040513d602081101561111d57600080fd5b810190808051906020019092919050505090506000811480611143575060008260010154145b15611158574382600201819055505050611203565b6000611168836002015443611882565b905060006111ab60075461119d866001015461118f6002548761221090919063ffffffff16565b61221090919063ffffffff16565b61229690919063ffffffff16565b90506111ed6111da846111cc64e8d4a510008561221090919063ffffffff16565b61229690919063ffffffff16565b856003015461288290919063ffffffff16565b8460030181905550438460020181905550505050505b50565b60006005828154811061121557fe5b9060005260206000209060050201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008260000181905550600082600101819055506112e533828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661261b9092919063ffffffff16565b833373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae0595836040518082815260200191505060405180910390a350505050565b6000600580549050905060005b818110156113635761135881611036565b806001019050611347565b5050565b61136f612208565b73ffffffffffffffffffffffffffffffffffffffff1661138d611859565b73ffffffffffffffffffffffffffffffffffffffff1614611416576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025481565b611508612208565b73ffffffffffffffffffffffffffffffffffffffff16611526611859565b73ffffffffffffffffffffffffffffffffffffffff16146115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6127108261ffff16111561160e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180612d5b6025913960400191505060405180910390fd5b801561161d5761161c61133a565b5b6000600854431161163057600854611632565b435b90506116498560075461288290919063ffffffff16565b60078190555060056040518060a001604052808673ffffffffffffffffffffffffffffffffffffffff168152602001878152602001838152602001600081526020018561ffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548161ffff021916908361ffff16021790555050505050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611810576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f736574466565416464726573733a20464f5242494444454e000000000000000081525060200191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600181565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006118aa600161189c858561231f90919063ffffffff16565b61221090919063ffffffff16565b905092915050565b6006602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611911612208565b73ffffffffffffffffffffffffffffffffffffffff1661192f611859565b73ffffffffffffffffffffffffffffffffffffffff16146119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6127108261ffff161115611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180612ded6025913960400191505060405180910390fd5b8015611a2657611a2561133a565b5b611a6b83611a5d60058781548110611a3a57fe5b90600052602060002090600502016001015460075461231f90919063ffffffff16565b61288290919063ffffffff16565b6007819055508260058581548110611a7f57fe5b9060005260206000209060050201600101819055508160058581548110611aa257fe5b906000526020600020906005020160040160006101000a81548161ffff021916908361ffff16021790555050505050565b60008060058481548110611ae357fe5b9060005260206000209060050201905060006006600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260030154905060008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bdd57600080fd5b505afa158015611bf1573d6000803e3d6000fd5b505050506040513d6020811015611c0757600080fd5b81019080805190602001909291905050509050836002015443118015611c2e575060008114155b15611cc9576000611c43856002015443611882565b90506000611c86600754611c788860010154611c6a6002548761221090919063ffffffff16565b61221090919063ffffffff16565b61229690919063ffffffff16565b9050611cc4611cb584611ca764e8d4a510008561221090919063ffffffff16565b61229690919063ffffffff16565b8561288290919063ffffffff16565b935050505b611d0d8360010154611cff64e8d4a51000611cf186886000015461221090919063ffffffff16565b61229690919063ffffffff16565b61231f90919063ffffffff16565b94505050505092915050565b600060058381548110611d2857fe5b9060005260206000209060050201905060006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611d9584611036565b600081600001541115611e04576000611dec8260010154611dde64e8d4a51000611dd08760030154876000015461221090919063ffffffff16565b61229690919063ffffffff16565b61231f90919063ffffffff16565b90506000811115611e0257611e0133826123a2565b5b505b6000831115611f8757611e5e3330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661290a909392919063ffffffff16565b60008260040160009054906101000a900461ffff1661ffff161115611f66576000611ebc612710611eae8560040160009054906101000a900461ffff1661ffff168761221090919063ffffffff16565b61229690919063ffffffff16565b9050611f2f600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661261b9092919063ffffffff16565b611f5881611f4a86856000015461288290919063ffffffff16565b61231f90919063ffffffff16565b826000018190555050611f86565b611f7d83826000015461288290919063ffffffff16565b81600001819055505b5b611fb964e8d4a51000611fab8460030154846000015461221090919063ffffffff16565b61229690919063ffffffff16565b8160010181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a350505050565b61201e612208565b73ffffffffffffffffffffffffffffffffffffffff1661203c611859565b73ffffffffffffffffffffffffffffffffffffffff16146120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561214b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612d806026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b6000808314156122235760009050612290565b600082840290508284828161223457fe5b041461228b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612dcc6021913960400191505060405180910390fd5b809150505b92915050565b600080821161230d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b81838161231657fe5b04905092915050565b600082821115612397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561242d57600080fd5b505afa158015612441573d6000803e3d6000fd5b505050506040513d602081101561245757600080fd5b810190808051906020019092919050505090508082111561254657600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561250557600080fd5b505af1158015612519573d6000803e3d6000fd5b505050506040513d602081101561252f57600080fd5b810190808051906020019092919050505050612616565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156125d957600080fd5b505af11580156125ed573d6000803e3d6000fd5b505050506040513d602081101561260357600080fd5b8101908080519060200190929190505050505b505050565b6126b88363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129cb565b505050565b600081148061278b575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561274e57600080fd5b505afa158015612762573d6000803e3d6000fd5b505050506040513d602081101561277857600080fd5b8101908080519060200190929190505050145b6127e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180612e3c6036913960400191505060405180910390fd5b61287d8363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129cb565b505050565b600080828401905083811015612900576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6129c5846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129cb565b50505050565b6060612a2d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612aba9092919063ffffffff16565b9050600081511115612ab557808060200190516020811015612a4e57600080fd5b8101908080519060200190929190505050612ab4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612e12602a913960400191505060405180910390fd5b5b505050565b6060612ac98484600085612ad2565b90509392505050565b606082471015612b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612da66026913960400191505060405180910390fd5b612b3685612c7b565b612ba8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310612bf85780518252602082019150602081019050602083039250612bd5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612c5a576040519150601f19603f3d011682016040523d82523d6000602084013e612c5f565b606091505b5091509150612c6f828286612c8e565b92505050949350505050565b600080823b905060008111915050919050565b60608315612c9e57829050612d53565b600083511115612cb15782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612d18578082015181840152602081019050612cfd565b50505050905090810190601f168015612d455780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe6164643a20696e76616c6964206465706f7369742066656520626173697320706f696e74734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777365743a20696e76616c6964206465706f7369742066656520626173697320706f696e74735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220a9d7c8d00101e17ba30c72979d8be555c26838365a90ef3da5a3c0f2e7e443a764736f6c634300060c00330000000000000000000000002ecc48ba346a73d7d55aa5a46b5e314d9daa61610000000000000000000000000c8cd674744889a10faaa8b122f23ce39def9b7b0000000000000000000000000000000000000000000000002fe2afed6375dd800000000000000000000000000000000000000000000000000000000000d4fd7e
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80637cd07e47116100de5780638dbb1e3a11610097578063d963842211610071578063d96384221461061a578063e2885c2c1461066c578063e2bbb158146106ce578063f2fde38b146107065761018e565b80638dbb1e3a1461053157806393f1a40b1461057d578063c80c563b146105e65761018e565b80637cd07e47146103e157806380aeb2b61461041557806384e82a33146104335780638705fcd41461049b5780638aa28550146104df5780638da5cb5b146104fd5761018e565b8063441a3e701161014b57806351eb05a61161012557806351eb05a6146103715780635312ea8e1461039f578063630b5ba1146103cd578063715018a6146103d75761018e565b8063441a3e70146102ed578063454b06081461032557806348cd4cb1146103535761018e565b8063081e3eda146101935780630ba84cd2146101b15780631526fe27146101df57806317caf6f11461025757806323cf31181461027557806341275358146102b9575b600080fd5b61019b61074a565b6040518082815260200191505060405180910390f35b6101dd600480360360208110156101c757600080fd5b8101908080359060200190929190505050610757565b005b61020b600480360360208110156101f557600080fd5b8101908080359060200190929190505050610818565b604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018261ffff1681526020019550505050505060405180910390f35b61025f610889565b6040518082815260200191505060405180910390f35b6102b76004803603602081101561028b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061088f565b005b6102c1610982565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103236004803603604081101561030357600080fd5b8101908080359060200190929190803590602001909291905050506109a8565b005b6103516004803603602081101561033b57600080fd5b8101908080359060200190929190505050610c06565b005b61035b611030565b6040518082815260200191505060405180910390f35b61039d6004803603602081101561038757600080fd5b8101908080359060200190929190505050611036565b005b6103cb600480360360208110156103b557600080fd5b8101908080359060200190929190505050611206565b005b6103d561133a565b005b6103df611367565b005b6103e96114d4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61041d6114fa565b6040518082815260200191505060405180910390f35b6104996004803603608081101561044957600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff169060200190929190803515159060200190929190505050611500565b005b6104dd600480360360208110156104b157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061174d565b005b6104e7611854565b6040518082815260200191505060405180910390f35b610505611859565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105676004803603604081101561054757600080fd5b810190808035906020019092919080359060200190929190505050611882565b6040518082815260200191505060405180910390f35b6105c96004803603604081101561059357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118b2565b604051808381526020018281526020019250505060405180910390f35b6105ee6118e3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61066a6004803603608081101561063057600080fd5b810190808035906020019092919080359060200190929190803561ffff169060200190929190803515159060200190929190505050611909565b005b6106b86004803603604081101561068257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ad3565b6040518082815260200191505060405180910390f35b610704600480360360408110156106e457600080fd5b810190808035906020019092919080359060200190929190505050611d19565b005b6107486004803603602081101561071c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612016565b005b6000600580549050905090565b61075f612208565b73ffffffffffffffffffffffffffffffffffffffff1661077d611859565b73ffffffffffffffffffffffffffffffffffffffff1614610806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61080e61133a565b8060028190555050565b6005818154811061082557fe5b90600052602060002090600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040160009054906101000a900461ffff16905085565b60075481565b610897612208565b73ffffffffffffffffffffffffffffffffffffffff166108b5611859565b73ffffffffffffffffffffffffffffffffffffffff161461093e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600583815481106109b757fe5b9060005260206000209060050201905060006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015610a95576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f77697468647261773a206e6f7420676f6f64000000000000000000000000000081525060200191505060405180910390fd5b610a9e84611036565b6000610ae88260010154610ada64e8d4a51000610acc8760030154876000015461221090919063ffffffff16565b61229690919063ffffffff16565b61231f90919063ffffffff16565b90506000811115610afe57610afd33826123a2565b5b6000841115610b7657610b1e84836000015461231f90919063ffffffff16565b8260000181905550610b7533858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661261b9092919063ffffffff16565b5b610ba864e8d4a51000610b9a8560030154856000015461221090919063ffffffff16565b61229690919063ffffffff16565b8260010181905550843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568866040518082815260200191505060405180910390a35050505050565b600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610ccb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6d6967726174653a206e6f206d69677261746f7200000000000000000000000081525060200191505060405180910390fd5b600060058281548110610cda57fe5b9060005260206000209060050201905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610d7c57600080fd5b505afa158015610d90573d6000803e3d6000fd5b505050506040513d6020811015610da657600080fd5b81019080805190602001909291905050509050610e06600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff166126bd9092919063ffffffff16565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ce5494bb846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015610e9357600080fd5b505af1158015610ea7573d6000803e3d6000fd5b505050506040513d6020811015610ebd57600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f3757600080fd5b505afa158015610f4b573d6000803e3d6000fd5b505050506040513d6020811015610f6157600080fd5b81019080805190602001909291905050508214610fe6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f6d6967726174653a20626164000000000000000000000000000000000000000081525060200191505060405180910390fd5b808460000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b60085481565b60006005828154811061104557fe5b90600052602060002090600502019050806002015443116110665750611203565b60008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156110f357600080fd5b505afa158015611107573d6000803e3d6000fd5b505050506040513d602081101561111d57600080fd5b810190808051906020019092919050505090506000811480611143575060008260010154145b15611158574382600201819055505050611203565b6000611168836002015443611882565b905060006111ab60075461119d866001015461118f6002548761221090919063ffffffff16565b61221090919063ffffffff16565b61229690919063ffffffff16565b90506111ed6111da846111cc64e8d4a510008561221090919063ffffffff16565b61229690919063ffffffff16565b856003015461288290919063ffffffff16565b8460030181905550438460020181905550505050505b50565b60006005828154811061121557fe5b9060005260206000209060050201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008260000181905550600082600101819055506112e533828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661261b9092919063ffffffff16565b833373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae0595836040518082815260200191505060405180910390a350505050565b6000600580549050905060005b818110156113635761135881611036565b806001019050611347565b5050565b61136f612208565b73ffffffffffffffffffffffffffffffffffffffff1661138d611859565b73ffffffffffffffffffffffffffffffffffffffff1614611416576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025481565b611508612208565b73ffffffffffffffffffffffffffffffffffffffff16611526611859565b73ffffffffffffffffffffffffffffffffffffffff16146115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6127108261ffff16111561160e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180612d5b6025913960400191505060405180910390fd5b801561161d5761161c61133a565b5b6000600854431161163057600854611632565b435b90506116498560075461288290919063ffffffff16565b60078190555060056040518060a001604052808673ffffffffffffffffffffffffffffffffffffffff168152602001878152602001838152602001600081526020018561ffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548161ffff021916908361ffff16021790555050505050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611810576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f736574466565416464726573733a20464f5242494444454e000000000000000081525060200191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600181565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006118aa600161189c858561231f90919063ffffffff16565b61221090919063ffffffff16565b905092915050565b6006602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611911612208565b73ffffffffffffffffffffffffffffffffffffffff1661192f611859565b73ffffffffffffffffffffffffffffffffffffffff16146119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6127108261ffff161115611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180612ded6025913960400191505060405180910390fd5b8015611a2657611a2561133a565b5b611a6b83611a5d60058781548110611a3a57fe5b90600052602060002090600502016001015460075461231f90919063ffffffff16565b61288290919063ffffffff16565b6007819055508260058581548110611a7f57fe5b9060005260206000209060050201600101819055508160058581548110611aa257fe5b906000526020600020906005020160040160006101000a81548161ffff021916908361ffff16021790555050505050565b60008060058481548110611ae357fe5b9060005260206000209060050201905060006006600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260030154905060008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bdd57600080fd5b505afa158015611bf1573d6000803e3d6000fd5b505050506040513d6020811015611c0757600080fd5b81019080805190602001909291905050509050836002015443118015611c2e575060008114155b15611cc9576000611c43856002015443611882565b90506000611c86600754611c788860010154611c6a6002548761221090919063ffffffff16565b61221090919063ffffffff16565b61229690919063ffffffff16565b9050611cc4611cb584611ca764e8d4a510008561221090919063ffffffff16565b61229690919063ffffffff16565b8561288290919063ffffffff16565b935050505b611d0d8360010154611cff64e8d4a51000611cf186886000015461221090919063ffffffff16565b61229690919063ffffffff16565b61231f90919063ffffffff16565b94505050505092915050565b600060058381548110611d2857fe5b9060005260206000209060050201905060006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611d9584611036565b600081600001541115611e04576000611dec8260010154611dde64e8d4a51000611dd08760030154876000015461221090919063ffffffff16565b61229690919063ffffffff16565b61231f90919063ffffffff16565b90506000811115611e0257611e0133826123a2565b5b505b6000831115611f8757611e5e3330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661290a909392919063ffffffff16565b60008260040160009054906101000a900461ffff1661ffff161115611f66576000611ebc612710611eae8560040160009054906101000a900461ffff1661ffff168761221090919063ffffffff16565b61229690919063ffffffff16565b9050611f2f600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661261b9092919063ffffffff16565b611f5881611f4a86856000015461288290919063ffffffff16565b61231f90919063ffffffff16565b826000018190555050611f86565b611f7d83826000015461288290919063ffffffff16565b81600001819055505b5b611fb964e8d4a51000611fab8460030154846000015461221090919063ffffffff16565b61229690919063ffffffff16565b8160010181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a350505050565b61201e612208565b73ffffffffffffffffffffffffffffffffffffffff1661203c611859565b73ffffffffffffffffffffffffffffffffffffffff16146120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561214b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612d806026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b6000808314156122235760009050612290565b600082840290508284828161223457fe5b041461228b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612dcc6021913960400191505060405180910390fd5b809150505b92915050565b600080821161230d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b81838161231657fe5b04905092915050565b600082821115612397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561242d57600080fd5b505afa158015612441573d6000803e3d6000fd5b505050506040513d602081101561245757600080fd5b810190808051906020019092919050505090508082111561254657600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561250557600080fd5b505af1158015612519573d6000803e3d6000fd5b505050506040513d602081101561252f57600080fd5b810190808051906020019092919050505050612616565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156125d957600080fd5b505af11580156125ed573d6000803e3d6000fd5b505050506040513d602081101561260357600080fd5b8101908080519060200190929190505050505b505050565b6126b88363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129cb565b505050565b600081148061278b575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561274e57600080fd5b505afa158015612762573d6000803e3d6000fd5b505050506040513d602081101561277857600080fd5b8101908080519060200190929190505050145b6127e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180612e3c6036913960400191505060405180910390fd5b61287d8363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129cb565b505050565b600080828401905083811015612900576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6129c5846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129cb565b50505050565b6060612a2d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612aba9092919063ffffffff16565b9050600081511115612ab557808060200190516020811015612a4e57600080fd5b8101908080519060200190929190505050612ab4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612e12602a913960400191505060405180910390fd5b5b505050565b6060612ac98484600085612ad2565b90509392505050565b606082471015612b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612da66026913960400191505060405180910390fd5b612b3685612c7b565b612ba8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310612bf85780518252602082019150602081019050602083039250612bd5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612c5a576040519150601f19603f3d011682016040523d82523d6000602084013e612c5f565b606091505b5091509150612c6f828286612c8e565b92505050949350505050565b600080823b905060008111915050919050565b60608315612c9e57829050612d53565b600083511115612cb15782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612d18578082015181840152602081019050612cfd565b50505050905090810190601f168015612d455780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe6164643a20696e76616c6964206465706f7369742066656520626173697320706f696e74734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777365743a20696e76616c6964206465706f7369742066656520626173697320706f696e74735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220a9d7c8d00101e17ba30c72979d8be555c26838365a90ef3da5a3c0f2e7e443a764736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002ecc48ba346a73d7d55aa5a46b5e314d9daa61610000000000000000000000000c8cd674744889a10faaa8b122f23ce39def9b7b0000000000000000000000000000000000000000000000002fe2afed6375dd800000000000000000000000000000000000000000000000000000000000d4fd7e
-----Decoded View---------------
Arg [0] : _ssgt (address): 0x2ECc48ba346A73d7d55aa5a46b5E314d9DAA6161
Arg [1] : _feeAddress (address): 0x0C8cD674744889a10FAAa8B122F23CE39DeF9B7B
Arg [2] : _ssgtPerBlock (uint256): 3450513698630000000
Arg [3] : _startBlock (uint256): 13958526
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000002ecc48ba346a73d7d55aa5a46b5e314d9daa6161
Arg [1] : 0000000000000000000000000c8cd674744889a10faaa8b122f23ce39def9b7b
Arg [2] : 0000000000000000000000000000000000000000000000002fe2afed6375dd80
Arg [3] : 0000000000000000000000000000000000000000000000000000000000d4fd7e
Deployed Bytecode Sourcemap
36651:10384:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39436:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46889:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38529:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38772:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41015:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38334:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;44997:740;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41240:491;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38863:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43112:711;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45808:385;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42856:180;;;:::i;:::-;;25017:148;;;:::i;:::-;;38464:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38174:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39700:660;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46593:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38255:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24366:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41807:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38611:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;38110:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40472:463;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42014:759;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43892:1053;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25320:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39436:95;39481:7;39508:8;:15;;;;39501:22;;39436:95;:::o;46889:143::-;24597:12;:10;:12::i;:::-;24586:23;;:7;:5;:7::i;:::-;:23;;;24578:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46968:17:::1;:15;:17::i;:::-;47011:13;46996:12;:28;;;;46889:143:::0;:::o;38529:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38772:34::-;;;;:::o;41015:102::-;24597:12;:10;:12::i;:::-;24586:23;;:7;:5;:7::i;:::-;:23;;;24578:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41100:9:::1;41089:8;;:20;;;;;;;;;;;;;;;;;;41015:102:::0;:::o;38334:25::-;;;;;;;;;;;;;:::o;44997:740::-;45064:21;45088:8;45097:4;45088:14;;;;;;;;;;;;;;;;;;45064:38;;45113:21;45137:8;:14;45146:4;45137:14;;;;;;;;;;;:26;45152:10;45137:26;;;;;;;;;;;;;;;45113:50;;45197:7;45182:4;:11;;;:22;;45174:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45238:16;45249:4;45238:10;:16::i;:::-;45265:15;45283:68;45335:4;:15;;;45283:47;45325:4;45283:37;45299:4;:20;;;45283:4;:11;;;:15;;:37;;;;:::i;:::-;:41;;:47;;;;:::i;:::-;:51;;:68;;;;:::i;:::-;45265:86;;45375:1;45365:7;:11;45362:80;;;45393:37;45410:10;45422:7;45393:16;:37::i;:::-;45362:80;45465:1;45455:7;:11;45452:151;;;45497:24;45513:7;45497:4;:11;;;:15;;:24;;;;:::i;:::-;45483:4;:11;;:38;;;;45536:55;45570:10;45583:7;45536:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;45452:151;45631:47;45673:4;45631:37;45647:4;:20;;;45631:4;:11;;;:15;;:37;;;;:::i;:::-;:41;;:47;;;;:::i;:::-;45613:4;:15;;:65;;;;45715:4;45703:10;45694:35;;;45721:7;45694:35;;;;;;;;;;;;;;;;;;44997:740;;;;;:::o;41240:491::-;41326:1;41297:31;;41305:8;;;;;;;;;;;41297:31;;;;41289:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41364:21;41388:8;41397:4;41388:14;;;;;;;;;;;;;;;;;;41364:38;;41413:14;41430:4;:12;;;;;;;;;;;;41413:29;;41453:11;41467:7;:17;;;41493:4;41467:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41453:46;;41510:43;41538:8;;;;;;;;;;;41549:3;41510:7;:19;;;;:43;;;;;:::i;:::-;41564:17;41584:8;;;;;;;;;;;:16;;;41601:7;41584:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41564:45;;41635:10;:20;;;41664:4;41635:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41628:3;:42;41620:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41713:10;41698:4;:12;;;:25;;;;;;;;;;;;;;;;;;41240:491;;;;;:::o;38863:25::-;;;;:::o;43112:711::-;43164:21;43188:8;43197:4;43188:14;;;;;;;;;;;;;;;;;;43164:38;;43233:4;:20;;;43217:12;:36;43213:75;;43270:7;;;43213:75;43298:16;43317:4;:12;;;;;;;;;;;;:22;;;43348:4;43317:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43298:56;;43381:1;43369:8;:13;:37;;;;43405:1;43386:4;:15;;;:20;43369:37;43365:126;;;43446:12;43423:4;:20;;:35;;;;43473:7;;;;43365:126;43501:18;43522:49;43536:4;:20;;;43558:12;43522:13;:49::i;:::-;43501:70;;43582:18;43603:70;43657:15;;43603:49;43636:4;:15;;;43603:28;43618:12;;43603:10;:14;;:28;;;;:::i;:::-;:32;;:49;;;;:::i;:::-;:53;;:70;;;;:::i;:::-;43582:91;;43709:60;43734:34;43759:8;43734:20;43749:4;43734:10;:14;;:20;;;;:::i;:::-;:24;;:34;;;;:::i;:::-;43709:4;:20;;;:24;;:60;;;;:::i;:::-;43686:4;:20;;:83;;;;43803:12;43780:4;:20;;:35;;;;43112:711;;;;;;:::o;45808:385::-;45867:21;45891:8;45900:4;45891:14;;;;;;;;;;;;;;;;;;45867:38;;45916:21;45940:8;:14;45949:4;45940:14;;;;;;;;;;;:26;45955:10;45940:26;;;;;;;;;;;;;;;45916:50;;45977:14;45994:4;:11;;;45977:28;;46030:1;46016:4;:11;;:15;;;;46060:1;46042:4;:15;;:19;;;;46072:54;46106:10;46119:6;46072:4;:12;;;;;;;;;;;;:25;;;;:54;;;;;:::i;:::-;46172:4;46160:10;46142:43;;;46178:6;46142:43;;;;;;;;;;;;;;;;;;45808:385;;;;:::o;42856:180::-;42901:14;42918:8;:15;;;;42901:32;;42949:11;42944:85;42972:6;42966:3;:12;42944:85;;;43002:15;43013:3;43002:10;:15::i;:::-;42980:5;;;;;42944:85;;;;42856:180;:::o;25017:148::-;24597:12;:10;:12::i;:::-;24586:23;;:7;:5;:7::i;:::-;:23;;;24578:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25124:1:::1;25087:40;;25108:6;::::0;::::1;;;;;;;;25087:40;;;;;;;;;;;;25155:1;25138:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;25017:148::o:0;38464:29::-;;;;;;;;;;;;;:::o;38174:27::-;;;;:::o;39700:660::-;24597:12;:10;:12::i;:::-;24586:23;;:7;:5;:7::i;:::-;:23;;;24578:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39844:5:::1;39827:13;:22;;;;39819:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39906:11;39902:61;;;39934:17;:15;:17::i;:::-;39902:61;39973:23;40014:10;;39999:12;:25;:53;;40042:10;;39999:53;;;40027:12;39999:53;39973:79;;40081:32;40101:11;40081:15;;:19;;:32;;;;:::i;:::-;40063:15;:50;;;;40124:8;40138:213;;;;;;;;40171:8;40138:213;;;;;;40206:11;40138:213;;;;40249:15;40138:213;;;;40296:1;40138:213;;;;40326:13;40138:213;;;;::::0;40124:228:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24657:1;39700:660:::0;;;;:::o;46593:165::-;46676:10;;;;;;;;;;;46662:24;;:10;:24;;;46654:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46739:11;46726:10;;:24;;;;;;;;;;;;;;;;;;46593:165;:::o;38255:44::-;38298:1;38255:44;:::o;24366:87::-;24412:7;24439:6;;;;;;;;;;;24432:13;;24366:87;:::o;41807:143::-;41879:7;41906:36;38298:1;41906:14;41914:5;41906:3;:7;;:14;;;;:::i;:::-;:18;;:36;;;;:::i;:::-;41899:43;;41807:143;;;;:::o;38611:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38110:18::-;;;;;;;;;;;;;:::o;40472:463::-;24597:12;:10;:12::i;:::-;24586:23;;:7;:5;:7::i;:::-;:23;;;24578:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40613:5:::1;40596:13;:22;;;;40588:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40675:11;40671:61;;;40703:17;:15;:17::i;:::-;40671:61;40760:63;40811:11;40760:46;40780:8;40789:4;40780:14;;;;;;;;;;;;;;;;;;:25;;;40760:15;;:19;;:46;;;;:::i;:::-;:50;;:63;;;;:::i;:::-;40742:15;:81;;;;40862:11;40834:8;40843:4;40834:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;40914:13;40884:8;40893:4;40884:14;;;;;;;;;;;;;;;;;;:27;;;:43;;;;;;;;;;;;;;;;;;40472:463:::0;;;;:::o;42014:759::-;42087:7;42107:21;42131:8;42140:4;42131:14;;;;;;;;;;;;;;;;;;42107:38;;42156:21;42180:8;:14;42189:4;42180:14;;;;;;;;;;;:21;42195:5;42180:21;;;;;;;;;;;;;;;42156:45;;42212:23;42238:4;:20;;;42212:46;;42269:16;42288:4;:12;;;;;;;;;;;;:22;;;42319:4;42288:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42269:56;;42355:4;:20;;;42340:12;:35;:52;;;;;42391:1;42379:8;:13;;42340:52;42336:349;;;42409:18;42430:49;42444:4;:20;;;42466:12;42430:13;:49::i;:::-;42409:70;;42494:18;42515:70;42569:15;;42515:49;42548:4;:15;;;42515:28;42530:12;;42515:10;:14;;:28;;;;:::i;:::-;:32;;:49;;;;:::i;:::-;:53;;:70;;;;:::i;:::-;42494:91;;42618:55;42638:34;42663:8;42638:20;42653:4;42638:10;:14;;:20;;;;:::i;:::-;:24;;:34;;;;:::i;:::-;42618:15;:19;;:55;;;;:::i;:::-;42600:73;;42336:349;;;42702:63;42749:4;:15;;;42702:42;42739:4;42702:32;42718:15;42702:4;:11;;;:15;;:32;;;;:::i;:::-;:36;;:42;;;;:::i;:::-;:46;;:63;;;;:::i;:::-;42695:70;;;;;;42014:759;;;;:::o;43892:1053::-;43958:21;43982:8;43991:4;43982:14;;;;;;;;;;;;;;;;;;43958:38;;44007:21;44031:8;:14;44040:4;44031:14;;;;;;;;;;;:26;44046:10;44031:26;;;;;;;;;;;;;;;44007:50;;44068:16;44079:4;44068:10;:16::i;:::-;44113:1;44099:4;:11;;;:15;44095:236;;;44131:15;44149:68;44201:4;:15;;;44149:47;44191:4;44149:37;44165:4;:20;;;44149:4;:11;;;:15;;:37;;;;:::i;:::-;:41;;:47;;;;:::i;:::-;:51;;:68;;;;:::i;:::-;44131:86;;44245:1;44235:7;:11;44232:88;;;44267:37;44284:10;44296:7;44267:16;:37::i;:::-;44232:88;44095:236;;44354:1;44344:7;:11;44341:471;;;44372:74;44410:10;44431:4;44438:7;44372:4;:12;;;;;;;;;;;;:29;;;;:74;;;;;;:::i;:::-;44484:1;44464:4;:17;;;;;;;;;;;;:21;;;44461:340;;;44505:18;44526:41;44561:5;44526:30;44538:4;:17;;;;;;;;;;;;44526:30;;:7;:11;;:30;;;;:::i;:::-;:34;;:41;;;;:::i;:::-;44505:62;;44586:49;44612:10;;;;;;;;;;;44624;44586:4;:12;;;;;;;;;;;;:25;;;;:49;;;;;:::i;:::-;44668:40;44697:10;44668:24;44684:7;44668:4;:11;;;:15;;:24;;;;:::i;:::-;:28;;:40;;;;:::i;:::-;44654:4;:11;;:54;;;;44461:340;;;;44761:24;44777:7;44761:4;:11;;;:15;;:24;;;;:::i;:::-;44747:4;:11;;:38;;;;44461:340;44341:471;44840:47;44882:4;44840:37;44856:4;:20;;;44840:4;:11;;;:15;;:37;;;;:::i;:::-;:41;;:47;;;;:::i;:::-;44822:4;:15;;:65;;;;44923:4;44911:10;44903:34;;;44929:7;44903:34;;;;;;;;;;;;;;;;;;43892:1053;;;;:::o;25320:244::-;24597:12;:10;:12::i;:::-;24586:23;;:7;:5;:7::i;:::-;:23;;;24578:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25429:1:::1;25409:22;;:8;:22;;;;25401:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25519:8;25490:38;;25511:6;::::0;::::1;;;;;;;;25490:38;;;;;;;;;;;;25548:8;25539:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;25320:244:::0;:::o;22923:106::-;22976:15;23011:10;23004:17;;22923:106;:::o;3653:220::-;3711:7;3740:1;3735;:6;3731:20;;;3750:1;3743:8;;;;3731:20;3762:9;3778:1;3774;:5;3762:17;;3807:1;3802;3798;:5;;;;;;:10;3790:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3864:1;3857:8;;;3653:220;;;;;:::o;4351:153::-;4409:7;4441:1;4437;:5;4429:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4495:1;4491;:5;;;;;;4484:12;;4351:153;;;;:::o;3236:158::-;3294:7;3327:1;3322;:6;;3314:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3385:1;3381;:5;3374:12;;3236:158;;;;:::o;46307:278::-;46383:15;46401:4;;;;;;;;;;;:14;;;46424:4;46401:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46383:47;;46455:7;46445;:17;46441:137;;;46479:4;;;;;;;;;;;:13;;;46493:3;46498:7;46479:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46441:137;;;46539:4;;;;;;;;;;;:13;;;46553:3;46558:7;46539:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46441:137;46307:278;;;:::o;19233:177::-;19316:86;19336:5;19366:23;;;19391:2;19395:5;19343:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19316:19;:86::i;:::-;19233:177;;;:::o;19892:622::-;20271:1;20262:5;:10;20261:62;;;;20321:1;20278:5;:15;;;20302:4;20309:7;20278:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;20261:62;20253:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20416:90;20436:5;20466:22;;;20490:7;20499:5;20443:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20416:19;:90::i;:::-;19892:622;;;:::o;2774:179::-;2832:7;2852:9;2868:1;2864;:5;2852:17;;2893:1;2888;:6;;2880:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2944:1;2937:8;;;2774:179;;;;:::o;19418:205::-;19519:96;19539:5;19569:27;;;19598:4;19604:2;19608:5;19546:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19519:19;:96::i;:::-;19418:205;;;;:::o;21538:761::-;21962:23;21988:69;22016:4;21988:69;;;;;;;;;;;;;;;;;21996:5;21988:27;;;;:69;;;;;:::i;:::-;21962:95;;22092:1;22072:10;:17;:21;22068:224;;;22214:10;22203:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22195:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22068:224;21538:761;;;:::o;14257:195::-;14360:12;14392:52;14414:6;14422:4;14428:1;14431:12;14392:21;:52::i;:::-;14385:59;;14257:195;;;;;:::o;15309:530::-;15436:12;15494:5;15469:21;:30;;15461:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15561:18;15572:6;15561:10;:18::i;:::-;15553:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15687:12;15701:23;15728:6;:11;;15748:5;15756:4;15728:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15686:75;;;;15779:52;15797:7;15806:10;15818:12;15779:17;:52::i;:::-;15772:59;;;;15309:530;;;;;;:::o;11339:422::-;11399:4;11607:12;11718:7;11706:20;11698:28;;11752:1;11745:4;:8;11738:15;;;11339:422;;;:::o;17849:742::-;17964:12;17993:7;17989:595;;;18024:10;18017:17;;;;17989:595;18158:1;18138:10;:17;:21;18134:439;;;18401:10;18395:17;18462:15;18449:10;18445:2;18441:19;18434:44;18349:148;18544:12;18537:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17849:742;;;;;;:::o
Swarm Source
ipfs://a9d7c8d00101e17ba30c72979d8be555c26838365a90ef3da5a3c0f2e7e443a7
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.