Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 16 from a total of 16 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 16267709 | 1165 days ago | IN | 0 ETH | 0.00045343 | ||||
| Approve | 16242287 | 1168 days ago | IN | 0 ETH | 0.00081269 | ||||
| Approve | 16242283 | 1168 days ago | IN | 0 ETH | 0.00079442 | ||||
| Approve | 16242279 | 1168 days ago | IN | 0 ETH | 0.00082398 | ||||
| Approve | 16242276 | 1168 days ago | IN | 0 ETH | 0.00082167 | ||||
| Approve | 16242273 | 1168 days ago | IN | 0 ETH | 0.0008408 | ||||
| Approve | 16242269 | 1168 days ago | IN | 0 ETH | 0.00087234 | ||||
| Approve | 16242265 | 1168 days ago | IN | 0 ETH | 0.00093786 | ||||
| Approve | 16242260 | 1168 days ago | IN | 0 ETH | 0.00097759 | ||||
| Approve | 16242256 | 1168 days ago | IN | 0 ETH | 0.00096943 | ||||
| Approve | 16242252 | 1168 days ago | IN | 0 ETH | 0.00104496 | ||||
| Approve | 16242248 | 1168 days ago | IN | 0 ETH | 0.00113101 | ||||
| Approve | 16242244 | 1168 days ago | IN | 0 ETH | 0.0012532 | ||||
| Approve | 16242240 | 1168 days ago | IN | 0 ETH | 0.00118895 | ||||
| Approve | 16242236 | 1168 days ago | IN | 0 ETH | 0.00111723 | ||||
| Drop Presents | 16234101 | 1169 days ago | IN | 0 ETH | 0.04687878 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SantaFM_Hedgeys
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-12-21
*/
// File: contracts/interfaces/IWETH.sol
pragma solidity ^0.8.7;
/// @dev used for handling ETH wrapping into WETH to be stored in smart contracts upon deposit,
/// ... and used to unwrap WETH into ETH to deliver when withdrawing from smart contracts
interface IWETH {
function deposit() external payable;
function transfer(address to, uint256 value) external returns (bool);
function withdraw(uint256) external;
}
// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, 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 `from` to `to` 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 from,
address to,
uint256 amount
) external returns (bool);
}
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
// File: @openzeppelin/contracts/utils/Counters.sol
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)
pragma solidity ^0.8.0;
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
*/
library Counters {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^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 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) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^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() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
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 {
_transferOwnership(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");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @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
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 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");
(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");
(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");
(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");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal 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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^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 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'
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) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @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
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: contracts/libraries/TransferHelper.sol
pragma solidity ^0.8.7;
/// @notice Library to help safely transfer tokens and handle ETH wrapping and unwrapping of WETH
library TransferHelper {
using SafeERC20 for IERC20;
/// @notice Internal function used for standard ERC20 transferFrom method
/// @notice it contains a pre and post balance check
/// @notice as well as a check on the msg.senders balance
/// @param token is the address of the ERC20 being transferred
/// @param from is the remitting address
/// @param to is the location where they are being delivered
function transferTokens(
address token,
address from,
address to,
uint256 amount
) internal {
uint256 priorBalance = IERC20(token).balanceOf(address(to));
require(IERC20(token).balanceOf(msg.sender) >= amount, 'THL01');
SafeERC20.safeTransferFrom(IERC20(token), from, to, amount);
uint256 postBalance = IERC20(token).balanceOf(address(to));
require(postBalance - priorBalance == amount, 'THL02');
}
/// @notice Internal function is used with standard ERC20 transfer method
/// @notice this function ensures that the amount received is the amount sent with pre and post balance checking
/// @param token is the ERC20 contract address that is being transferred
/// @param to is the address of the recipient
/// @param amount is the amount of tokens that are being transferred
function withdrawTokens(
address token,
address to,
uint256 amount
) internal {
uint256 priorBalance = IERC20(token).balanceOf(address(to));
SafeERC20.safeTransfer(IERC20(token), to, amount);
uint256 postBalance = IERC20(token).balanceOf(address(to));
require(postBalance - priorBalance == amount, 'THL02');
}
/// @dev Internal function that handles transfering payments from buyers to sellers with special WETH handling
/// @dev this function assumes that if the recipient address is a contract, it cannot handle ETH - so we always deliver WETH
/// @dev special care needs to be taken when using contract addresses to sell deals - to ensure it can handle WETH properly when received
function transferPayment(
address weth,
address token,
address from,
address payable to,
uint256 amount
) internal {
if (token == weth) {
require(msg.value == amount, 'THL03');
if (!Address.isContract(to)) {
(bool success, ) = to.call{value: amount}('');
require(success, 'THL04');
} else {
/// @dev we want to deliver WETH from ETH here for better handling at contract
IWETH(weth).deposit{value: amount}();
assert(IWETH(weth).transfer(to, amount));
}
} else {
transferTokens(token, from, to, amount);
}
}
/// @dev Internal funciton that handles withdrawing tokens and WETH that are up for sale to buyers
/// @dev this function is only called if the tokens are not timelocked
/// @dev this function handles weth specially and delivers ETH to the recipient
function withdrawPayment(
address weth,
address token,
address payable to,
uint256 amount
) internal {
if (token == weth) {
IWETH(weth).withdraw(amount);
(bool success, ) = to.call{value: amount}('');
require(success, 'THL04');
} else {
withdrawTokens(token, to, amount);
}
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: address zero is not a valid owner");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: invalid token ID");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
_requireMinted(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not token owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
_requireMinted(tokenId);
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
_safeTransfer(from, to, tokenId, data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _owners[tokenId] != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits an {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` has not been minted yet.
*/
function _requireMinted(uint256 tokenId) internal view virtual {
require(_exists(tokenId), "ERC721: invalid token ID");
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}
// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)
pragma solidity ^0.8.0;
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds
* enumerability of all the token ids in the contract as well as all token ids owned by each
* account.
*/
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
// Mapping from owner to list of owned token IDs
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) private _ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] private _allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) private _allTokensIndex;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
return _ownedTokens[owner][index];
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _allTokens.length;
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
return _allTokens[index];
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override {
super._beforeTokenTransfer(from, to, tokenId);
if (from == address(0)) {
_addTokenToAllTokensEnumeration(tokenId);
} else if (from != to) {
_removeTokenFromOwnerEnumeration(from, tokenId);
}
if (to == address(0)) {
_removeTokenFromAllTokensEnumeration(tokenId);
} else if (to != from) {
_addTokenToOwnerEnumeration(to, tokenId);
}
}
/**
* @dev Private function to add a token to this extension's ownership-tracking data structures.
* @param to address representing the new owner of the given token ID
* @param tokenId uint256 ID of the token to be added to the tokens list of the given address
*/
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
uint256 length = ERC721.balanceOf(to);
_ownedTokens[to][length] = tokenId;
_ownedTokensIndex[tokenId] = length;
}
/**
* @dev Private function to add a token to this extension's token tracking data structures.
* @param tokenId uint256 ID of the token to be added to the tokens list
*/
function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
_allTokensIndex[tokenId] = _allTokens.length;
_allTokens.push(tokenId);
}
/**
* @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
* while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
* gas optimizations e.g. when performing a transfer operation (avoiding double writes).
* This has O(1) time complexity, but alters the order of the _ownedTokens array.
* @param from address representing the previous owner of the given token ID
* @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
*/
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
// To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
uint256 tokenIndex = _ownedTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary
if (tokenIndex != lastTokenIndex) {
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
}
// This also deletes the contents at the last position of the array
delete _ownedTokensIndex[tokenId];
delete _ownedTokens[from][lastTokenIndex];
}
/**
* @dev Private function to remove a token from this extension's token tracking data structures.
* This has O(1) time complexity, but alters the order of the _allTokens array.
* @param tokenId uint256 ID of the token to be removed from the tokens list
*/
function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
// To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = _allTokens.length - 1;
uint256 tokenIndex = _allTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
// rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
// an 'if' statement (like in _removeTokenFromOwnerEnumeration)
uint256 lastTokenId = _allTokens[lastTokenIndex];
_allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
// This also deletes the contents at the last position of the array
delete _allTokensIndex[tokenId];
_allTokens.pop();
}
}
// File: contracts/libraries/SantaFM_Hedgeys.sol
pragma solidity 0.8.17;
contract SantaFM_Hedgeys is ERC721Enumerable, ReentrancyGuard, Ownable {
using SafeERC20 for IERC20;
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
string private baseURI;
bool private mintOpen;
struct Present {
address token;
uint256 amount;
uint256 unlockDate;
}
mapping(uint256 => Present) public presents;
constructor(
string memory name,
string memory symbol,
string memory uri
) ERC721(name, symbol) {
baseURI = uri;
mintOpen = true;
}
function dropPresents(
address token,
uint256[] memory amounts,
uint256[] memory unlockDates
) external nonReentrant onlyOwner {
require(mintOpen, 'santa already dropped the presents');
require(amounts.length == unlockDates.length, 'sleigh mismatch');
uint256 totalAmount;
for (uint256 i; i < amounts.length; i++) {
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
totalAmount += amounts[i];
presents[newItemId] = Present(token, amounts[i], unlockDates[i]);
_safeMint(msg.sender, newItemId);
emit PresentDropped(newItemId, msg.sender, token, amounts[i], unlockDates[i]);
}
TransferHelper.transferTokens(token, msg.sender, address(this), totalAmount);
mintOpen = false;
}
function openPresent(uint256 tokenId) external nonReentrant {
require(ownerOf(tokenId) == msg.sender, 'you are on the naughty list');
Present memory present = presents[tokenId];
require(present.unlockDate < block.timestamp, 'You cant open your present yet');
require(present.amount > 0, 'You already opened your present');
emit PresentOpened(tokenId, msg.sender, present.token, present.amount, present.unlockDate);
_burn(tokenId);
delete presents[tokenId];
TransferHelper.withdrawTokens(present.token, msg.sender, present.amount);
}
function _baseURI() internal view override returns (string memory) {
return baseURI;
}
event PresentDropped(uint256 indexed tokenId, address holder, address token, uint256 amount, uint256 unlockDate);
event PresentOpened(uint256 indexed tokenId, address holder, address token, uint256 amount, uint256 unlockDate);
event URISet(string newURI);
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockDate","type":"uint256"}],"name":"PresentDropped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockDate","type":"uint256"}],"name":"PresentOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"newURI","type":"string"}],"name":"URISet","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"unlockDates","type":"uint256[]"}],"name":"dropPresents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"openPresent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"presents","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"unlockDate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162002925380380620029258339810160408190526200003491620001a3565b82826000620000448382620002c3565b506001620000538282620002c3565b50506001600a555062000066336200008c565b600d620000748282620002c3565b5050600e805460ff19166001179055506200038f9050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200010657600080fd5b81516001600160401b0380821115620001235762000123620000de565b604051601f8301601f19908116603f011681019082821181831017156200014e576200014e620000de565b816040528381526020925086838588010111156200016b57600080fd5b600091505b838210156200018f578582018301518183018401529082019062000170565b600093810190920192909252949350505050565b600080600060608486031215620001b957600080fd5b83516001600160401b0380821115620001d157600080fd5b620001df87838801620000f4565b94506020860151915080821115620001f657600080fd5b6200020487838801620000f4565b935060408601519150808211156200021b57600080fd5b506200022a86828701620000f4565b9150509250925092565b600181811c908216806200024957607f821691505b6020821081036200026a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002be57600081815260208120601f850160051c81016020861015620002995750805b601f850160051c820191505b81811015620002ba57828155600101620002a5565b5050505b505050565b81516001600160401b03811115620002df57620002df620000de565b620002f781620002f0845462000234565b8462000270565b602080601f8311600181146200032f5760008415620003165750858301515b600019600386901b1c1916600185901b178555620002ba565b600085815260208120601f198616915b8281101562000360578886015182559484019460019091019084016200033f565b50858210156200037f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612586806200039f6000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b8578063a22cb4651161007c578063a22cb465146102da578063b88d4fde146102ed578063c87b56dd14610300578063e985e9c514610313578063f2fde38b1461034f578063f5b5be6f1461036257600080fd5b806370a0823114610293578063715018a6146102a6578063730139ed146102ae5780638da5cb5b146102c157806395d89b41146102d257600080fd5b806323b872dd1161010a57806323b872dd146101d65780632f745c59146101e957806342842e0e146101fc57806349b6cba51461020f5780634f6ccce71461026d5780636352211e1461028057600080fd5b806301ffc9a71461014757806306fdde031461016f578063081812fc14610184578063095ea7b3146101af57806318160ddd146101c4575b600080fd5b61015a610155366004611f3e565b610375565b60405190151581526020015b60405180910390f35b6101776103a0565b6040516101669190611fab565b610197610192366004611fbe565b610432565b6040516001600160a01b039091168152602001610166565b6101c26101bd366004611ff3565b610459565b005b6008545b604051908152602001610166565b6101c26101e436600461201d565b610573565b6101c86101f7366004611ff3565b6105a4565b6101c261020a36600461201d565b61063a565b61024861021d366004611fbe565b600f602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b604080516001600160a01b039094168452602084019290925290820152606001610166565b6101c861027b366004611fbe565b610655565b61019761028e366004611fbe565b6106e8565b6101c86102a1366004612059565b610748565b6101c26107ce565b6101c26102bc366004611fbe565b6107e2565b600b546001600160a01b0316610197565b610177610a25565b6101c26102e8366004612082565b610a34565b6101c26102fb366004612100565b610a43565b61017761030e366004611fbe565b610a7b565b61015a6103213660046121c0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6101c261035d366004612059565b610ae2565b6101c2610370366004612268565b610b5b565b60006001600160e01b0319821663780e9d6360e01b148061039a575061039a82610e15565b92915050565b6060600080546103af906122dc565b80601f01602080910402602001604051908101604052809291908181526020018280546103db906122dc565b80156104285780601f106103fd57610100808354040283529160200191610428565b820191906000526020600020905b81548152906001019060200180831161040b57829003601f168201915b5050505050905090565b600061043d82610e65565b506000908152600460205260409020546001600160a01b031690565b6000610464826106e8565b9050806001600160a01b0316836001600160a01b0316036104d65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806104f257506104f28133610321565b6105645760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016104cd565b61056e8383610ec4565b505050565b61057d3382610f32565b6105995760405162461bcd60e51b81526004016104cd90612316565b61056e838383610fb1565b60006105af83610748565b82106106115760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016104cd565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61056e83838360405180602001604052806000815250610a43565b600061066060085490565b82106106c35760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016104cd565b600882815481106106d6576106d6612364565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061039a5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016104cd565b60006001600160a01b0382166107b25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016104cd565b506001600160a01b031660009081526003602052604090205490565b6107d6611158565b6107e060006111b2565b565b6002600a54036108345760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104cd565b6002600a5533610843826106e8565b6001600160a01b0316146108995760405162461bcd60e51b815260206004820152601b60248201527f796f7520617265206f6e20746865206e617567687479206c697374000000000060448201526064016104cd565b6000818152600f6020908152604091829020825160608101845281546001600160a01b03168152600182015492810192909252600201549181018290529042116109255760405162461bcd60e51b815260206004820152601e60248201527f596f752063616e74206f70656e20796f75722070726573656e7420796574000060448201526064016104cd565b60008160200151116109795760405162461bcd60e51b815260206004820152601f60248201527f596f7520616c7265616479206f70656e656420796f75722070726573656e740060448201526064016104cd565b805160208083015160408085015181513381526001600160a01b0390951693850193909352830152606082015282907fa2063a040f4e8a3f8e4881307bfa6c7cdbd13c0f2f0358dedecc3933f38839e69060800160405180910390a26109de82611204565b6000828152600f60209081526040822080546001600160a01b03191681556001810183905560020191909155815190820151610a1c919033906112ab565b50506001600a55565b6060600180546103af906122dc565b610a3f3383836113dd565b5050565b610a4d3383610f32565b610a695760405162461bcd60e51b81526004016104cd90612316565b610a75848484846114ab565b50505050565b6060610a8682610e65565b6000610a906114de565b90506000815111610ab05760405180602001604052806000815250610adb565b80610aba846114ed565b604051602001610acb92919061237a565b6040516020818303038152906040525b9392505050565b610aea611158565b6001600160a01b038116610b4f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104cd565b610b58816111b2565b50565b6002600a5403610bad5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104cd565b6002600a55610bba611158565b600e5460ff16610c175760405162461bcd60e51b815260206004820152602260248201527f73616e746120616c72656164792064726f70706564207468652070726573656e604482015261747360f01b60648201526084016104cd565b8051825114610c5a5760405162461bcd60e51b815260206004820152600f60248201526e0e6d8cad2ced040dad2e6dac2e8c6d608b1b60448201526064016104cd565b6000805b8351811015610df357610c75600c80546001019055565b6000610c80600c5490565b9050848281518110610c9457610c94612364565b602002602001015183610ca791906123bf565b92506040518060600160405280876001600160a01b03168152602001868481518110610cd557610cd5612364565b60200260200101518152602001858481518110610cf457610cf4612364565b6020908102919091018101519091526000838152600f8252604090819020835181546001600160a01b0319166001600160a01b039091161781559183015160018301559190910151600290910155610d4c33826115ee565b807f239ddedd579e4680c7d57d3f54d8463a84421add882804f658c3b793b3b724ea3388888681518110610d8257610d82612364565b6020026020010151888781518110610d9c57610d9c612364565b6020026020010151604051610dd894939291906001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b60405180910390a25080610deb816123d2565b915050610c5e565b50610e0084333084611608565b5050600e805460ff1916905550506001600a55565b60006001600160e01b031982166380ac58cd60e01b1480610e4657506001600160e01b03198216635b5e139f60e01b145b8061039a57506301ffc9a760e01b6001600160e01b031983161461039a565b6000818152600260205260409020546001600160a01b0316610b585760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016104cd565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610ef9826106e8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610f3e836106e8565b9050806001600160a01b0316846001600160a01b03161480610f8557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610fa95750836001600160a01b0316610f9e84610432565b6001600160a01b0316145b949350505050565b826001600160a01b0316610fc4826106e8565b6001600160a01b0316146110285760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016104cd565b6001600160a01b03821661108a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104cd565b6110958383836117dd565b6110a0600082610ec4565b6001600160a01b03831660009081526003602052604081208054600192906110c99084906123eb565b90915550506001600160a01b03821660009081526003602052604081208054600192906110f79084906123bf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b546001600160a01b031633146107e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104cd565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061120f826106e8565b905061121d816000846117dd565b611228600083610ec4565b6001600160a01b03811660009081526003602052604081208054600192906112519084906123eb565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6040516370a0823160e01b81526001600160a01b038381166004830152600091908516906370a0823190602401602060405180830381865afa1580156112f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131991906123fe565b9050611326848484611895565b6040516370a0823160e01b81526001600160a01b038481166004830152600091908616906370a0823190602401602060405180830381865afa158015611370573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139491906123fe565b9050826113a183836123eb565b146113d65760405162461bcd60e51b81526020600482015260056024820152642a2426181960d91b60448201526064016104cd565b5050505050565b816001600160a01b0316836001600160a01b03160361143e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104cd565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6114b6848484610fb1565b6114c2848484846118f8565b610a755760405162461bcd60e51b81526004016104cd90612417565b6060600d80546103af906122dc565b6060816000036115145750506040805180820190915260018152600360fc1b602082015290565b8160005b811561153e5780611528816123d2565b91506115379050600a8361247f565b9150611518565b60008167ffffffffffffffff811115611559576115596120b9565b6040519080825280601f01601f191660200182016040528015611583576020820181803683370190505b5090505b8415610fa9576115986001836123eb565b91506115a5600a86612493565b6115b09060306123bf565b60f81b8183815181106115c5576115c5612364565b60200101906001600160f81b031916908160001a9053506115e7600a8661247f565b9450611587565b610a3f8282604051806020016040528060008152506119f9565b6040516370a0823160e01b81526001600160a01b038381166004830152600091908616906370a0823190602401602060405180830381865afa158015611652573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167691906123fe565b6040516370a0823160e01b815233600482015290915082906001600160a01b038716906370a0823190602401602060405180830381865afa1580156116bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e391906123fe565b10156117195760405162461bcd60e51b815260206004820152600560248201526454484c303160d81b60448201526064016104cd565b61172585858585611a2c565b6040516370a0823160e01b81526001600160a01b038481166004830152600091908716906370a0823190602401602060405180830381865afa15801561176f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179391906123fe565b9050826117a083836123eb565b146117d55760405162461bcd60e51b81526020600482015260056024820152642a2426181960d91b60448201526064016104cd565b505050505050565b6001600160a01b0383166118385761183381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61185b565b816001600160a01b0316836001600160a01b03161461185b5761185b8382611a64565b6001600160a01b0382166118725761056e81611b01565b826001600160a01b0316826001600160a01b03161461056e5761056e8282611bb0565b6040516001600160a01b03831660248201526044810182905261056e90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611bf4565b60006001600160a01b0384163b156119ee57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061193c9033908990889088906004016124a7565b6020604051808303816000875af1925050508015611977575060408051601f3d908101601f19168201909252611974918101906124e4565b60015b6119d4573d8080156119a5576040519150601f19603f3d011682016040523d82523d6000602084013e6119aa565b606091505b5080516000036119cc5760405162461bcd60e51b81526004016104cd90612417565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610fa9565b506001949350505050565b611a038383611cc6565b611a1060008484846118f8565b61056e5760405162461bcd60e51b81526004016104cd90612417565b6040516001600160a01b0380851660248301528316604482015260648101829052610a759085906323b872dd60e01b906084016118c1565b60006001611a7184610748565b611a7b91906123eb565b600083815260076020526040902054909150808214611ace576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611b13906001906123eb565b60008381526009602052604081205460088054939450909284908110611b3b57611b3b612364565b906000526020600020015490508060088381548110611b5c57611b5c612364565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611b9457611b94612501565b6001900381819060005260206000200160009055905550505050565b6000611bbb83610748565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6000611c49826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e149092919063ffffffff16565b80519091501561056e5780806020019051810190611c679190612517565b61056e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104cd565b6001600160a01b038216611d1c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104cd565b6000818152600260205260409020546001600160a01b031615611d815760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104cd565b611d8d600083836117dd565b6001600160a01b0382166000908152600360205260408120805460019290611db69084906123bf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060610fa98484600085856001600160a01b0385163b611e765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104cd565b600080866001600160a01b03168587604051611e929190612534565b60006040518083038185875af1925050503d8060008114611ecf576040519150601f19603f3d011682016040523d82523d6000602084013e611ed4565b606091505b5091509150611ee4828286611eef565b979650505050505050565b60608315611efe575081610adb565b825115611f0e5782518084602001fd5b8160405162461bcd60e51b81526004016104cd9190611fab565b6001600160e01b031981168114610b5857600080fd5b600060208284031215611f5057600080fd5b8135610adb81611f28565b60005b83811015611f76578181015183820152602001611f5e565b50506000910152565b60008151808452611f97816020860160208601611f5b565b601f01601f19169290920160200192915050565b602081526000610adb6020830184611f7f565b600060208284031215611fd057600080fd5b5035919050565b80356001600160a01b0381168114611fee57600080fd5b919050565b6000806040838503121561200657600080fd5b61200f83611fd7565b946020939093013593505050565b60008060006060848603121561203257600080fd5b61203b84611fd7565b925061204960208501611fd7565b9150604084013590509250925092565b60006020828403121561206b57600080fd5b610adb82611fd7565b8015158114610b5857600080fd5b6000806040838503121561209557600080fd5b61209e83611fd7565b915060208301356120ae81612074565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156120f8576120f86120b9565b604052919050565b6000806000806080858703121561211657600080fd5b61211f85611fd7565b9350602061212e818701611fd7565b935060408601359250606086013567ffffffffffffffff8082111561215257600080fd5b818801915088601f83011261216657600080fd5b813581811115612178576121786120b9565b61218a601f8201601f191685016120cf565b915080825289848285010111156121a057600080fd5b808484018584013760008482840101525080935050505092959194509250565b600080604083850312156121d357600080fd5b6121dc83611fd7565b91506121ea60208401611fd7565b90509250929050565b600082601f83011261220457600080fd5b8135602067ffffffffffffffff821115612220576122206120b9565b8160051b61222f8282016120cf565b928352848101820192828101908785111561224957600080fd5b83870192505b84831015611ee45782358252918301919083019061224f565b60008060006060848603121561227d57600080fd5b61228684611fd7565b9250602084013567ffffffffffffffff808211156122a357600080fd5b6122af878388016121f3565b935060408601359150808211156122c557600080fd5b506122d2868287016121f3565b9150509250925092565b600181811c908216806122f057607f821691505b60208210810361231057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000835161238c818460208801611f5b565b8351908301906123a0818360208801611f5b565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561039a5761039a6123a9565b6000600182016123e4576123e46123a9565b5060010190565b8181038181111561039a5761039a6123a9565b60006020828403121561241057600080fd5b5051919050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261248e5761248e612469565b500490565b6000826124a2576124a2612469565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124da90830184611f7f565b9695505050505050565b6000602082840312156124f657600080fd5b8151610adb81611f28565b634e487b7160e01b600052603160045260246000fd5b60006020828403121561252957600080fd5b8151610adb81612074565b60008251612546818460208701611f5b565b919091019291505056fea2646970667358221220681dcf3d165fc0a18a3e8e879084afb202d9c1722873cbae2901e0d967bff5d464736f6c63430008110033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001f4865646765792053616e74612e464d205370656369616c2045646974696f6e00000000000000000000000000000000000000000000000000000000000000000b48454447455953414e54410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d526a4b43624e41674d755956447a696f5435414e4343375739715237727855444a6d4e5158546a514a4b36652f00000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b8578063a22cb4651161007c578063a22cb465146102da578063b88d4fde146102ed578063c87b56dd14610300578063e985e9c514610313578063f2fde38b1461034f578063f5b5be6f1461036257600080fd5b806370a0823114610293578063715018a6146102a6578063730139ed146102ae5780638da5cb5b146102c157806395d89b41146102d257600080fd5b806323b872dd1161010a57806323b872dd146101d65780632f745c59146101e957806342842e0e146101fc57806349b6cba51461020f5780634f6ccce71461026d5780636352211e1461028057600080fd5b806301ffc9a71461014757806306fdde031461016f578063081812fc14610184578063095ea7b3146101af57806318160ddd146101c4575b600080fd5b61015a610155366004611f3e565b610375565b60405190151581526020015b60405180910390f35b6101776103a0565b6040516101669190611fab565b610197610192366004611fbe565b610432565b6040516001600160a01b039091168152602001610166565b6101c26101bd366004611ff3565b610459565b005b6008545b604051908152602001610166565b6101c26101e436600461201d565b610573565b6101c86101f7366004611ff3565b6105a4565b6101c261020a36600461201d565b61063a565b61024861021d366004611fbe565b600f602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b604080516001600160a01b039094168452602084019290925290820152606001610166565b6101c861027b366004611fbe565b610655565b61019761028e366004611fbe565b6106e8565b6101c86102a1366004612059565b610748565b6101c26107ce565b6101c26102bc366004611fbe565b6107e2565b600b546001600160a01b0316610197565b610177610a25565b6101c26102e8366004612082565b610a34565b6101c26102fb366004612100565b610a43565b61017761030e366004611fbe565b610a7b565b61015a6103213660046121c0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6101c261035d366004612059565b610ae2565b6101c2610370366004612268565b610b5b565b60006001600160e01b0319821663780e9d6360e01b148061039a575061039a82610e15565b92915050565b6060600080546103af906122dc565b80601f01602080910402602001604051908101604052809291908181526020018280546103db906122dc565b80156104285780601f106103fd57610100808354040283529160200191610428565b820191906000526020600020905b81548152906001019060200180831161040b57829003601f168201915b5050505050905090565b600061043d82610e65565b506000908152600460205260409020546001600160a01b031690565b6000610464826106e8565b9050806001600160a01b0316836001600160a01b0316036104d65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806104f257506104f28133610321565b6105645760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016104cd565b61056e8383610ec4565b505050565b61057d3382610f32565b6105995760405162461bcd60e51b81526004016104cd90612316565b61056e838383610fb1565b60006105af83610748565b82106106115760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016104cd565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61056e83838360405180602001604052806000815250610a43565b600061066060085490565b82106106c35760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016104cd565b600882815481106106d6576106d6612364565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061039a5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016104cd565b60006001600160a01b0382166107b25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016104cd565b506001600160a01b031660009081526003602052604090205490565b6107d6611158565b6107e060006111b2565b565b6002600a54036108345760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104cd565b6002600a5533610843826106e8565b6001600160a01b0316146108995760405162461bcd60e51b815260206004820152601b60248201527f796f7520617265206f6e20746865206e617567687479206c697374000000000060448201526064016104cd565b6000818152600f6020908152604091829020825160608101845281546001600160a01b03168152600182015492810192909252600201549181018290529042116109255760405162461bcd60e51b815260206004820152601e60248201527f596f752063616e74206f70656e20796f75722070726573656e7420796574000060448201526064016104cd565b60008160200151116109795760405162461bcd60e51b815260206004820152601f60248201527f596f7520616c7265616479206f70656e656420796f75722070726573656e740060448201526064016104cd565b805160208083015160408085015181513381526001600160a01b0390951693850193909352830152606082015282907fa2063a040f4e8a3f8e4881307bfa6c7cdbd13c0f2f0358dedecc3933f38839e69060800160405180910390a26109de82611204565b6000828152600f60209081526040822080546001600160a01b03191681556001810183905560020191909155815190820151610a1c919033906112ab565b50506001600a55565b6060600180546103af906122dc565b610a3f3383836113dd565b5050565b610a4d3383610f32565b610a695760405162461bcd60e51b81526004016104cd90612316565b610a75848484846114ab565b50505050565b6060610a8682610e65565b6000610a906114de565b90506000815111610ab05760405180602001604052806000815250610adb565b80610aba846114ed565b604051602001610acb92919061237a565b6040516020818303038152906040525b9392505050565b610aea611158565b6001600160a01b038116610b4f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104cd565b610b58816111b2565b50565b6002600a5403610bad5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104cd565b6002600a55610bba611158565b600e5460ff16610c175760405162461bcd60e51b815260206004820152602260248201527f73616e746120616c72656164792064726f70706564207468652070726573656e604482015261747360f01b60648201526084016104cd565b8051825114610c5a5760405162461bcd60e51b815260206004820152600f60248201526e0e6d8cad2ced040dad2e6dac2e8c6d608b1b60448201526064016104cd565b6000805b8351811015610df357610c75600c80546001019055565b6000610c80600c5490565b9050848281518110610c9457610c94612364565b602002602001015183610ca791906123bf565b92506040518060600160405280876001600160a01b03168152602001868481518110610cd557610cd5612364565b60200260200101518152602001858481518110610cf457610cf4612364565b6020908102919091018101519091526000838152600f8252604090819020835181546001600160a01b0319166001600160a01b039091161781559183015160018301559190910151600290910155610d4c33826115ee565b807f239ddedd579e4680c7d57d3f54d8463a84421add882804f658c3b793b3b724ea3388888681518110610d8257610d82612364565b6020026020010151888781518110610d9c57610d9c612364565b6020026020010151604051610dd894939291906001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b60405180910390a25080610deb816123d2565b915050610c5e565b50610e0084333084611608565b5050600e805460ff1916905550506001600a55565b60006001600160e01b031982166380ac58cd60e01b1480610e4657506001600160e01b03198216635b5e139f60e01b145b8061039a57506301ffc9a760e01b6001600160e01b031983161461039a565b6000818152600260205260409020546001600160a01b0316610b585760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016104cd565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610ef9826106e8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610f3e836106e8565b9050806001600160a01b0316846001600160a01b03161480610f8557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610fa95750836001600160a01b0316610f9e84610432565b6001600160a01b0316145b949350505050565b826001600160a01b0316610fc4826106e8565b6001600160a01b0316146110285760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016104cd565b6001600160a01b03821661108a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104cd565b6110958383836117dd565b6110a0600082610ec4565b6001600160a01b03831660009081526003602052604081208054600192906110c99084906123eb565b90915550506001600160a01b03821660009081526003602052604081208054600192906110f79084906123bf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b546001600160a01b031633146107e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104cd565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061120f826106e8565b905061121d816000846117dd565b611228600083610ec4565b6001600160a01b03811660009081526003602052604081208054600192906112519084906123eb565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6040516370a0823160e01b81526001600160a01b038381166004830152600091908516906370a0823190602401602060405180830381865afa1580156112f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131991906123fe565b9050611326848484611895565b6040516370a0823160e01b81526001600160a01b038481166004830152600091908616906370a0823190602401602060405180830381865afa158015611370573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139491906123fe565b9050826113a183836123eb565b146113d65760405162461bcd60e51b81526020600482015260056024820152642a2426181960d91b60448201526064016104cd565b5050505050565b816001600160a01b0316836001600160a01b03160361143e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104cd565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6114b6848484610fb1565b6114c2848484846118f8565b610a755760405162461bcd60e51b81526004016104cd90612417565b6060600d80546103af906122dc565b6060816000036115145750506040805180820190915260018152600360fc1b602082015290565b8160005b811561153e5780611528816123d2565b91506115379050600a8361247f565b9150611518565b60008167ffffffffffffffff811115611559576115596120b9565b6040519080825280601f01601f191660200182016040528015611583576020820181803683370190505b5090505b8415610fa9576115986001836123eb565b91506115a5600a86612493565b6115b09060306123bf565b60f81b8183815181106115c5576115c5612364565b60200101906001600160f81b031916908160001a9053506115e7600a8661247f565b9450611587565b610a3f8282604051806020016040528060008152506119f9565b6040516370a0823160e01b81526001600160a01b038381166004830152600091908616906370a0823190602401602060405180830381865afa158015611652573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167691906123fe565b6040516370a0823160e01b815233600482015290915082906001600160a01b038716906370a0823190602401602060405180830381865afa1580156116bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e391906123fe565b10156117195760405162461bcd60e51b815260206004820152600560248201526454484c303160d81b60448201526064016104cd565b61172585858585611a2c565b6040516370a0823160e01b81526001600160a01b038481166004830152600091908716906370a0823190602401602060405180830381865afa15801561176f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179391906123fe565b9050826117a083836123eb565b146117d55760405162461bcd60e51b81526020600482015260056024820152642a2426181960d91b60448201526064016104cd565b505050505050565b6001600160a01b0383166118385761183381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61185b565b816001600160a01b0316836001600160a01b03161461185b5761185b8382611a64565b6001600160a01b0382166118725761056e81611b01565b826001600160a01b0316826001600160a01b03161461056e5761056e8282611bb0565b6040516001600160a01b03831660248201526044810182905261056e90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611bf4565b60006001600160a01b0384163b156119ee57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061193c9033908990889088906004016124a7565b6020604051808303816000875af1925050508015611977575060408051601f3d908101601f19168201909252611974918101906124e4565b60015b6119d4573d8080156119a5576040519150601f19603f3d011682016040523d82523d6000602084013e6119aa565b606091505b5080516000036119cc5760405162461bcd60e51b81526004016104cd90612417565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610fa9565b506001949350505050565b611a038383611cc6565b611a1060008484846118f8565b61056e5760405162461bcd60e51b81526004016104cd90612417565b6040516001600160a01b0380851660248301528316604482015260648101829052610a759085906323b872dd60e01b906084016118c1565b60006001611a7184610748565b611a7b91906123eb565b600083815260076020526040902054909150808214611ace576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611b13906001906123eb565b60008381526009602052604081205460088054939450909284908110611b3b57611b3b612364565b906000526020600020015490508060088381548110611b5c57611b5c612364565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611b9457611b94612501565b6001900381819060005260206000200160009055905550505050565b6000611bbb83610748565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6000611c49826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e149092919063ffffffff16565b80519091501561056e5780806020019051810190611c679190612517565b61056e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104cd565b6001600160a01b038216611d1c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104cd565b6000818152600260205260409020546001600160a01b031615611d815760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104cd565b611d8d600083836117dd565b6001600160a01b0382166000908152600360205260408120805460019290611db69084906123bf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060610fa98484600085856001600160a01b0385163b611e765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104cd565b600080866001600160a01b03168587604051611e929190612534565b60006040518083038185875af1925050503d8060008114611ecf576040519150601f19603f3d011682016040523d82523d6000602084013e611ed4565b606091505b5091509150611ee4828286611eef565b979650505050505050565b60608315611efe575081610adb565b825115611f0e5782518084602001fd5b8160405162461bcd60e51b81526004016104cd9190611fab565b6001600160e01b031981168114610b5857600080fd5b600060208284031215611f5057600080fd5b8135610adb81611f28565b60005b83811015611f76578181015183820152602001611f5e565b50506000910152565b60008151808452611f97816020860160208601611f5b565b601f01601f19169290920160200192915050565b602081526000610adb6020830184611f7f565b600060208284031215611fd057600080fd5b5035919050565b80356001600160a01b0381168114611fee57600080fd5b919050565b6000806040838503121561200657600080fd5b61200f83611fd7565b946020939093013593505050565b60008060006060848603121561203257600080fd5b61203b84611fd7565b925061204960208501611fd7565b9150604084013590509250925092565b60006020828403121561206b57600080fd5b610adb82611fd7565b8015158114610b5857600080fd5b6000806040838503121561209557600080fd5b61209e83611fd7565b915060208301356120ae81612074565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156120f8576120f86120b9565b604052919050565b6000806000806080858703121561211657600080fd5b61211f85611fd7565b9350602061212e818701611fd7565b935060408601359250606086013567ffffffffffffffff8082111561215257600080fd5b818801915088601f83011261216657600080fd5b813581811115612178576121786120b9565b61218a601f8201601f191685016120cf565b915080825289848285010111156121a057600080fd5b808484018584013760008482840101525080935050505092959194509250565b600080604083850312156121d357600080fd5b6121dc83611fd7565b91506121ea60208401611fd7565b90509250929050565b600082601f83011261220457600080fd5b8135602067ffffffffffffffff821115612220576122206120b9565b8160051b61222f8282016120cf565b928352848101820192828101908785111561224957600080fd5b83870192505b84831015611ee45782358252918301919083019061224f565b60008060006060848603121561227d57600080fd5b61228684611fd7565b9250602084013567ffffffffffffffff808211156122a357600080fd5b6122af878388016121f3565b935060408601359150808211156122c557600080fd5b506122d2868287016121f3565b9150509250925092565b600181811c908216806122f057607f821691505b60208210810361231057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000835161238c818460208801611f5b565b8351908301906123a0818360208801611f5b565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561039a5761039a6123a9565b6000600182016123e4576123e46123a9565b5060010190565b8181038181111561039a5761039a6123a9565b60006020828403121561241057600080fd5b5051919050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261248e5761248e612469565b500490565b6000826124a2576124a2612469565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124da90830184611f7f565b9695505050505050565b6000602082840312156124f657600080fd5b8151610adb81611f28565b634e487b7160e01b600052603160045260246000fd5b60006020828403121561252957600080fd5b8151610adb81612074565b60008251612546818460208701611f5b565b919091019291505056fea2646970667358221220681dcf3d165fc0a18a3e8e879084afb202d9c1722873cbae2901e0d967bff5d464736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001f4865646765792053616e74612e464d205370656369616c2045646974696f6e00000000000000000000000000000000000000000000000000000000000000000b48454447455953414e54410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d526a4b43624e41674d755956447a696f5435414e4343375739715237727855444a6d4e5158546a514a4b36652f00000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Hedgey Santa.FM Special Edition
Arg [1] : symbol (string): HEDGEYSANTA
Arg [2] : uri (string): ipfs://QmRjKCbNAgMuYVDzioT5ANCC7W9qR7rxUDJmNQXTjQJK6e/
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000001f
Arg [4] : 4865646765792053616e74612e464d205370656369616c2045646974696f6e00
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [6] : 48454447455953414e5441000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [8] : 697066733a2f2f516d526a4b43624e41674d755956447a696f5435414e434337
Arg [9] : 5739715237727855444a6d4e5158546a514a4b36652f00000000000000000000
Deployed Bytecode Sourcemap
64105:2290:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57864:224;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;57864:224:0;;;;;;;;44598:100;;;:::i;:::-;;;;;;;:::i;46111:171::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;46111:171:0;1533:203:1;45628:417:0;;;;;;:::i;:::-;;:::i;:::-;;58504:113;58592:10;:17;58504:113;;;2324:25:1;;;2312:2;2297:18;58504:113:0;2178:177:1;46811:336:0;;;;;;:::i;:::-;;:::i;58172:256::-;;;;;;:::i;:::-;;:::i;47218:185::-;;;;;;:::i;:::-;;:::i;64443:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;64443:43:0;;;;;;;;;;;-1:-1:-1;;;;;2913:32:1;;;2895:51;;2977:2;2962:18;;2955:34;;;;3005:18;;;2998:34;2883:2;2868:18;64443:43:0;2693:345:1;58694:233:0;;;;;;:::i;:::-;;:::i;44309:222::-;;;;;;:::i;:::-;;:::i;44040:207::-;;;;;;:::i;:::-;;:::i;15180:103::-;;;:::i;65450:575::-;;;;;;:::i;:::-;;:::i;14532:87::-;14605:6;;-1:-1:-1;;;;;14605:6:0;14532:87;;44767:104;;;:::i;46354:155::-;;;;;;:::i;:::-;;:::i;47474:323::-;;;;;;:::i;:::-;;:::i;44942:281::-;;;;;;:::i;:::-;;:::i;46580:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;46701:25:0;;;46677:4;46701:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;46580:164;15438:201;;;;;;:::i;:::-;;:::i;64661:783::-;;;;;;:::i;:::-;;:::i;57864:224::-;57966:4;-1:-1:-1;;;;;;57990:50:0;;-1:-1:-1;;;57990:50:0;;:90;;;58044:36;58068:11;58044:23;:36::i;:::-;57983:97;57864:224;-1:-1:-1;;57864:224:0:o;44598:100::-;44652:13;44685:5;44678:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44598:100;:::o;46111:171::-;46187:7;46207:23;46222:7;46207:14;:23::i;:::-;-1:-1:-1;46250:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;46250:24:0;;46111:171::o;45628:417::-;45709:13;45725:23;45740:7;45725:14;:23::i;:::-;45709:39;;45773:5;-1:-1:-1;;;;;45767:11:0;:2;-1:-1:-1;;;;;45767:11:0;;45759:57;;;;-1:-1:-1;;;45759:57:0;;7317:2:1;45759:57:0;;;7299:21:1;7356:2;7336:18;;;7329:30;7395:34;7375:18;;;7368:62;-1:-1:-1;;;7446:18:1;;;7439:31;7487:19;;45759:57:0;;;;;;;;;13163:10;-1:-1:-1;;;;;45851:21:0;;;;:62;;-1:-1:-1;45876:37:0;45893:5;13163:10;46580:164;:::i;45876:37::-;45829:174;;;;-1:-1:-1;;;45829:174:0;;7719:2:1;45829:174:0;;;7701:21:1;7758:2;7738:18;;;7731:30;7797:34;7777:18;;;7770:62;7868:32;7848:18;;;7841:60;7918:19;;45829:174:0;7517:426:1;45829:174:0;46016:21;46025:2;46029:7;46016:8;:21::i;:::-;45698:347;45628:417;;:::o;46811:336::-;47006:41;13163:10;47039:7;47006:18;:41::i;:::-;46998:100;;;;-1:-1:-1;;;46998:100:0;;;;;;;:::i;:::-;47111:28;47121:4;47127:2;47131:7;47111:9;:28::i;58172:256::-;58269:7;58305:23;58322:5;58305:16;:23::i;:::-;58297:5;:31;58289:87;;;;-1:-1:-1;;;58289:87:0;;8565:2:1;58289:87:0;;;8547:21:1;8604:2;8584:18;;;8577:30;8643:34;8623:18;;;8616:62;-1:-1:-1;;;8694:18:1;;;8687:41;8745:19;;58289:87:0;8363:407:1;58289:87:0;-1:-1:-1;;;;;;58394:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;58172:256::o;47218:185::-;47356:39;47373:4;47379:2;47383:7;47356:39;;;;;;;;;;;;:16;:39::i;58694:233::-;58769:7;58805:30;58592:10;:17;;58504:113;58805:30;58797:5;:38;58789:95;;;;-1:-1:-1;;;58789:95:0;;8977:2:1;58789:95:0;;;8959:21:1;9016:2;8996:18;;;8989:30;9055:34;9035:18;;;9028:62;-1:-1:-1;;;9106:18:1;;;9099:42;9158:19;;58789:95:0;8775:408:1;58789:95:0;58902:10;58913:5;58902:17;;;;;;;;:::i;:::-;;;;;;;;;58895:24;;58694:233;;;:::o;44309:222::-;44381:7;44417:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44417:16:0;;44444:56;;;;-1:-1:-1;;;44444:56:0;;9522:2:1;44444:56:0;;;9504:21:1;9561:2;9541:18;;;9534:30;-1:-1:-1;;;9580:18:1;;;9573:54;9644:18;;44444:56:0;9320:348:1;44040:207:0;44112:7;-1:-1:-1;;;;;44140:19:0;;44132:73;;;;-1:-1:-1;;;44132:73:0;;9875:2:1;44132:73:0;;;9857:21:1;9914:2;9894:18;;;9887:30;9953:34;9933:18;;;9926:62;-1:-1:-1;;;10004:18:1;;;9997:39;10053:19;;44132:73:0;9673:405:1;44132:73:0;-1:-1:-1;;;;;;44223:16:0;;;;;:9;:16;;;;;;;44040:207::o;15180:103::-;14418:13;:11;:13::i;:::-;15245:30:::1;15272:1;15245:18;:30::i;:::-;15180:103::o:0;65450:575::-;7495:1;8093:7;;:19;8085:63;;;;-1:-1:-1;;;8085:63:0;;10285:2:1;8085:63:0;;;10267:21:1;10324:2;10304:18;;;10297:30;10363:33;10343:18;;;10336:61;10414:18;;8085:63:0;10083:355:1;8085:63:0;7495:1;8226:7;:18;65545:10:::1;65525:16;65533:7:::0;65525::::1;:16::i;:::-;-1:-1:-1::0;;;;;65525:30:0::1;;65517:70;;;::::0;-1:-1:-1;;;65517:70:0;;10645:2:1;65517:70:0::1;::::0;::::1;10627:21:1::0;10684:2;10664:18;;;10657:30;10723:29;10703:18;;;10696:57;10770:18;;65517:70:0::1;10443:351:1::0;65517:70:0::1;65594:22;65619:17:::0;;;:8:::1;:17;::::0;;;;;;;;65594:42;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;65594:42:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;::::1;;::::0;;;;;;;;65672:15:::1;-1:-1:-1::0;65643:79:0::1;;;::::0;-1:-1:-1;;;65643:79:0;;11001:2:1;65643:79:0::1;::::0;::::1;10983:21:1::0;11040:2;11020:18;;;11013:30;11079:32;11059:18;;;11052:60;11129:18;;65643:79:0::1;10799:354:1::0;65643:79:0::1;65754:1;65737:7;:14;;;:18;65729:62;;;::::0;-1:-1:-1;;;65729:62:0;;11360:2:1;65729:62:0::1;::::0;::::1;11342:21:1::0;11399:2;11379:18;;;11372:30;11438:33;11418:18;;;11411:61;11489:18;;65729:62:0::1;11158:355:1::0;65729:62:0::1;65838:13:::0;;65853:14:::1;::::0;;::::1;::::0;65869:18:::1;::::0;;::::1;::::0;65803:85;;65826:10:::1;11787:34:1::0;;-1:-1:-1;;;;;11857:15:1;;;11837:18;;;11830:43;;;;11889:18;;11882:34;11947:2;11932:18;;11925:34;65817:7:0;;65803:85:::1;::::0;11736:3:1;11721:19;65803:85:0::1;;;;;;;65895:14;65901:7;65895:5;:14::i;:::-;65923:17;::::0;;;:8:::1;:17;::::0;;;;;;65916:24;;-1:-1:-1;;;;;;65916:24:0::1;::::0;;;;::::1;::::0;;;::::1;;::::0;;;;65977:13;;66004:14;;::::1;::::0;65947:72:::1;::::0;65977:13;65992:10:::1;::::0;65947:29:::1;:72::i;:::-;-1:-1:-1::0;;7451:1:0;8405:7;:22;65450:575::o;44767:104::-;44823:13;44856:7;44849:14;;;;;:::i;46354:155::-;46449:52;13163:10;46482:8;46492;46449:18;:52::i;:::-;46354:155;;:::o;47474:323::-;47648:41;13163:10;47681:7;47648:18;:41::i;:::-;47640:100;;;;-1:-1:-1;;;47640:100:0;;;;;;;:::i;:::-;47751:38;47765:4;47771:2;47775:7;47784:4;47751:13;:38::i;:::-;47474:323;;;;:::o;44942:281::-;45015:13;45041:23;45056:7;45041:14;:23::i;:::-;45077:21;45101:10;:8;:10::i;:::-;45077:34;;45153:1;45135:7;45129:21;:25;:86;;;;;;;;;;;;;;;;;45181:7;45190:18;:7;:16;:18::i;:::-;45164:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45129:86;45122:93;44942:281;-1:-1:-1;;;44942:281:0:o;15438:201::-;14418:13;:11;:13::i;:::-;-1:-1:-1;;;;;15527:22:0;::::1;15519:73;;;::::0;-1:-1:-1;;;15519:73:0;;12673:2:1;15519:73:0::1;::::0;::::1;12655:21:1::0;12712:2;12692:18;;;12685:30;12751:34;12731:18;;;12724:62;-1:-1:-1;;;12802:18:1;;;12795:36;12848:19;;15519:73:0::1;12471:402:1::0;15519:73:0::1;15603:28;15622:8;15603:18;:28::i;:::-;15438:201:::0;:::o;64661:783::-;7495:1;8093:7;;:19;8085:63;;;;-1:-1:-1;;;8085:63:0;;10285:2:1;8085:63:0;;;10267:21:1;10324:2;10304:18;;;10297:30;10363:33;10343:18;;;10336:61;10414:18;;8085:63:0;10083:355:1;8085:63:0;7495:1;8226:7;:18;14418:13:::1;:11;:13::i;:::-;64821:8:::2;::::0;::::2;;64813:55;;;::::0;-1:-1:-1;;;64813:55:0;;13080:2:1;64813:55:0::2;::::0;::::2;13062:21:1::0;13119:2;13099:18;;;13092:30;13158:34;13138:18;;;13131:62;-1:-1:-1;;;13209:18:1;;;13202:32;13251:19;;64813:55:0::2;12878:398:1::0;64813:55:0::2;64901:11;:18;64883:7;:14;:36;64875:64;;;::::0;-1:-1:-1;;;64875:64:0;;13483:2:1;64875:64:0::2;::::0;::::2;13465:21:1::0;13522:2;13502:18;;;13495:30;-1:-1:-1;;;13541:18:1;;;13534:45;13596:18;;64875:64:0::2;13281:339:1::0;64875:64:0::2;64946:19;64977:9:::0;64972:361:::2;64992:7;:14;64988:1;:18;64972:361;;;65022:21;:9;9525:19:::0;;9543:1;9525:19;;;9436:127;65022:21:::2;65052:17;65072:19;:9;9406:14:::0;;9314:114;65072:19:::2;65052:39;;65115:7;65123:1;65115:10;;;;;;;;:::i;:::-;;;;;;;65100:25;;;;;:::i;:::-;;;65156:42;;;;;;;;65164:5;-1:-1:-1::0;;;;;65156:42:0::2;;;;;65171:7;65179:1;65171:10;;;;;;;;:::i;:::-;;;;;;;65156:42;;;;65183:11;65195:1;65183:14;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;65156:42;;;65134:19:::2;::::0;;;:8:::2;:19:::0;;;;;;;:64;;;;-1:-1:-1;;;;;;65134:64:0::2;-1:-1:-1::0;;;;;65134:64:0;;::::2;;::::0;;;;::::2;::::0;-1:-1:-1;65134:64:0;::::2;::::0;;;;::::2;::::0;::::2;::::0;;::::2;::::0;65207:32:::2;65217:10;65134:19:::0;65207:9:::2;:32::i;:::-;65268:9;65253:72;65279:10;65291:5;65298:7;65306:1;65298:10;;;;;;;;:::i;:::-;;;;;;;65310:11;65322:1;65310:14;;;;;;;;:::i;:::-;;;;;;;65253:72;;;;;;;;-1:-1:-1::0;;;;;11805:15:1;;;11787:34;;11857:15;;;;11852:2;11837:18;;11830:43;11904:2;11889:18;;11882:34;11947:2;11932:18;;11925:34;;;;11736:3;11721:19;;11518:447;65253:72:0::2;;;;;;;;-1:-1:-1::0;65008:3:0;::::2;::::0;::::2;:::i;:::-;;;;64972:361;;;;65339:76;65369:5;65376:10;65396:4;65403:11;65339:29;:76::i;:::-;-1:-1:-1::0;;65422:8:0::2;:16:::0;;-1:-1:-1;;65422:16:0::2;::::0;;-1:-1:-1;;65422:16:0;8405:7;:22;64661:783::o;43671:305::-;43773:4;-1:-1:-1;;;;;;43810:40:0;;-1:-1:-1;;;43810:40:0;;:105;;-1:-1:-1;;;;;;;43867:48:0;;-1:-1:-1;;;43867:48:0;43810:105;:158;;;-1:-1:-1;;;;;;;;;;35442:40:0;;;43932:36;35333:157;54086:135;49369:4;49393:16;;;:7;:16;;;;;;-1:-1:-1;;;;;49393:16:0;54160:53;;;;-1:-1:-1;;;54160:53:0;;9522:2:1;54160:53:0;;;9504:21:1;9561:2;9541:18;;;9534:30;-1:-1:-1;;;9580:18:1;;;9573:54;9644:18;;54160:53:0;9320:348:1;53365:174:0;53440:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;53440:29:0;-1:-1:-1;;;;;53440:29:0;;;;;;;;:24;;53494:23;53440:24;53494:14;:23::i;:::-;-1:-1:-1;;;;;53485:46:0;;;;;;;;;;;53365:174;;:::o;49598:264::-;49691:4;49708:13;49724:23;49739:7;49724:14;:23::i;:::-;49708:39;;49777:5;-1:-1:-1;;;;;49766:16:0;:7;-1:-1:-1;;;;;49766:16:0;;:52;;;-1:-1:-1;;;;;;46701:25:0;;;46677:4;46701:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;49786:32;49766:87;;;;49846:7;-1:-1:-1;;;;;49822:31:0;:20;49834:7;49822:11;:20::i;:::-;-1:-1:-1;;;;;49822:31:0;;49766:87;49758:96;49598:264;-1:-1:-1;;;;49598:264:0:o;52621:625::-;52780:4;-1:-1:-1;;;;;52753:31:0;:23;52768:7;52753:14;:23::i;:::-;-1:-1:-1;;;;;52753:31:0;;52745:81;;;;-1:-1:-1;;;52745:81:0;;14229:2:1;52745:81:0;;;14211:21:1;14268:2;14248:18;;;14241:30;14307:34;14287:18;;;14280:62;-1:-1:-1;;;14358:18:1;;;14351:35;14403:19;;52745:81:0;14027:401:1;52745:81:0;-1:-1:-1;;;;;52845:16:0;;52837:65;;;;-1:-1:-1;;;52837:65:0;;14635:2:1;52837:65:0;;;14617:21:1;14674:2;14654:18;;;14647:30;14713:34;14693:18;;;14686:62;-1:-1:-1;;;14764:18:1;;;14757:34;14808:19;;52837:65:0;14433:400:1;52837:65:0;52915:39;52936:4;52942:2;52946:7;52915:20;:39::i;:::-;53019:29;53036:1;53040:7;53019:8;:29::i;:::-;-1:-1:-1;;;;;53061:15:0;;;;;;:9;:15;;;;;:20;;53080:1;;53061:15;:20;;53080:1;;53061:20;:::i;:::-;;;;-1:-1:-1;;;;;;;53092:13:0;;;;;;:9;:13;;;;;:18;;53109:1;;53092:13;:18;;53109:1;;53092:18;:::i;:::-;;;;-1:-1:-1;;53121:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;53121:21:0;-1:-1:-1;;;;;53121:21:0;;;;;;;;;53160:27;;53121:16;;53160:27;;;;;;;45698:347;45628:417;;:::o;14697:132::-;14605:6;;-1:-1:-1;;;;;14605:6:0;13163:10;14761:23;14753:68;;;;-1:-1:-1;;;14753:68:0;;15173:2:1;14753:68:0;;;15155:21:1;;;15192:18;;;15185:30;15251:34;15231:18;;;15224:62;15303:18;;14753:68:0;14971:356:1;15799:191:0;15892:6;;;-1:-1:-1;;;;;15909:17:0;;;-1:-1:-1;;;;;;15909:17:0;;;;;;;15942:40;;15892:6;;;15909:17;15892:6;;15942:40;;15873:16;;15942:40;15862:128;15799:191;:::o;51864:420::-;51924:13;51940:23;51955:7;51940:14;:23::i;:::-;51924:39;;51976:48;51997:5;52012:1;52016:7;51976:20;:48::i;:::-;52065:29;52082:1;52086:7;52065:8;:29::i;:::-;-1:-1:-1;;;;;52107:16:0;;;;;;:9;:16;;;;;:21;;52127:1;;52107:16;:21;;52127:1;;52107:21;:::i;:::-;;;;-1:-1:-1;;52146:16:0;;;;:7;:16;;;;;;52139:23;;-1:-1:-1;;;;;;52139:23:0;;;52180:36;52154:7;;52146:16;-1:-1:-1;;;;;52180:36:0;;;;;52146:16;;52180:36;46354:155;;:::o;30513:350::-;30639:36;;-1:-1:-1;;;30639:36:0;;-1:-1:-1;;;;;1697:32:1;;;30639:36:0;;;1679:51:1;30616:20:0;;30639:23;;;;;;1652:18:1;;30639:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30616:59;;30682:49;30712:5;30720:2;30724:6;30682:22;:49::i;:::-;30760:36;;-1:-1:-1;;;30760:36:0;;-1:-1:-1;;;;;1697:32:1;;;30760:36:0;;;1679:51:1;30738:19:0;;30760:23;;;;;;1652:18:1;;30760:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30738:58;-1:-1:-1;30841:6:0;30811:26;30825:12;30738:58;30811:26;:::i;:::-;:36;30803:54;;;;-1:-1:-1;;;30803:54:0;;15723:2:1;30803:54:0;;;15705:21:1;15762:1;15742:18;;;15735:29;-1:-1:-1;;;15780:18:1;;;15773:35;15825:18;;30803:54:0;15521:328:1;30803:54:0;30609:254;;30513:350;;;:::o;53682:315::-;53837:8;-1:-1:-1;;;;;53828:17:0;:5;-1:-1:-1;;;;;53828:17:0;;53820:55;;;;-1:-1:-1;;;53820:55:0;;16056:2:1;53820:55:0;;;16038:21:1;16095:2;16075:18;;;16068:30;16134:27;16114:18;;;16107:55;16179:18;;53820:55:0;15854:349:1;53820:55:0;-1:-1:-1;;;;;53886:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;53886:46:0;;;;;;;;;;53948:41;;540::1;;;53948::0;;513:18:1;53948:41:0;;;;;;;53682:315;;;:::o;48678:313::-;48834:28;48844:4;48850:2;48854:7;48834:9;:28::i;:::-;48881:47;48904:4;48910:2;48914:7;48923:4;48881:22;:47::i;:::-;48873:110;;;;-1:-1:-1;;;48873:110:0;;;;;;;:::i;66031:94::-;66083:13;66112:7;66105:14;;;;;:::i;10337:723::-;10393:13;10614:5;10623:1;10614:10;10610:53;;-1:-1:-1;;10641:10:0;;;;;;;;;;;;-1:-1:-1;;;10641:10:0;;;;;10337:723::o;10610:53::-;10688:5;10673:12;10729:78;10736:9;;10729:78;;10762:8;;;;:::i;:::-;;-1:-1:-1;10785:10:0;;-1:-1:-1;10793:2:0;10785:10;;:::i;:::-;;;10729:78;;;10817:19;10849:6;10839:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10839:17:0;;10817:39;;10867:154;10874:10;;10867:154;;10901:11;10911:1;10901:11;;:::i;:::-;;-1:-1:-1;10970:10:0;10978:2;10970:5;:10;:::i;:::-;10957:24;;:2;:24;:::i;:::-;10944:39;;10927:6;10934;10927:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;10927:56:0;;;;;;;;-1:-1:-1;10998:11:0;11007:2;10998:11;;:::i;:::-;;;10867:154;;50204:110;50280:26;50290:2;50294:7;50280:26;;;;;;;;;;;;:9;:26::i;29668:449::-;29813:36;;-1:-1:-1;;;29813:36:0;;-1:-1:-1;;;;;1697:32:1;;;29813:36:0;;;1679:51:1;29790:20:0;;29813:23;;;;;;1652:18:1;;29813:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29864:35;;-1:-1:-1;;;29864:35:0;;29888:10;29864:35;;;1679:51:1;29790:59:0;;-1:-1:-1;29903:6:0;;-1:-1:-1;;;;;29864:23:0;;;;;1652:18:1;;29864:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;;29856:63;;;;-1:-1:-1;;;29856:63:0;;17203:2:1;29856:63:0;;;17185:21:1;17242:1;17222:18;;;17215:29;-1:-1:-1;;;17260:18:1;;;17253:35;17305:18;;29856:63:0;17001:328:1;29856:63:0;29926:59;29960:5;29968:4;29974:2;29978:6;29926:26;:59::i;:::-;30014:36;;-1:-1:-1;;;30014:36:0;;-1:-1:-1;;;;;1697:32:1;;;30014:36:0;;;1679:51:1;29992:19:0;;30014:23;;;;;;1652:18:1;;30014:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29992:58;-1:-1:-1;30095:6:0;30065:26;30079:12;29992:58;30065:26;:::i;:::-;:36;30057:54;;;;-1:-1:-1;;;30057:54:0;;15723:2:1;30057:54:0;;;15705:21:1;15762:1;15742:18;;;15735:29;-1:-1:-1;;;15780:18:1;;;15773:35;15825:18;;30057:54:0;15521:328:1;30057:54:0;29783:334;;29668:449;;;;:::o;59540:589::-;-1:-1:-1;;;;;59746:18:0;;59742:187;;59781:40;59813:7;60956:10;:17;;60929:24;;;;:15;:24;;;;;:44;;;60984:24;;;;;;;;;;;;60852:164;59781:40;59742:187;;;59851:2;-1:-1:-1;;;;;59843:10:0;:4;-1:-1:-1;;;;;59843:10:0;;59839:90;;59870:47;59903:4;59909:7;59870:32;:47::i;:::-;-1:-1:-1;;;;;59943:16:0;;59939:183;;59976:45;60013:7;59976:36;:45::i;59939:183::-;60049:4;-1:-1:-1;;;;;60043:10:0;:2;-1:-1:-1;;;;;60043:10:0;;60039:83;;60070:40;60098:2;60102:7;60070:27;:40::i;25264:211::-;25408:58;;-1:-1:-1;;;;;17526:32:1;;25408:58:0;;;17508:51:1;17575:18;;;17568:34;;;25381:86:0;;25401:5;;-1:-1:-1;;;25431:23:0;17481:18:1;;25408:58:0;;;;-1:-1:-1;;25408:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;25408:58:0;-1:-1:-1;;;;;;25408:58:0;;;;;;;;;;25381:19;:86::i;54785:853::-;54939:4;-1:-1:-1;;;;;54960:13:0;;17525:19;:23;54956:675;;54996:71;;-1:-1:-1;;;54996:71:0;;-1:-1:-1;;;;;54996:36:0;;;;;:71;;13163:10;;55047:4;;55053:7;;55062:4;;54996:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54996:71:0;;;;;;;;-1:-1:-1;;54996:71:0;;;;;;;;;;;;:::i;:::-;;;54992:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55237:6;:13;55254:1;55237:18;55233:328;;55280:60;;-1:-1:-1;;;55280:60:0;;;;;;;:::i;55233:328::-;55511:6;55505:13;55496:6;55492:2;55488:15;55481:38;54992:584;-1:-1:-1;;;;;;55118:51:0;-1:-1:-1;;;55118:51:0;;-1:-1:-1;55111:58:0;;54956:675;-1:-1:-1;55615:4:0;54785:853;;;;;;:::o;50541:319::-;50670:18;50676:2;50680:7;50670:5;:18::i;:::-;50721:53;50752:1;50756:2;50760:7;50769:4;50721:22;:53::i;:::-;50699:153;;;;-1:-1:-1;;;50699:153:0;;;;;;;:::i;25483:248::-;25654:68;;-1:-1:-1;;;;;18619:15:1;;;25654:68:0;;;18601:34:1;18671:15;;18651:18;;;18644:43;18703:18;;;18696:34;;;25627:96:0;;25647:5;;-1:-1:-1;;;25677:27:0;18536:18:1;;25654:68:0;18361:375:1;61643:988:0;61909:22;61959:1;61934:22;61951:4;61934:16;:22::i;:::-;:26;;;;:::i;:::-;61971:18;61992:26;;;:17;:26;;;;;;61909:51;;-1:-1:-1;62125:28:0;;;62121:328;;-1:-1:-1;;;;;62192:18:0;;62170:19;62192:18;;;:12;:18;;;;;;;;:34;;;;;;;;;62243:30;;;;;;:44;;;62360:30;;:17;:30;;;;;:43;;;62121:328;-1:-1:-1;62545:26:0;;;;:17;:26;;;;;;;;62538:33;;;-1:-1:-1;;;;;62589:18:0;;;;;:12;:18;;;;;:34;;;;;;;62582:41;61643:988::o;62926:1079::-;63204:10;:17;63179:22;;63204:21;;63224:1;;63204:21;:::i;:::-;63236:18;63257:24;;;:15;:24;;;;;;63630:10;:26;;63179:46;;-1:-1:-1;63257:24:0;;63179:46;;63630:26;;;;;;:::i;:::-;;;;;;;;;63608:48;;63694:11;63669:10;63680;63669:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;63774:28;;;:15;:28;;;;;;;:41;;;63946:24;;;;;63939:31;63981:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;62997:1008;;;62926:1079;:::o;60430:221::-;60515:14;60532:20;60549:2;60532:16;:20::i;:::-;-1:-1:-1;;;;;60563:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;60608:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;60430:221:0:o;28331:716::-;28755:23;28781:69;28809:4;28781:69;;;;;;;;;;;;;;;;;28789:5;-1:-1:-1;;;;;28781:27:0;;;:69;;;;;:::i;:::-;28865:17;;28755:95;;-1:-1:-1;28865:21:0;28861:179;;28962:10;28951:30;;;;;;;;;;;;:::i;:::-;28943:85;;;;-1:-1:-1;;;28943:85:0;;19325:2:1;28943:85:0;;;19307:21:1;19364:2;19344:18;;;19337:30;19403:34;19383:18;;;19376:62;-1:-1:-1;;;19454:18:1;;;19447:40;19504:19;;28943:85:0;19123:406:1;51196:439:0;-1:-1:-1;;;;;51276:16:0;;51268:61;;;;-1:-1:-1;;;51268:61:0;;19736:2:1;51268:61:0;;;19718:21:1;;;19755:18;;;19748:30;19814:34;19794:18;;;19787:62;19866:18;;51268:61:0;19534:356:1;51268:61:0;49369:4;49393:16;;;:7;:16;;;;;;-1:-1:-1;;;;;49393:16:0;:30;51340:58;;;;-1:-1:-1;;;51340:58:0;;20097:2:1;51340:58:0;;;20079:21:1;20136:2;20116:18;;;20109:30;20175;20155:18;;;20148:58;20223:18;;51340:58:0;19895:352:1;51340:58:0;51411:45;51440:1;51444:2;51448:7;51411:20;:45::i;:::-;-1:-1:-1;;;;;51469:13:0;;;;;;:9;:13;;;;;:18;;51486:1;;51469:13;:18;;51486:1;;51469:18;:::i;:::-;;;;-1:-1:-1;;51498:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;51498:21:0;-1:-1:-1;;;;;51498:21:0;;;;;;;;51537:33;;51498:16;;;51537:33;;51498:16;;51537:33;46354:155;;:::o;19975:229::-;20112:12;20144:52;20166:6;20174:4;20180:1;20183:12;20112;-1:-1:-1;;;;;17525:19:0;;;21382:60;;;;-1:-1:-1;;;21382:60:0;;20861:2:1;21382:60:0;;;20843:21:1;20900:2;20880:18;;;20873:30;20939:31;20919:18;;;20912:59;20988:18;;21382:60:0;20659:353:1;21382:60:0;21456:12;21470:23;21497:6;-1:-1:-1;;;;;21497:11:0;21516:5;21523:4;21497:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21455:73;;;;21546:51;21563:7;21572:10;21584:12;21546:16;:51::i;:::-;21539:58;21095:510;-1:-1:-1;;;;;;;21095:510:0:o;23781:762::-;23931:12;23960:7;23956:580;;;-1:-1:-1;23991:10:0;23984:17;;23956:580;24105:17;;:21;24101:424;;24353:10;24347:17;24414:15;24401:10;24397:2;24393:19;24386:44;24101:424;24496:12;24489:20;;-1:-1:-1;;;24489:20:0;;;;;;;;:::i;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:328::-;2437:6;2445;2453;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;2545:29;2564:9;2545:29;:::i;:::-;2535:39;;2593:38;2627:2;2616:9;2612:18;2593:38;:::i;:::-;2583:48;;2678:2;2667:9;2663:18;2650:32;2640:42;;2360:328;;;;;:::o;3043:186::-;3102:6;3155:2;3143:9;3134:7;3130:23;3126:32;3123:52;;;3171:1;3168;3161:12;3123:52;3194:29;3213:9;3194:29;:::i;3234:118::-;3320:5;3313:13;3306:21;3299:5;3296:32;3286:60;;3342:1;3339;3332:12;3357:315;3422:6;3430;3483:2;3471:9;3462:7;3458:23;3454:32;3451:52;;;3499:1;3496;3489:12;3451:52;3522:29;3541:9;3522:29;:::i;:::-;3512:39;;3601:2;3590:9;3586:18;3573:32;3614:28;3636:5;3614:28;:::i;:::-;3661:5;3651:15;;;3357:315;;;;;:::o;3677:127::-;3738:10;3733:3;3729:20;3726:1;3719:31;3769:4;3766:1;3759:15;3793:4;3790:1;3783:15;3809:275;3880:2;3874:9;3945:2;3926:13;;-1:-1:-1;;3922:27:1;3910:40;;3980:18;3965:34;;4001:22;;;3962:62;3959:88;;;4027:18;;:::i;:::-;4063:2;4056:22;3809:275;;-1:-1:-1;3809:275:1:o;4089:980::-;4184:6;4192;4200;4208;4261:3;4249:9;4240:7;4236:23;4232:33;4229:53;;;4278:1;4275;4268:12;4229:53;4301:29;4320:9;4301:29;:::i;:::-;4291:39;;4349:2;4370:38;4404:2;4393:9;4389:18;4370:38;:::i;:::-;4360:48;;4455:2;4444:9;4440:18;4427:32;4417:42;;4510:2;4499:9;4495:18;4482:32;4533:18;4574:2;4566:6;4563:14;4560:34;;;4590:1;4587;4580:12;4560:34;4628:6;4617:9;4613:22;4603:32;;4673:7;4666:4;4662:2;4658:13;4654:27;4644:55;;4695:1;4692;4685:12;4644:55;4731:2;4718:16;4753:2;4749;4746:10;4743:36;;;4759:18;;:::i;:::-;4801:53;4844:2;4825:13;;-1:-1:-1;;4821:27:1;4817:36;;4801:53;:::i;:::-;4788:66;;4877:2;4870:5;4863:17;4917:7;4912:2;4907;4903;4899:11;4895:20;4892:33;4889:53;;;4938:1;4935;4928:12;4889:53;4993:2;4988;4984;4980:11;4975:2;4968:5;4964:14;4951:45;5037:1;5032:2;5027;5020:5;5016:14;5012:23;5005:34;;5058:5;5048:15;;;;;4089:980;;;;;;;:::o;5074:260::-;5142:6;5150;5203:2;5191:9;5182:7;5178:23;5174:32;5171:52;;;5219:1;5216;5209:12;5171:52;5242:29;5261:9;5242:29;:::i;:::-;5232:39;;5290:38;5324:2;5313:9;5309:18;5290:38;:::i;:::-;5280:48;;5074:260;;;;;:::o;5339:712::-;5393:5;5446:3;5439:4;5431:6;5427:17;5423:27;5413:55;;5464:1;5461;5454:12;5413:55;5500:6;5487:20;5526:4;5549:18;5545:2;5542:26;5539:52;;;5571:18;;:::i;:::-;5617:2;5614:1;5610:10;5640:28;5664:2;5660;5656:11;5640:28;:::i;:::-;5702:15;;;5772;;;5768:24;;;5733:12;;;;5804:15;;;5801:35;;;5832:1;5829;5822:12;5801:35;5868:2;5860:6;5856:15;5845:26;;5880:142;5896:6;5891:3;5888:15;5880:142;;;5962:17;;5950:30;;5913:12;;;;6000;;;;5880:142;;6056:669;6183:6;6191;6199;6252:2;6240:9;6231:7;6227:23;6223:32;6220:52;;;6268:1;6265;6258:12;6220:52;6291:29;6310:9;6291:29;:::i;:::-;6281:39;;6371:2;6360:9;6356:18;6343:32;6394:18;6435:2;6427:6;6424:14;6421:34;;;6451:1;6448;6441:12;6421:34;6474:61;6527:7;6518:6;6507:9;6503:22;6474:61;:::i;:::-;6464:71;;6588:2;6577:9;6573:18;6560:32;6544:48;;6617:2;6607:8;6604:16;6601:36;;;6633:1;6630;6623:12;6601:36;;6656:63;6711:7;6700:8;6689:9;6685:24;6656:63;:::i;:::-;6646:73;;;6056:669;;;;;:::o;6730:380::-;6809:1;6805:12;;;;6852;;;6873:61;;6927:4;6919:6;6915:17;6905:27;;6873:61;6980:2;6972:6;6969:14;6949:18;6946:38;6943:161;;7026:10;7021:3;7017:20;7014:1;7007:31;7061:4;7058:1;7051:15;7089:4;7086:1;7079:15;6943:161;;6730:380;;;:::o;7948:410::-;8150:2;8132:21;;;8189:2;8169:18;;;8162:30;8228:34;8223:2;8208:18;;8201:62;-1:-1:-1;;;8294:2:1;8279:18;;8272:44;8348:3;8333:19;;7948:410::o;9188:127::-;9249:10;9244:3;9240:20;9237:1;9230:31;9280:4;9277:1;9270:15;9304:4;9301:1;9294:15;11970:496;12149:3;12187:6;12181:13;12203:66;12262:6;12257:3;12250:4;12242:6;12238:17;12203:66;:::i;:::-;12332:13;;12291:16;;;;12354:70;12332:13;12291:16;12401:4;12389:17;;12354:70;:::i;:::-;12440:20;;11970:496;-1:-1:-1;;;;11970:496:1:o;13625:127::-;13686:10;13681:3;13677:20;13674:1;13667:31;13717:4;13714:1;13707:15;13741:4;13738:1;13731:15;13757:125;13822:9;;;13843:10;;;13840:36;;;13856:18;;:::i;13887:135::-;13926:3;13947:17;;;13944:43;;13967:18;;:::i;:::-;-1:-1:-1;14014:1:1;14003:13;;13887:135::o;14838:128::-;14905:9;;;14926:11;;;14923:37;;;14940:18;;:::i;15332:184::-;15402:6;15455:2;15443:9;15434:7;15430:23;15426:32;15423:52;;;15471:1;15468;15461:12;15423:52;-1:-1:-1;15494:16:1;;15332:184;-1:-1:-1;15332:184:1:o;16208:414::-;16410:2;16392:21;;;16449:2;16429:18;;;16422:30;16488:34;16483:2;16468:18;;16461:62;-1:-1:-1;;;16554:2:1;16539:18;;16532:48;16612:3;16597:19;;16208:414::o;16627:127::-;16688:10;16683:3;16679:20;16676:1;16669:31;16719:4;16716:1;16709:15;16743:4;16740:1;16733:15;16759:120;16799:1;16825;16815:35;;16830:18;;:::i;:::-;-1:-1:-1;16864:9:1;;16759:120::o;16884:112::-;16916:1;16942;16932:35;;16947:18;;:::i;:::-;-1:-1:-1;16981:9:1;;16884:112::o;17613:489::-;-1:-1:-1;;;;;17882:15:1;;;17864:34;;17934:15;;17929:2;17914:18;;17907:43;17981:2;17966:18;;17959:34;;;18029:3;18024:2;18009:18;;18002:31;;;17807:4;;18050:46;;18076:19;;18068:6;18050:46;:::i;:::-;18042:54;17613:489;-1:-1:-1;;;;;;17613:489:1:o;18107:249::-;18176:6;18229:2;18217:9;18208:7;18204:23;18200:32;18197:52;;;18245:1;18242;18235:12;18197:52;18277:9;18271:16;18296:30;18320:5;18296:30;:::i;18741:127::-;18802:10;18797:3;18793:20;18790:1;18783:31;18833:4;18830:1;18823:15;18857:4;18854:1;18847:15;18873:245;18940:6;18993:2;18981:9;18972:7;18968:23;18964:32;18961:52;;;19009:1;19006;18999:12;18961:52;19041:9;19035:16;19060:28;19082:5;19060:28;:::i;21017:287::-;21146:3;21184:6;21178:13;21200:66;21259:6;21254:3;21247:4;21239:6;21235:17;21200:66;:::i;:::-;21282:16;;;;;21017:287;-1:-1:-1;;21017:287:1:o
Swarm Source
ipfs://681dcf3d165fc0a18a3e8e879084afb202d9c1722873cbae2901e0d967bff5d4
Loading...
Loading
Loading...
Loading
Net Worth in USD
$2,615.34
Net Worth in ETH
1.237513
Token Allocations
WSTETH
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $2,615.34 | 1 | $2,615.34 |
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.