ERC-20
Source Code
Overview
Max Total Supply
22,862.157874 MoreXRP
Holders
38
Transfers
-
0
Market
Onchain Market Cap
-
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 6 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
| # | Exchange | Pair | Price | 24H Volume | % Volume |
|---|
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xDaB0d370...1DC703b1e The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
MpcBoringVault
Compiler Version
v0.8.25+commit.b61c2a91
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.25;
import { BoringVault, ERC20 } from "@boring-vault/src/base/BoringVault.sol";
import { MpcRecipient } from "../metatx/MpcRecipient.sol";
// TODO override some ERC20 approval too
contract MpcBoringVault is BoringVault, MpcRecipient {
constructor(
address _owner,
string memory _name,
string memory _symbol,
uint8 _decimals,
address _trustedForwarder
)
BoringVault(_owner, _name, _symbol, _decimals)
MpcRecipient(_trustedForwarder)
{ }
function _callBeforeTransfer(address from, address to) internal view virtual override {
if (address(hook) != address(0)) hook.beforeTransfer(from, to, _msgSender());
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
allowance[_msgSender()][spender] = amount;
emit Approval(_msgSender(), spender, amount);
return true;
}
function transfer(address to, uint256 amount) public virtual override returns (bool) {
_callBeforeTransfer(_msgSender(), to);
balanceOf[_msgSender()] -= amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(_msgSender(), to, amount);
return true;
}
function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
_callBeforeTransfer(from, to);
uint256 allowed = allowance[from][_msgSender()]; // Saves gas for limited approvals.
if (allowed != type(uint256).max) allowance[from][_msgSender()] = allowed - amount;
balanceOf[from] -= amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(from, to, amount);
return true;
}
modifier requiresAuth() virtual override {
require(isAuthorized(_msgSender(), msg.sig), "UNAUTHORIZED DELEGATE");
_;
}
function setTrustedForwarder(address forwarder) external requiresAuth {
_setTrustedForwarder(forwarder);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev _Available since v3.1._
*/
interface IERC1155Receiver is IERC165 {
/**
* @dev Handles the receipt of a single ERC1155 token type. This function is
* called at the end of a `safeTransferFrom` after the balance has been updated.
*
* NOTE: To accept the transfer, this must return
* `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
* (i.e. 0xf23a6e61, or its own function selector).
*
* @param operator The address which initiated the transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param id The ID of the token being transferred
* @param value The amount of tokens being transferred
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
/**
* @dev Handles the receipt of a multiple ERC1155 token types. This function
* is called at the end of a `safeBatchTransferFrom` after the balances have
* been updated.
*
* NOTE: To accept the transfer(s), this must return
* `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
* (i.e. 0xbc197c81, or its own function selector).
*
* @param operator The address which initiated the batch transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param ids An array containing ids of each token being transferred (order and length must match values array)
* @param values An array containing amounts of each token being transferred (order and length must match ids array)
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol)
pragma solidity ^0.8.0;
import "./ERC1155Receiver.sol";
/**
* Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens.
*
* IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be
* stuck.
*
* @dev _Available since v3.1._
*/
contract ERC1155Holder is ERC1155Receiver {
function onERC1155Received(
address,
address,
uint256,
uint256,
bytes memory
) public virtual override returns (bytes4) {
return this.onERC1155Received.selector;
}
function onERC1155BatchReceived(
address,
address,
uint256[] memory,
uint256[] memory,
bytes memory
) public virtual override returns (bytes4) {
return this.onERC1155BatchReceived.selector;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol)
pragma solidity ^0.8.0;
import "../IERC1155Receiver.sol";
import "../../../utils/introspection/ERC165.sol";
/**
* @dev _Available since v3.1._
*/
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
}
}// SPDX-License-Identifier: MIT
// 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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/utils/ERC721Holder.sol)
pragma solidity ^0.8.0;
import "../IERC721Receiver.sol";
/**
* @dev Implementation of the {IERC721Receiver} interface.
*
* Accepts all token transfers.
* Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
*/
contract ERC721Holder is IERC721Receiver {
/**
* @dev See {IERC721Receiver-onERC721Received}.
*
* Always returns `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) {
return this.onERC721Received.selector;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.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
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or 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 {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// 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);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @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;
}
}// SPDX-License-Identifier: MIT
// 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);
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.25;
import { Address } from "@openzeppelin/contracts/utils/Address.sol";
import { ERC721Holder } from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";
import { ERC1155Holder } from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";
import { FixedPointMathLib } from "@solmate/utils/FixedPointMathLib.sol";
import { SafeTransferLib } from "@solmate/utils/SafeTransferLib.sol";
import { ERC20 } from "@solmate/tokens/ERC20.sol";
import { BeforeTransferHook } from "../interfaces/BeforeTransferHook.sol";
import { Auth, Authority } from "@solmate/auth/Auth.sol";
contract BoringVault is ERC20, Auth, ERC721Holder, ERC1155Holder {
using Address for address;
using SafeTransferLib for ERC20;
using FixedPointMathLib for uint256;
// ========================================= STATE =========================================
/**
* @notice Contract responsbile for implementing `beforeTransfer`.
*/
BeforeTransferHook public hook;
//============================== EVENTS ===============================
event Enter(address indexed from, address indexed asset, uint256 amount, address indexed to, uint256 shares);
event Exit(address indexed to, address indexed asset, uint256 amount, address indexed from, uint256 shares);
//============================== CONSTRUCTOR ===============================
constructor(
address _owner,
string memory _name,
string memory _symbol,
uint8 _decimals
) ERC20(_name, _symbol, _decimals) Auth(_owner, Authority(address(0))) {}
//============================== MANAGE ===============================
/**
* @notice Allows manager to make an arbitrary function call from this contract.
* @dev Callable by MANAGER_ROLE.
*/
function manage(
address target,
bytes calldata data,
uint256 value
) external requiresAuth returns (bytes memory result) {
result = target.functionCallWithValue(data, value);
}
/**
* @notice Allows manager to make arbitrary function calls from this contract.
* @dev Callable by MANAGER_ROLE.
*/
function manage(
address[] calldata targets,
bytes[] calldata data,
uint256[] calldata values
) external requiresAuth returns (bytes[] memory results) {
uint256 targetsLength = targets.length;
results = new bytes[](targetsLength);
for (uint256 i; i < targetsLength; ++i) {
results[i] = targets[i].functionCallWithValue(data[i], values[i]);
}
}
//============================== ENTER ===============================
/**
* @notice Allows minter to mint shares, in exchange for assets.
* @dev If assetAmount is zero, no assets are transferred in.
* @dev Callable by MINTER_ROLE.
*/
function enter(
address from,
ERC20 asset,
uint256 assetAmount,
address to,
uint256 shareAmount
) external requiresAuth {
// Transfer assets in
if (assetAmount > 0) asset.safeTransferFrom(from, address(this), assetAmount);
// Mint shares.
_mint(to, shareAmount);
emit Enter(from, address(asset), assetAmount, to, shareAmount);
}
//============================== EXIT ===============================
/**
* @notice Allows burner to burn shares, in exchange for assets.
* @dev If assetAmount is zero, no assets are transferred out.
* @dev Callable by BURNER_ROLE.
*/
function exit(
address to,
ERC20 asset,
uint256 assetAmount,
address from,
uint256 shareAmount
) external requiresAuth {
// Burn shares.
_burn(from, shareAmount);
// Transfer assets out.
if (assetAmount > 0) asset.safeTransfer(to, assetAmount);
emit Exit(to, address(asset), assetAmount, from, shareAmount);
}
//============================== BEFORE TRANSFER HOOK ===============================
/**
* @notice Sets the share locker.
* @notice If set to zero address, the share locker logic is disabled.
* @dev Callable by OWNER_ROLE.
*/
function setBeforeTransferHook(address _hook) external requiresAuth {
hook = BeforeTransferHook(_hook);
}
/**
* @notice Call `beforeTransferHook` passing in `from` `to`, and `msg.sender`.
*/
function _callBeforeTransfer(address from, address to) internal view virtual {
if (address(hook) != address(0)) hook.beforeTransfer(from, to, msg.sender);
}
function transfer(address to, uint256 amount) public virtual override returns (bool) {
_callBeforeTransfer(msg.sender, to);
return super.transfer(to, amount);
}
function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
_callBeforeTransfer(from, to);
return super.transferFrom(from, to, amount);
}
//============================== RECEIVE ===============================
receive() external payable {}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.25;
interface BeforeTransferHook {
function beforeTransfer(address from, address to, address operator) external view;
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Provides a flexible and updatable auth pattern which is completely separate from application logic.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Auth.sol)
/// @author Modified from Dappsys (https://github.com/dapphub/ds-auth/blob/master/src/auth.sol)
abstract contract Auth {
event OwnershipTransferred(address indexed user, address indexed newOwner);
event AuthorityUpdated(address indexed user, Authority indexed newAuthority);
address public owner;
Authority public authority;
constructor(address _owner, Authority _authority) {
owner = _owner;
authority = _authority;
emit OwnershipTransferred(msg.sender, _owner);
emit AuthorityUpdated(msg.sender, _authority);
}
modifier requiresAuth() virtual {
require(isAuthorized(msg.sender, msg.sig), "UNAUTHORIZED");
_;
}
function isAuthorized(address user, bytes4 functionSig) internal view virtual returns (bool) {
Authority auth = authority; // Memoizing authority saves us a warm SLOAD, around 100 gas.
// Checking if the caller is the owner only after calling the authority saves gas in most cases, but be
// aware that this makes protected functions uncallable even to the owner if the authority is out of order.
return (address(auth) != address(0) && auth.canCall(user, address(this), functionSig)) || user == owner;
}
function setAuthority(Authority newAuthority) public virtual {
// We check if the caller is the owner first because we want to ensure they can
// always swap out the authority even if it's reverting or using up a lot of gas.
require(msg.sender == owner || authority.canCall(msg.sender, address(this), msg.sig));
authority = newAuthority;
emit AuthorityUpdated(msg.sender, newAuthority);
}
function transferOwnership(address newOwner) public virtual requiresAuth {
owner = newOwner;
emit OwnershipTransferred(msg.sender, newOwner);
}
}
/// @notice A generic interface for a contract which provides authorization data to an Auth instance.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Auth.sol)
/// @author Modified from Dappsys (https://github.com/dapphub/ds-auth/blob/master/src/auth.sol)
interface Authority {
function canCall(
address user,
address target,
bytes4 functionSig
) external view returns (bool);
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event Transfer(address indexed from, address indexed to, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 amount);
/*//////////////////////////////////////////////////////////////
METADATA STORAGE
//////////////////////////////////////////////////////////////*/
string public name;
string public symbol;
uint8 public immutable decimals;
/*//////////////////////////////////////////////////////////////
ERC20 STORAGE
//////////////////////////////////////////////////////////////*/
uint256 public totalSupply;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
/*//////////////////////////////////////////////////////////////
EIP-2612 STORAGE
//////////////////////////////////////////////////////////////*/
uint256 internal immutable INITIAL_CHAIN_ID;
bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;
mapping(address => uint256) public nonces;
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
constructor(
string memory _name,
string memory _symbol,
uint8 _decimals
) {
name = _name;
symbol = _symbol;
decimals = _decimals;
INITIAL_CHAIN_ID = block.chainid;
INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
}
/*//////////////////////////////////////////////////////////////
ERC20 LOGIC
//////////////////////////////////////////////////////////////*/
function approve(address spender, uint256 amount) public virtual returns (bool) {
allowance[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function transfer(address to, uint256 amount) public virtual returns (bool) {
balanceOf[msg.sender] -= amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(msg.sender, to, amount);
return true;
}
function transferFrom(
address from,
address to,
uint256 amount
) public virtual returns (bool) {
uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.
if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;
balanceOf[from] -= amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(from, to, amount);
return true;
}
/*//////////////////////////////////////////////////////////////
EIP-2612 LOGIC
//////////////////////////////////////////////////////////////*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public virtual {
require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");
// Unchecked because the only math done is incrementing
// the owner's nonce which cannot realistically overflow.
unchecked {
address recoveredAddress = ecrecover(
keccak256(
abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR(),
keccak256(
abi.encode(
keccak256(
"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
),
owner,
spender,
value,
nonces[owner]++,
deadline
)
)
)
),
v,
r,
s
);
require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");
allowance[recoveredAddress][spender] = value;
}
emit Approval(owner, spender, value);
}
function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
}
function computeDomainSeparator() internal view virtual returns (bytes32) {
return
keccak256(
abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(name)),
keccak256("1"),
block.chainid,
address(this)
)
);
}
/*//////////////////////////////////////////////////////////////
INTERNAL MINT/BURN LOGIC
//////////////////////////////////////////////////////////////*/
function _mint(address to, uint256 amount) internal virtual {
totalSupply += amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(address(0), to, amount);
}
function _burn(address from, uint256 amount) internal virtual {
balanceOf[from] -= amount;
// Cannot underflow because a user's balance
// will never be larger than the total supply.
unchecked {
totalSupply -= amount;
}
emit Transfer(from, address(0), amount);
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Arithmetic library with operations for fixed-point numbers.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol)
/// @author Inspired by USM (https://github.com/usmfum/USM/blob/master/contracts/WadMath.sol)
library FixedPointMathLib {
/*//////////////////////////////////////////////////////////////
SIMPLIFIED FIXED POINT OPERATIONS
//////////////////////////////////////////////////////////////*/
uint256 internal constant MAX_UINT256 = 2**256 - 1;
uint256 internal constant WAD = 1e18; // The scalar of ETH and most ERC20s.
function mulWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
return mulDivDown(x, y, WAD); // Equivalent to (x * y) / WAD rounded down.
}
function mulWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
return mulDivUp(x, y, WAD); // Equivalent to (x * y) / WAD rounded up.
}
function divWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
return mulDivDown(x, WAD, y); // Equivalent to (x * WAD) / y rounded down.
}
function divWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
return mulDivUp(x, WAD, y); // Equivalent to (x * WAD) / y rounded up.
}
/*//////////////////////////////////////////////////////////////
LOW LEVEL FIXED POINT OPERATIONS
//////////////////////////////////////////////////////////////*/
function mulDivDown(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 z) {
/// @solidity memory-safe-assembly
assembly {
// Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
revert(0, 0)
}
// Divide x * y by the denominator.
z := div(mul(x, y), denominator)
}
}
function mulDivUp(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 z) {
/// @solidity memory-safe-assembly
assembly {
// Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
revert(0, 0)
}
// If x * y modulo the denominator is strictly greater than 0,
// 1 is added to round up the division of x * y by the denominator.
z := add(gt(mod(mul(x, y), denominator), 0), div(mul(x, y), denominator))
}
}
function rpow(
uint256 x,
uint256 n,
uint256 scalar
) internal pure returns (uint256 z) {
/// @solidity memory-safe-assembly
assembly {
switch x
case 0 {
switch n
case 0 {
// 0 ** 0 = 1
z := scalar
}
default {
// 0 ** n = 0
z := 0
}
}
default {
switch mod(n, 2)
case 0 {
// If n is even, store scalar in z for now.
z := scalar
}
default {
// If n is odd, store x in z for now.
z := x
}
// Shifting right by 1 is like dividing by 2.
let half := shr(1, scalar)
for {
// Shift n right by 1 before looping to halve it.
n := shr(1, n)
} n {
// Shift n right by 1 each iteration to halve it.
n := shr(1, n)
} {
// Revert immediately if x ** 2 would overflow.
// Equivalent to iszero(eq(div(xx, x), x)) here.
if shr(128, x) {
revert(0, 0)
}
// Store x squared.
let xx := mul(x, x)
// Round to the nearest number.
let xxRound := add(xx, half)
// Revert if xx + half overflowed.
if lt(xxRound, xx) {
revert(0, 0)
}
// Set x to scaled xxRound.
x := div(xxRound, scalar)
// If n is even:
if mod(n, 2) {
// Compute z * x.
let zx := mul(z, x)
// If z * x overflowed:
if iszero(eq(div(zx, x), z)) {
// Revert if x is non-zero.
if iszero(iszero(x)) {
revert(0, 0)
}
}
// Round to the nearest number.
let zxRound := add(zx, half)
// Revert if zx + half overflowed.
if lt(zxRound, zx) {
revert(0, 0)
}
// Return properly scaled zxRound.
z := div(zxRound, scalar)
}
}
}
}
}
/*//////////////////////////////////////////////////////////////
GENERAL NUMBER UTILITIES
//////////////////////////////////////////////////////////////*/
function sqrt(uint256 x) internal pure returns (uint256 z) {
/// @solidity memory-safe-assembly
assembly {
let y := x // We start y at x, which will help us make our initial estimate.
z := 181 // The "correct" value is 1, but this saves a multiplication later.
// This segment is to get a reasonable initial estimate for the Babylonian method. With a bad
// start, the correct # of bits increases ~linearly each iteration instead of ~quadratically.
// We check y >= 2^(k + 8) but shift right by k bits
// each branch to ensure that if x >= 256, then y >= 256.
if iszero(lt(y, 0x10000000000000000000000000000000000)) {
y := shr(128, y)
z := shl(64, z)
}
if iszero(lt(y, 0x1000000000000000000)) {
y := shr(64, y)
z := shl(32, z)
}
if iszero(lt(y, 0x10000000000)) {
y := shr(32, y)
z := shl(16, z)
}
if iszero(lt(y, 0x1000000)) {
y := shr(16, y)
z := shl(8, z)
}
// Goal was to get z*z*y within a small factor of x. More iterations could
// get y in a tighter range. Currently, we will have y in [256, 256*2^16).
// We ensured y >= 256 so that the relative difference between y and y+1 is small.
// That's not possible if x < 256 but we can just verify those cases exhaustively.
// Now, z*z*y <= x < z*z*(y+1), and y <= 2^(16+8), and either y >= 256, or x < 256.
// Correctness can be checked exhaustively for x < 256, so we assume y >= 256.
// Then z*sqrt(y) is within sqrt(257)/sqrt(256) of sqrt(x), or about 20bps.
// For s in the range [1/256, 256], the estimate f(s) = (181/1024) * (s+1) is in the range
// (1/2.84 * sqrt(s), 2.84 * sqrt(s)), with largest error when s = 1 and when s = 256 or 1/256.
// Since y is in [256, 256*2^16), let a = y/65536, so that a is in [1/256, 256). Then we can estimate
// sqrt(y) using sqrt(65536) * 181/1024 * (a + 1) = 181/4 * (y + 65536)/65536 = 181 * (y + 65536)/2^18.
// There is no overflow risk here since y < 2^136 after the first branch above.
z := shr(18, mul(z, add(y, 65536))) // A mul() is saved from starting z at 181.
// Given the worst case multiplicative error of 2.84 above, 7 iterations should be enough.
z := shr(1, add(z, div(x, z)))
z := shr(1, add(z, div(x, z)))
z := shr(1, add(z, div(x, z)))
z := shr(1, add(z, div(x, z)))
z := shr(1, add(z, div(x, z)))
z := shr(1, add(z, div(x, z)))
z := shr(1, add(z, div(x, z)))
// If x+1 is a perfect square, the Babylonian method cycles between
// floor(sqrt(x)) and ceil(sqrt(x)). This statement ensures we return floor.
// See: https://en.wikipedia.org/wiki/Integer_square_root#Using_only_integer_division
// Since the ceil is rare, we save gas on the assignment and repeat division in the rare case.
// If you don't care whether the floor or ceil square root is returned, you can remove this statement.
z := sub(z, lt(div(x, z), z))
}
}
function unsafeMod(uint256 x, uint256 y) internal pure returns (uint256 z) {
/// @solidity memory-safe-assembly
assembly {
// Mod x by y. Note this will return
// 0 instead of reverting if y is zero.
z := mod(x, y)
}
}
function unsafeDiv(uint256 x, uint256 y) internal pure returns (uint256 r) {
/// @solidity memory-safe-assembly
assembly {
// Divide x by y. Note this will return
// 0 instead of reverting if y is zero.
r := div(x, y)
}
}
function unsafeDivUp(uint256 x, uint256 y) internal pure returns (uint256 z) {
/// @solidity memory-safe-assembly
assembly {
// Add 1 to x * y if x % y > 0. Note this will
// return 0 instead of reverting if y is zero.
z := add(gt(mod(x, y), 0), div(x, y))
}
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
import {ERC20} from "../tokens/ERC20.sol";
/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
library SafeTransferLib {
/*//////////////////////////////////////////////////////////////
ETH OPERATIONS
//////////////////////////////////////////////////////////////*/
function safeTransferETH(address to, uint256 amount) internal {
bool success;
/// @solidity memory-safe-assembly
assembly {
// Transfer the ETH and store if it succeeded or not.
success := call(gas(), to, amount, 0, 0, 0, 0)
}
require(success, "ETH_TRANSFER_FAILED");
}
/*//////////////////////////////////////////////////////////////
ERC20 OPERATIONS
//////////////////////////////////////////////////////////////*/
function safeTransferFrom(
ERC20 token,
address from,
address to,
uint256 amount
) internal {
bool success;
/// @solidity memory-safe-assembly
assembly {
// Get a pointer to some free memory.
let freeMemoryPointer := mload(0x40)
// Write the abi-encoded calldata into memory, beginning with the function selector.
mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "from" argument.
mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.
// We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
// We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
success := call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
// Set success to whether the call reverted, if not we check it either
// returned exactly 1 (can't just be non-zero data), or had no return data and token has code.
if and(iszero(and(eq(mload(0), 1), gt(returndatasize(), 31))), success) {
success := iszero(or(iszero(extcodesize(token)), returndatasize()))
}
}
require(success, "TRANSFER_FROM_FAILED");
}
function safeTransfer(
ERC20 token,
address to,
uint256 amount
) internal {
bool success;
/// @solidity memory-safe-assembly
assembly {
// Get a pointer to some free memory.
let freeMemoryPointer := mload(0x40)
// Write the abi-encoded calldata into memory, beginning with the function selector.
mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.
// We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
// We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
success := call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
// Set success to whether the call reverted, if not we check it either
// returned exactly 1 (can't just be non-zero data), or had no return data and token has code.
if and(iszero(and(eq(mload(0), 1), gt(returndatasize(), 31))), success) {
success := iszero(or(iszero(extcodesize(token)), returndatasize()))
}
}
require(success, "TRANSFER_FAILED");
}
function safeApprove(
ERC20 token,
address to,
uint256 amount
) internal {
bool success;
/// @solidity memory-safe-assembly
assembly {
// Get a pointer to some free memory.
let freeMemoryPointer := mload(0x40)
// Write the abi-encoded calldata into memory, beginning with the function selector.
mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.
// We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
// We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
success := call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
// Set success to whether the call reverted, if not we check it either
// returned exactly 1 (can't just be non-zero data), or had no return data and token has code.
if and(iszero(and(eq(mload(0), 1), gt(returndatasize(), 31))), success) {
success := iszero(or(iszero(extcodesize(token)), returndatasize()))
}
}
require(success, "APPROVE_FAILED");
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;
interface IERC2771Recipient {
/// @notice OZ convention: does this recipient trust `forwarder`?
function isTrustedForwarder(address forwarder) external view returns (bool);
}// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.25;
import { IERC2771Recipient } from "../interfaces/IERC2771Recipient.sol";
/// @notice A minimal ERC-2771 receiver that trusts one forwarder
abstract contract MpcRecipient is IERC2771Recipient {
address public trustedForwarder;
event TrustedForwarderUpdated(address indexed oldForwarder, address indexed newForwarder);
constructor(address _trustedForwarder) {
trustedForwarder = _trustedForwarder;
}
/// @notice ERC-2771: only this forwarder is allowed
function isTrustedForwarder(address forwarder) public view override returns (bool) {
return forwarder == trustedForwarder;
}
/// @dev If the call came through the forwarder, strip off the last 20 bytes
function _msgSender() internal view virtual returns (address sender) {
if (msg.data.length >= 20 && isTrustedForwarder(msg.sender)) {
// extract sender from the end of msg.data
assembly {
sender := shr(96, calldataload(sub(calldatasize(), 20)))
}
} else {
sender = msg.sender;
}
}
/// @dev If the call came through the forwarder, strip off the last 20 bytes
function _msgData() internal view virtual returns (bytes calldata) {
if (msg.data.length >= 20 && isTrustedForwarder(msg.sender)) {
return msg.data[:msg.data.length - 20];
} else {
return msg.data;
}
}
function _setTrustedForwarder(address forwarder) internal virtual {
address oldForwarder = trustedForwarder;
trustedForwarder = forwarder;
emit TrustedForwarderUpdated(oldForwarder, forwarder);
}
}{
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"runs": 10000,
"enabled": true
},
"evmVersion": "cancun",
"remappings": [
"@axelar-network/=node_modules/@axelar-network/",
"@boring-vault/=node_modules/boring-vault/",
"@ccip/=node_modules/boring-vault/lib/ccip/",
"@chainlink/=node_modules/@chainlink/",
"@eigenlayer-contracts/=node_modules/eigenlayer-contracts/src/contracts/",
"@forge-std/=node_modules/forge-std/src/",
"@layerzerolabs-lz-evm-messagelib-v2/=node_modules/@layerzerolabs/lz-evm-messagelib-v2/",
"@layerzerolabs-lz-evm-protocol-v2/=node_modules/@layerzerolabs/lz-evm-protocol-v2/",
"@layerzerolabs/devtools/=node_modules/@layerzerolabs-devtools-v2/packages/",
"@layerzerolabs/lz-evm-messagelib-v2/=node_modules/@layerzerolabs/lz-evm-messagelib-v2/",
"@layerzerolabs/lz-evm-oapp-v2/=node_modules/@layerzerolabs/lz-evm-oapp-v2/",
"@layerzerolabs/lz-evm-protocol-v2/=node_modules/@layerzerolabs/lz-evm-protocol-v2/",
"@layerzerolabs/lz-evm-v1-0.7/=node_modules/@layerzerolabs/lz-evm-v1-0.7/",
"@layerzerolabs/oapp/=node_modules/@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/",
"@layerzerolabs/test-devtools/=node_modules/@layerzerolabs/test-devtools-evm-foundry/contracts/",
"@lz-oapp-evm/=node_modules/@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/",
"@lz-oapp-evm2/=lib/LayerZero-V2/packages/layerzero-v2/evm/oapp/contracts/oapp/",
"@oapp-auth/=node_modules/boring-vault/lib/OAppAuth/src/",
"@openzeppelin-contracts-upgradeable/=node_modules/@openzeppelin-v4/contracts-upgradeable/",
"@openzeppelin-contracts/=node_modules/@openzeppelin-v4/contracts/",
"@openzeppelin-upgrades-v4.9.0/=node_modules/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/",
"@openzeppelin-upgrades/contracts/=node_modules/@openzeppelin-v4/contracts-upgradeable/",
"@openzeppelin-v4.9.0/=node_modules/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/",
"@openzeppelin-v4/=node_modules/@openzeppelin-v4/",
"@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin-v4/contracts-upgradeable/",
"@openzeppelin/contracts/=node_modules/@openzeppelin-v4/contracts/",
"@pyth-sdk/=node_modules/@pythnetwork/pyth-sdk-solidity/",
"@sbu/=node_modules/solidity-bytes-utils/",
"@solady/=node_modules/solady/src/",
"@solmate/=node_modules/solmate/src/",
"@uniswap/=node_modules/@uniswap/",
"@wormhole-solidity-sdk/=node_modules/@wormhole/solidity-sdk/src/",
"@wormhole/=node_modules/wormhole/relayer/ethereum/contracts/",
"IERC20/=node_modules/@wormhole/solidity-sdk/src/interfaces/token/",
"base64-sol/=node_modules/base64-sol/",
"ds-test/=node_modules/ds-test/",
"eigenlayer-contracts/=node_modules/eigenlayer-contracts/",
"forge-std/=node_modules/forge-std/src/",
"hardhat-deploy/=node_modules/hardhat-deploy/",
"hardhat/=node_modules/hardhat/",
"lib/openzeppelin-contracts/=node_modules/boring-vault/lib/openzeppelin-contracts/",
"solady/=node_modules/solady/",
"solidity-bytes-utils/=node_modules/solidity-bytes-utils/",
"wormhole-sdk/=node_modules/@wormhole/solidity-sdk/src/"
],
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"address","name":"_trustedForwarder","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"contract Authority","name":"newAuthority","type":"address"}],"name":"AuthorityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Enter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Exit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldForwarder","type":"address"},{"indexed":true,"internalType":"address","name":"newForwarder","type":"address"}],"name":"TrustedForwarderUpdated","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"authority","outputs":[{"internalType":"contract Authority","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"contract ERC20","name":"asset","type":"address"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"shareAmount","type":"uint256"}],"name":"enter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"contract ERC20","name":"asset","type":"address"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"shareAmount","type":"uint256"}],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hook","outputs":[{"internalType":"contract BeforeTransferHook","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"manage","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"manage","outputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Authority","name":"newAuthority","type":"address"}],"name":"setAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hook","type":"address"}],"name":"setBeforeTransferHook","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"setTrustedForwarder","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trustedForwarder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
0x60e060405234801561000f575f80fd5b506040516129b43803806129b483398101604081905261002e9161027a565b8085858585835f848484836100438482610395565b5060016100508382610395565b5060ff81166080524660a05261006461012b565b60c0525050600680546001600160a01b038086166001600160a01b03199283168117909355600780549186169190921617905560405190915033907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a36040516001600160a01b0382169033907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a35050600980546001600160a01b0319166001600160a01b039690961695909517909455506104c6975050505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161015b9190610454565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b80516001600160a01b03811681146101d9575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610201575f80fd5b81516001600160401b038082111561021b5761021b6101de565b604051601f8301601f19908116603f01168101908282118183101715610243576102436101de565b8160405283815286602085880101111561025b575f80fd5b8360208701602083015e5f602085830101528094505050505092915050565b5f805f805f60a0868803121561028e575f80fd5b610297866101c3565b60208701519095506001600160401b03808211156102b3575f80fd5b6102bf89838a016101f2565b955060408801519150808211156102d4575f80fd5b506102e1888289016101f2565b935050606086015160ff811681146102f7575f80fd5b9150610305608087016101c3565b90509295509295909350565b600181811c9082168061032557607f821691505b60208210810361034357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561039057805f5260205f20601f840160051c8101602085101561036e5750805b601f840160051c820191505b8181101561038d575f815560010161037a565b50505b505050565b81516001600160401b038111156103ae576103ae6101de565b6103c2816103bc8454610311565b84610349565b602080601f8311600181146103f5575f84156103de5750858301515b5f19600386901b1c1916600185901b17855561044c565b5f85815260208120601f198616915b8281101561042357888601518255948401946001909101908401610404565b508582101561044057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f80835461046181610311565b60018281168015610479576001811461048e576104ba565b60ff19841687528215158302870194506104ba565b875f526020805f205f5b858110156104b15781548a820152908401908201610498565b50505082870194505b50929695505050505050565b60805160a05160c0516124c46104f05f395f610c5701525f610c2201525f61032c01526124c45ff3fe6080604052600436106101bd575f3560e01c80637da0a877116100f2578063bc197c8111610092578063dd62ed3e11610062578063dd62ed3e1461059e578063f23a6e61146105d4578063f2fde38b14610618578063f6e715d014610637575f80fd5b8063bc197c81146104fd578063bf7e214f14610541578063d505accf14610560578063da7422281461057f575f80fd5b80638929565f116100cd5780638929565f1461048c5780638da5cb5b146104ab57806395d89b41146104ca578063a9059cbb146104de575f80fd5b80637da0a8771461040b5780637ecebe00146104425780637f5a7c7b1461046d575f80fd5b806323b872dd1161015d57806339d6ba321161013857806339d6ba3214610374578063572b6c051461039357806370a08231146103c15780637a9e5e4b146103ec575f80fd5b806323b872dd146102fc578063313ce5671461031b5780633644e51514610360575f80fd5b8063150b7a0211610198578063150b7a021461023c57806318160ddd1461028c57806318457e61146102af578063224d8703146102d0575f80fd5b806301ffc9a7146101c857806306fdde03146101fc578063095ea7b31461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611b25565b610656565b60405190151581526020015b60405180910390f35b348015610207575f80fd5b506102106106ee565b6040516101f39190611bb7565b348015610228575f80fd5b506101e7610237366004611bdd565b610779565b348015610247575f80fd5b5061025b610256366004611d0d565b610808565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101f3565b348015610297575f80fd5b506102a160025481565b6040519081526020016101f3565b3480156102ba575f80fd5b506102ce6102c9366004611d75565b610832565b005b3480156102db575f80fd5b506102ef6102ea366004611e14565b610942565b6040516101f39190611ea7565b348015610307575f80fd5b506101e7610316366004611f27565b610ad3565b348015610326575f80fd5b5061034e7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016101f3565b34801561036b575f80fd5b506102a1610c1f565b34801561037f575f80fd5b506102ce61038e366004611d75565b610c79565b34801561039e575f80fd5b506101e76103ad366004611f65565b6009546001600160a01b0391821691161490565b3480156103cc575f80fd5b506102a16103db366004611f65565b60036020525f908152604090205481565b3480156103f7575f80fd5b506102ce610406366004611f65565b610d4d565b348015610416575f80fd5b5060095461042a906001600160a01b031681565b6040516001600160a01b0390911681526020016101f3565b34801561044d575f80fd5b506102a161045c366004611f65565b60056020525f908152604090205481565b348015610478575f80fd5b5060085461042a906001600160a01b031681565b348015610497575f80fd5b506102ce6104a6366004611f65565b610e7e565b3480156104b6575f80fd5b5060065461042a906001600160a01b031681565b3480156104d5575f80fd5b50610210610f0f565b3480156104e9575f80fd5b506101e76104f8366004611bdd565b610f1c565b348015610508575f80fd5b5061025b610517366004611ff2565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561054c575f80fd5b5060075461042a906001600160a01b031681565b34801561056b575f80fd5b506102ce61057a366004612099565b610fcb565b34801561058a575f80fd5b506102ce610599366004611f65565b61126f565b3480156105a9575f80fd5b506102a16105b836600461210a565b600460209081525f928352604080842090915290825290205481565b3480156105df575f80fd5b5061025b6105ee366004612141565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b348015610623575f80fd5b506102ce610632366004611f65565b6112d2565b348015610642575f80fd5b506102106106513660046121a5565b61138c565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806106e857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f80546106fa90612229565b80601f016020809104026020016040519081016040528092919081815260200182805461072690612229565b80156107715780601f1061074857610100808354040283529160200191610771565b820191905f5260205f20905b81548152906001019060200180831161075457829003601f168201915b505050505081565b5f8160045f610786611438565b6001600160a01b03908116825260208083019390935260409182015f908120918816808252919093529120919091556107bd611438565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516107f791815260200190565b60405180910390a350600192915050565b7f150b7a02000000000000000000000000000000000000000000000000000000005b949350505050565b61086661083d611438565b5f357fffffffff0000000000000000000000000000000000000000000000000000000016611489565b6108b75760405162461bcd60e51b815260206004820152601560248201527f554e415554484f52495a45442044454c4547415445000000000000000000000060448201526064015b60405180910390fd5b6108c1828261156f565b82156108db576108db6001600160a01b03851686856115e9565b816001600160a01b0316846001600160a01b0316866001600160a01b03167fe0c82280a1164680e0cf43be7db4c4c9f985423623ad7a544fb76c772bdc60438685604051610933929190918252602082015260400190565b60405180910390a45050505050565b606061094f61083d611438565b61099b5760405162461bcd60e51b815260206004820152601560248201527f554e415554484f52495a45442044454c4547415445000000000000000000000060448201526064016108ae565b858067ffffffffffffffff8111156109b5576109b5611c07565b6040519080825280602002602001820160405280156109e857816020015b60608152602001906001900390816109d35790505b5091505f5b81811015610ac757610aa2878783818110610a0a57610a0a61227a565b9050602002810190610a1c91906122a7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250899250889150859050818110610a6457610a6461227a565b905060200201358b8b85818110610a7d57610a7d61227a565b9050602002016020810190610a929190611f65565b6001600160a01b0316919061169f565b838281518110610ab457610ab461227a565b60209081029190910101526001016109ed565b50509695505050505050565b5f610ade84846116c5565b6001600160a01b0384165f90815260046020526040812081610afe611438565b6001600160a01b03166001600160a01b031681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610b8b57610b518382612335565b6001600160a01b0386165f90815260046020526040812090610b71611438565b6001600160a01b0316815260208101919091526040015f20555b6001600160a01b0385165f9081526003602052604081208054859290610bb2908490612335565b90915550506001600160a01b038085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610c0c9087815260200190565b60405180910390a3506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610c5457610c4f611771565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b610c8461083d611438565b610cd05760405162461bcd60e51b815260206004820152601560248201527f554e415554484f52495a45442044454c4547415445000000000000000000000060448201526064016108ae565b8215610ceb57610ceb6001600160a01b038516863086611809565b610cf582826118cf565b816001600160a01b0316846001600160a01b0316866001600160a01b03167fea00f88768a86184a6e515238a549c171769fe7460a011d6fd0bcd48ca078ea48685604051610933929190918252602082015260400190565b6006546001600160a01b0316331480610e1357506007546040517fb70096130000000000000000000000000000000000000000000000000000000081523360048201523060248201525f357fffffffff000000000000000000000000000000000000000000000000000000001660448201526001600160a01b039091169063b700961390606401602060405180830381865afa158015610def573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e139190612348565b610e1b575f80fd5b600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811790915560405133907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a350565b610e8961083d611438565b610ed55760405162461bcd60e51b815260206004820152601560248201527f554e415554484f52495a45442044454c4547415445000000000000000000000060448201526064016108ae565b600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600180546106fa90612229565b5f610f2e610f28611438565b846116c5565b8160035f610f3a611438565b6001600160a01b03166001600160a01b031681526020019081526020015f205f828254610f679190612335565b90915550506001600160a01b0383165f818152600360205260409020805484019055610f91611438565b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516107f791815260200190565b4284101561101b5760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064016108ae565b5f6001611026610c1f565b6001600160a01b038a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611167573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b038116158015906111bb5750876001600160a01b0316816001600160a01b0316145b6112075760405162461bcd60e51b815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016108ae565b6001600160a01b039081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b61127a61083d611438565b6112c65760405162461bcd60e51b815260206004820152601560248201527f554e415554484f52495a45442044454c4547415445000000000000000000000060448201526064016108ae565b6112cf81611931565b50565b6112dd61083d611438565b6113295760405162461bcd60e51b815260206004820152601560248201527f554e415554484f52495a45442044454c4547415445000000000000000000000060448201526064016108ae565b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b606061139961083d611438565b6113e55760405162461bcd60e51b815260206004820152601560248201527f554e415554484f52495a45442044454c4547415445000000000000000000000060448201526064016108ae565b61142f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050506001600160a01b0388169190508461169f565b95945050505050565b5f6014361080159061145457506009546001600160a01b031633145b1561148457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b503390565b6007545f906001600160a01b0316801580159061155057506040517fb70096130000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301523060248301527fffffffff000000000000000000000000000000000000000000000000000000008516604483015282169063b700961390606401602060405180830381865afa15801561152c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115509190612348565b8061082a57506006546001600160a01b03858116911614949350505050565b6001600160a01b0382165f9081526003602052604081208054839290611596908490612335565b90915550506002805482900390556040518181525f906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b5f6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015282602482015260205f6044835f895af191505080601f3d1160015f51141615161561164c5750823b153d17155b806116995760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016108ae565b50505050565b606061082a8484846040518060600160405280602981526020016124666029913961199a565b6008546001600160a01b03161561176d576008546001600160a01b031663abd626b083836116f1611438565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152918316602483015290911660448201526064015f6040518083038186803b158015611756575f80fd5b505afa158015611768573d5f803e3d5ffd5b505050505b5050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516117a19190612367565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526001600160a01b038416602482015282604482015260205f6064835f8a5af191505080601f3d1160015f51141615161561187b5750833b153d17155b806118c85760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016108ae565b5050505050565b8060025f8282546118e0919061243c565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016115dd565b600980546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f06710129fbc2650f48c82631edcea255e102cd5e17c444deb7273855cfb5e77d905f90a35050565b606082471015611a125760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016108ae565b5f80866001600160a01b03168587604051611a2d919061244f565b5f6040518083038185875af1925050503d805f8114611a67576040519150601f19603f3d011682016040523d82523d5f602084013e611a6c565b606091505b5091509150611a7d87838387611a88565b979650505050505050565b60608315611af65782515f03611aef576001600160a01b0385163b611aef5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108ae565b508161082a565b61082a8383815115611b0b5781518083602001fd5b8060405162461bcd60e51b81526004016108ae9190611bb7565b5f60208284031215611b35575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611b64575f80fd5b9392505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f611b646020830184611b6b565b6001600160a01b03811681146112cf575f80fd5b5f8060408385031215611bee575f80fd5b8235611bf981611bc9565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611c7b57611c7b611c07565b604052919050565b5f82601f830112611c92575f80fd5b813567ffffffffffffffff811115611cac57611cac611c07565b611cdd60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611c34565b818152846020838601011115611cf1575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611d20575f80fd5b8435611d2b81611bc9565b93506020850135611d3b81611bc9565b925060408501359150606085013567ffffffffffffffff811115611d5d575f80fd5b611d6987828801611c83565b91505092959194509250565b5f805f805f60a08688031215611d89575f80fd5b8535611d9481611bc9565b94506020860135611da481611bc9565b9350604086013592506060860135611dbb81611bc9565b949793965091946080013592915050565b5f8083601f840112611ddc575f80fd5b50813567ffffffffffffffff811115611df3575f80fd5b6020830191508360208260051b8501011115611e0d575f80fd5b9250929050565b5f805f805f8060608789031215611e29575f80fd5b863567ffffffffffffffff80821115611e40575f80fd5b611e4c8a838b01611dcc565b90985096506020890135915080821115611e64575f80fd5b611e708a838b01611dcc565b90965094506040890135915080821115611e88575f80fd5b50611e9589828a01611dcc565b979a9699509497509295939492505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b82811015611f1a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452611f08858351611b6b565b94509285019290850190600101611ece565b5092979650505050505050565b5f805f60608486031215611f39575f80fd5b8335611f4481611bc9565b92506020840135611f5481611bc9565b929592945050506040919091013590565b5f60208284031215611f75575f80fd5b8135611b6481611bc9565b5f82601f830112611f8f575f80fd5b8135602067ffffffffffffffff821115611fab57611fab611c07565b8160051b611fba828201611c34565b9283528481018201928281019087851115611fd3575f80fd5b83870192505b84831015611a7d57823582529183019190830190611fd9565b5f805f805f60a08688031215612006575f80fd5b853561201181611bc9565b9450602086013561202181611bc9565b9350604086013567ffffffffffffffff8082111561203d575f80fd5b61204989838a01611f80565b9450606088013591508082111561205e575f80fd5b61206a89838a01611f80565b9350608088013591508082111561207f575f80fd5b5061208c88828901611c83565b9150509295509295909350565b5f805f805f805f60e0888a0312156120af575f80fd5b87356120ba81611bc9565b965060208801356120ca81611bc9565b95506040880135945060608801359350608088013560ff811681146120ed575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f806040838503121561211b575f80fd5b823561212681611bc9565b9150602083013561213681611bc9565b809150509250929050565b5f805f805f60a08688031215612155575f80fd5b853561216081611bc9565b9450602086013561217081611bc9565b93506040860135925060608601359150608086013567ffffffffffffffff811115612199575f80fd5b61208c88828901611c83565b5f805f80606085870312156121b8575f80fd5b84356121c381611bc9565b9350602085013567ffffffffffffffff808211156121df575f80fd5b818701915087601f8301126121f2575f80fd5b813581811115612200575f80fd5b886020828501011115612211575f80fd5b95986020929092019750949560400135945092505050565b600181811c9082168061223d57607f821691505b602082108103612274577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126122da575f80fd5b83018035915067ffffffffffffffff8211156122f4575f80fd5b602001915036819003821315611e0d575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156106e8576106e8612308565b5f60208284031215612358575f80fd5b81518015158114611b64575f80fd5b5f8083545f60018260011c9150600183168061238457607f831692505b602080841082036123bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b8180156123d057600181146124035761242e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616895284151585028901965061242e565b5f8a8152602090205f5b868110156124265781548b82015290850190830161240d565b505084890196505b509498975050505050505050565b808201808211156106e8576106e8612308565b5f82518060208501845e5f92019182525091905056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a264697066735822122075043171e4acfec8ecca490f57bc1a821658e55573425b38497fd44d57dbf07364736f6c63430008190033000000000000000000000000228c15b182ca5183970104243320c54e9904b86000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000006000000000000000000000000a244d872444e408421523298bc466e11011bbdec00000000000000000000000000000000000000000000000000000000000000074d6f72655852500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074d6f726558525000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101bd575f3560e01c80637da0a877116100f2578063bc197c8111610092578063dd62ed3e11610062578063dd62ed3e1461059e578063f23a6e61146105d4578063f2fde38b14610618578063f6e715d014610637575f80fd5b8063bc197c81146104fd578063bf7e214f14610541578063d505accf14610560578063da7422281461057f575f80fd5b80638929565f116100cd5780638929565f1461048c5780638da5cb5b146104ab57806395d89b41146104ca578063a9059cbb146104de575f80fd5b80637da0a8771461040b5780637ecebe00146104425780637f5a7c7b1461046d575f80fd5b806323b872dd1161015d57806339d6ba321161013857806339d6ba3214610374578063572b6c051461039357806370a08231146103c15780637a9e5e4b146103ec575f80fd5b806323b872dd146102fc578063313ce5671461031b5780633644e51514610360575f80fd5b8063150b7a0211610198578063150b7a021461023c57806318160ddd1461028c57806318457e61146102af578063224d8703146102d0575f80fd5b806301ffc9a7146101c857806306fdde03146101fc578063095ea7b31461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611b25565b610656565b60405190151581526020015b60405180910390f35b348015610207575f80fd5b506102106106ee565b6040516101f39190611bb7565b348015610228575f80fd5b506101e7610237366004611bdd565b610779565b348015610247575f80fd5b5061025b610256366004611d0d565b610808565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101f3565b348015610297575f80fd5b506102a160025481565b6040519081526020016101f3565b3480156102ba575f80fd5b506102ce6102c9366004611d75565b610832565b005b3480156102db575f80fd5b506102ef6102ea366004611e14565b610942565b6040516101f39190611ea7565b348015610307575f80fd5b506101e7610316366004611f27565b610ad3565b348015610326575f80fd5b5061034e7f000000000000000000000000000000000000000000000000000000000000000681565b60405160ff90911681526020016101f3565b34801561036b575f80fd5b506102a1610c1f565b34801561037f575f80fd5b506102ce61038e366004611d75565b610c79565b34801561039e575f80fd5b506101e76103ad366004611f65565b6009546001600160a01b0391821691161490565b3480156103cc575f80fd5b506102a16103db366004611f65565b60036020525f908152604090205481565b3480156103f7575f80fd5b506102ce610406366004611f65565b610d4d565b348015610416575f80fd5b5060095461042a906001600160a01b031681565b6040516001600160a01b0390911681526020016101f3565b34801561044d575f80fd5b506102a161045c366004611f65565b60056020525f908152604090205481565b348015610478575f80fd5b5060085461042a906001600160a01b031681565b348015610497575f80fd5b506102ce6104a6366004611f65565b610e7e565b3480156104b6575f80fd5b5060065461042a906001600160a01b031681565b3480156104d5575f80fd5b50610210610f0f565b3480156104e9575f80fd5b506101e76104f8366004611bdd565b610f1c565b348015610508575f80fd5b5061025b610517366004611ff2565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561054c575f80fd5b5060075461042a906001600160a01b031681565b34801561056b575f80fd5b506102ce61057a366004612099565b610fcb565b34801561058a575f80fd5b506102ce610599366004611f65565b61126f565b3480156105a9575f80fd5b506102a16105b836600461210a565b600460209081525f928352604080842090915290825290205481565b3480156105df575f80fd5b5061025b6105ee366004612141565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b348015610623575f80fd5b506102ce610632366004611f65565b6112d2565b348015610642575f80fd5b506102106106513660046121a5565b61138c565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806106e857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f80546106fa90612229565b80601f016020809104026020016040519081016040528092919081815260200182805461072690612229565b80156107715780601f1061074857610100808354040283529160200191610771565b820191905f5260205f20905b81548152906001019060200180831161075457829003601f168201915b505050505081565b5f8160045f610786611438565b6001600160a01b03908116825260208083019390935260409182015f908120918816808252919093529120919091556107bd611438565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516107f791815260200190565b60405180910390a350600192915050565b7f150b7a02000000000000000000000000000000000000000000000000000000005b949350505050565b61086661083d611438565b5f357fffffffff0000000000000000000000000000000000000000000000000000000016611489565b6108b75760405162461bcd60e51b815260206004820152601560248201527f554e415554484f52495a45442044454c4547415445000000000000000000000060448201526064015b60405180910390fd5b6108c1828261156f565b82156108db576108db6001600160a01b03851686856115e9565b816001600160a01b0316846001600160a01b0316866001600160a01b03167fe0c82280a1164680e0cf43be7db4c4c9f985423623ad7a544fb76c772bdc60438685604051610933929190918252602082015260400190565b60405180910390a45050505050565b606061094f61083d611438565b61099b5760405162461bcd60e51b815260206004820152601560248201527f554e415554484f52495a45442044454c4547415445000000000000000000000060448201526064016108ae565b858067ffffffffffffffff8111156109b5576109b5611c07565b6040519080825280602002602001820160405280156109e857816020015b60608152602001906001900390816109d35790505b5091505f5b81811015610ac757610aa2878783818110610a0a57610a0a61227a565b9050602002810190610a1c91906122a7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250899250889150859050818110610a6457610a6461227a565b905060200201358b8b85818110610a7d57610a7d61227a565b9050602002016020810190610a929190611f65565b6001600160a01b0316919061169f565b838281518110610ab457610ab461227a565b60209081029190910101526001016109ed565b50509695505050505050565b5f610ade84846116c5565b6001600160a01b0384165f90815260046020526040812081610afe611438565b6001600160a01b03166001600160a01b031681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610b8b57610b518382612335565b6001600160a01b0386165f90815260046020526040812090610b71611438565b6001600160a01b0316815260208101919091526040015f20555b6001600160a01b0385165f9081526003602052604081208054859290610bb2908490612335565b90915550506001600160a01b038085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610c0c9087815260200190565b60405180910390a3506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000014614610c5457610c4f611771565b905090565b507f5bd7a6102ee0705f0165c972bac3eee0a646f009f635dea7fe2947be25fd923390565b610c8461083d611438565b610cd05760405162461bcd60e51b815260206004820152601560248201527f554e415554484f52495a45442044454c4547415445000000000000000000000060448201526064016108ae565b8215610ceb57610ceb6001600160a01b038516863086611809565b610cf582826118cf565b816001600160a01b0316846001600160a01b0316866001600160a01b03167fea00f88768a86184a6e515238a549c171769fe7460a011d6fd0bcd48ca078ea48685604051610933929190918252602082015260400190565b6006546001600160a01b0316331480610e1357506007546040517fb70096130000000000000000000000000000000000000000000000000000000081523360048201523060248201525f357fffffffff000000000000000000000000000000000000000000000000000000001660448201526001600160a01b039091169063b700961390606401602060405180830381865afa158015610def573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e139190612348565b610e1b575f80fd5b600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811790915560405133907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a350565b610e8961083d611438565b610ed55760405162461bcd60e51b815260206004820152601560248201527f554e415554484f52495a45442044454c4547415445000000000000000000000060448201526064016108ae565b600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600180546106fa90612229565b5f610f2e610f28611438565b846116c5565b8160035f610f3a611438565b6001600160a01b03166001600160a01b031681526020019081526020015f205f828254610f679190612335565b90915550506001600160a01b0383165f818152600360205260409020805484019055610f91611438565b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516107f791815260200190565b4284101561101b5760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064016108ae565b5f6001611026610c1f565b6001600160a01b038a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611167573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b038116158015906111bb5750876001600160a01b0316816001600160a01b0316145b6112075760405162461bcd60e51b815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016108ae565b6001600160a01b039081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b61127a61083d611438565b6112c65760405162461bcd60e51b815260206004820152601560248201527f554e415554484f52495a45442044454c4547415445000000000000000000000060448201526064016108ae565b6112cf81611931565b50565b6112dd61083d611438565b6113295760405162461bcd60e51b815260206004820152601560248201527f554e415554484f52495a45442044454c4547415445000000000000000000000060448201526064016108ae565b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b606061139961083d611438565b6113e55760405162461bcd60e51b815260206004820152601560248201527f554e415554484f52495a45442044454c4547415445000000000000000000000060448201526064016108ae565b61142f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050506001600160a01b0388169190508461169f565b95945050505050565b5f6014361080159061145457506009546001600160a01b031633145b1561148457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b503390565b6007545f906001600160a01b0316801580159061155057506040517fb70096130000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301523060248301527fffffffff000000000000000000000000000000000000000000000000000000008516604483015282169063b700961390606401602060405180830381865afa15801561152c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115509190612348565b8061082a57506006546001600160a01b03858116911614949350505050565b6001600160a01b0382165f9081526003602052604081208054839290611596908490612335565b90915550506002805482900390556040518181525f906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b5f6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015282602482015260205f6044835f895af191505080601f3d1160015f51141615161561164c5750823b153d17155b806116995760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016108ae565b50505050565b606061082a8484846040518060600160405280602981526020016124666029913961199a565b6008546001600160a01b03161561176d576008546001600160a01b031663abd626b083836116f1611438565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152918316602483015290911660448201526064015f6040518083038186803b158015611756575f80fd5b505afa158015611768573d5f803e3d5ffd5b505050505b5050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516117a19190612367565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526001600160a01b038416602482015282604482015260205f6064835f8a5af191505080601f3d1160015f51141615161561187b5750833b153d17155b806118c85760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016108ae565b5050505050565b8060025f8282546118e0919061243c565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016115dd565b600980546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f06710129fbc2650f48c82631edcea255e102cd5e17c444deb7273855cfb5e77d905f90a35050565b606082471015611a125760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016108ae565b5f80866001600160a01b03168587604051611a2d919061244f565b5f6040518083038185875af1925050503d805f8114611a67576040519150601f19603f3d011682016040523d82523d5f602084013e611a6c565b606091505b5091509150611a7d87838387611a88565b979650505050505050565b60608315611af65782515f03611aef576001600160a01b0385163b611aef5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108ae565b508161082a565b61082a8383815115611b0b5781518083602001fd5b8060405162461bcd60e51b81526004016108ae9190611bb7565b5f60208284031215611b35575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611b64575f80fd5b9392505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f611b646020830184611b6b565b6001600160a01b03811681146112cf575f80fd5b5f8060408385031215611bee575f80fd5b8235611bf981611bc9565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611c7b57611c7b611c07565b604052919050565b5f82601f830112611c92575f80fd5b813567ffffffffffffffff811115611cac57611cac611c07565b611cdd60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611c34565b818152846020838601011115611cf1575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611d20575f80fd5b8435611d2b81611bc9565b93506020850135611d3b81611bc9565b925060408501359150606085013567ffffffffffffffff811115611d5d575f80fd5b611d6987828801611c83565b91505092959194509250565b5f805f805f60a08688031215611d89575f80fd5b8535611d9481611bc9565b94506020860135611da481611bc9565b9350604086013592506060860135611dbb81611bc9565b949793965091946080013592915050565b5f8083601f840112611ddc575f80fd5b50813567ffffffffffffffff811115611df3575f80fd5b6020830191508360208260051b8501011115611e0d575f80fd5b9250929050565b5f805f805f8060608789031215611e29575f80fd5b863567ffffffffffffffff80821115611e40575f80fd5b611e4c8a838b01611dcc565b90985096506020890135915080821115611e64575f80fd5b611e708a838b01611dcc565b90965094506040890135915080821115611e88575f80fd5b50611e9589828a01611dcc565b979a9699509497509295939492505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b82811015611f1a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452611f08858351611b6b565b94509285019290850190600101611ece565b5092979650505050505050565b5f805f60608486031215611f39575f80fd5b8335611f4481611bc9565b92506020840135611f5481611bc9565b929592945050506040919091013590565b5f60208284031215611f75575f80fd5b8135611b6481611bc9565b5f82601f830112611f8f575f80fd5b8135602067ffffffffffffffff821115611fab57611fab611c07565b8160051b611fba828201611c34565b9283528481018201928281019087851115611fd3575f80fd5b83870192505b84831015611a7d57823582529183019190830190611fd9565b5f805f805f60a08688031215612006575f80fd5b853561201181611bc9565b9450602086013561202181611bc9565b9350604086013567ffffffffffffffff8082111561203d575f80fd5b61204989838a01611f80565b9450606088013591508082111561205e575f80fd5b61206a89838a01611f80565b9350608088013591508082111561207f575f80fd5b5061208c88828901611c83565b9150509295509295909350565b5f805f805f805f60e0888a0312156120af575f80fd5b87356120ba81611bc9565b965060208801356120ca81611bc9565b95506040880135945060608801359350608088013560ff811681146120ed575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f806040838503121561211b575f80fd5b823561212681611bc9565b9150602083013561213681611bc9565b809150509250929050565b5f805f805f60a08688031215612155575f80fd5b853561216081611bc9565b9450602086013561217081611bc9565b93506040860135925060608601359150608086013567ffffffffffffffff811115612199575f80fd5b61208c88828901611c83565b5f805f80606085870312156121b8575f80fd5b84356121c381611bc9565b9350602085013567ffffffffffffffff808211156121df575f80fd5b818701915087601f8301126121f2575f80fd5b813581811115612200575f80fd5b886020828501011115612211575f80fd5b95986020929092019750949560400135945092505050565b600181811c9082168061223d57607f821691505b602082108103612274577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126122da575f80fd5b83018035915067ffffffffffffffff8211156122f4575f80fd5b602001915036819003821315611e0d575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156106e8576106e8612308565b5f60208284031215612358575f80fd5b81518015158114611b64575f80fd5b5f8083545f60018260011c9150600183168061238457607f831692505b602080841082036123bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b8180156123d057600181146124035761242e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616895284151585028901965061242e565b5f8a8152602090205f5b868110156124265781548b82015290850190830161240d565b505084890196505b509498975050505050505050565b808201808211156106e8576106e8612308565b5f82518060208501845e5f92019182525091905056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a264697066735822122075043171e4acfec8ecca490f57bc1a821658e55573425b38497fd44d57dbf07364736f6c63430008190033
Deployed Bytecode Sourcemap
243:2068:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;387:221:2;;;;;;;;;;-1:-1:-1;387:221:2;;;;;:::i;:::-;;:::i;:::-;;;516:14:17;;509:22;491:41;;479:2;464:18;387:221:2;;;;;;;;1031:18:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;757:224:14:-;;;;;;;;;;-1:-1:-1;757:224:14;;;;;:::i;:::-;;:::i;603:162:4:-;;;;;;;;;;-1:-1:-1;603:162:4;;;;;:::i;:::-;;:::i;:::-;;;3566:66:17;3554:79;;;3536:98;;3524:2;3509:18;603:162:4;3392:248:17;1304:26:11;;;;;;;;;;;;;;;;;;;3791:25:17;;;3779:2;3764:18;1304:26:11;3645:177:17;3596:399:8;;;;;;;;;;-1:-1:-1;3596:399:8;;;;;:::i;:::-;;:::i;:::-;;2219:419;;;;;;;;;;-1:-1:-1;2219:419:8;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1426:614:14:-;;;;;;;;;;-1:-1:-1;1426:614:14;;;;;:::i;:::-;;:::i;1083:31:11:-;;;;;;;;;;;;;;;;;;7487:4:17;7475:17;;;7457:36;;7445:2;7430:18;1083:31:11;7315:184:17;5327:177:11;;;;;;;;;;;;;:::i;2908:418:8:-;;;;;;;;;;-1:-1:-1;2908:418:8;;;;;:::i;:::-;;:::i;558:136:16:-;;;;;;;;;;-1:-1:-1;558:136:16;;;;;:::i;:::-;671:16;;-1:-1:-1;;;;;658:29:16;;;671:16;;658:29;;558:136;1337:44:11;;;;;;;;;;-1:-1:-1;1337:44:11;;;;;:::i;:::-;;;;;;;;;;;;;;1523:434:10;;;;;;;;;;-1:-1:-1;1523:434:10;;;;;:::i;:::-;;:::i;269:31:16:-;;;;;;;;;;-1:-1:-1;269:31:16;;;;-1:-1:-1;;;;;269:31:16;;;;;;-1:-1:-1;;;;;8372:55:17;;;8354:74;;8342:2;8327:18;269:31:16;8208:226:17;1751:41:11;;;;;;;;;;-1:-1:-1;1751:41:11;;;;;:::i;:::-;;;;;;;;;;;;;;1015:30:8;;;;;;;;;;-1:-1:-1;1015:30:8;;;;-1:-1:-1;;;;;1015:30:8;;;4256:117;;;;;;;;;;-1:-1:-1;4256:117:8;;;;;:::i;:::-;;:::i;562:20:10:-;;;;;;;;;;-1:-1:-1;562:20:10;;;;-1:-1:-1;;;;;562:20:10;;;1056::11;;;;;;;;;;;;;:::i;987:433:14:-;;;;;;;;;;-1:-1:-1;987:433:14;;;;;:::i;:::-;;:::i;724:247:1:-;;;;;;;;;;-1:-1:-1;724:247:1;;;;;:::i;:::-;928:36;724:247;;;;;;;;589:26:10;;;;;;;;;;-1:-1:-1;589:26:10;;;;-1:-1:-1;;;;;589:26:10;;;3838:1483:11;;;;;;;;;;-1:-1:-1;3838:1483:11;;;;;:::i;:::-;;:::i;2191:118:14:-;;;;;;;;;;-1:-1:-1;2191:118:14;;;;;:::i;:::-;;:::i;1388:64:11:-;;;;;;;;;;-1:-1:-1;1388:64:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;499:219:1;;;;;;;;;;-1:-1:-1;499:219:1;;;;;:::i;:::-;680:31;499:219;;;;;;;;1963:164:10;;;;;;;;;;-1:-1:-1;1963:164:10;;;;;:::i;:::-;;:::i;1859:217:8:-;;;;;;;;;;-1:-1:-1;1859:217:8;;;;;:::i;:::-;;:::i;387:221:2:-;489:4;512:49;;;527:34;512:49;;:89;;-1:-1:-1;952:25:6;937:40;;;;565:36:2;505:96;387:221;-1:-1:-1;;387:221:2:o;1031:18:11:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;757:224:14:-;840:4;891:6;856:9;:23;866:12;:10;:12::i;:::-;-1:-1:-1;;;;;856:23:14;;;;;;;;;;;;;;;;;-1:-1:-1;856:23:14;;;:32;;;;;;;;;;;;:41;;;;922:12;:10;:12::i;:::-;-1:-1:-1;;;;;913:39:14;;945:6;913:39;;;;3791:25:17;;3779:2;3764:18;;3645:177;913:39:14;;;;;;;;-1:-1:-1;970:4:14;757:224;;;;:::o;603:162:4:-;728:30;603:162;;;;;;;:::o;3596:399:8:-;2105:35:14;2118:12;:10;:12::i;:::-;2132:7;;;;2105:12;:35::i;:::-;2097:69;;;;-1:-1:-1;;;2097:69:14;;14370:2:17;2097:69:14;;;14352:21:17;14409:2;14389:18;;;14382:30;14448:23;14428:18;;;14421:51;14489:18;;2097:69:14;;;;;;;;;3793:24:8::1;3799:4;3805:11;3793:5;:24::i;:::-;3864:15:::0;;3860:56:::1;;3881:35;-1:-1:-1::0;;;;;3881:18:8;::::1;3900:2:::0;3904:11;3881:18:::1;:35::i;:::-;3970:4;-1:-1:-1::0;;;;;3932:56:8::1;3949:5;-1:-1:-1::0;;;;;3932:56:8::1;3937:2;-1:-1:-1::0;;;;;3932:56:8::1;;3957:11;3976;3932:56;;;;;;14692:25:17::0;;;14748:2;14733:18;;14726:34;14680:2;14665:18;;14518:248;3932:56:8::1;;;;;;;;3596:399:::0;;;;;:::o;2219:419::-;2374:22;2105:35:14;2118:12;:10;:12::i;2105:35::-;2097:69;;;;-1:-1:-1;;;2097:69:14;;14370:2:17;2097:69:14;;;14352:21:17;14409:2;14389:18;;;14382:30;14448:23;14428:18;;;14421:51;14489:18;;2097:69:14;14168:345:17;2097:69:14;2432:7:8;;2466:26:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2456:36;;2507:9;2502:130;2522:13;2518:1;:17;2502:130;;;2569:52;2602:4;;2607:1;2602:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;2569:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;2611:6:8;;-1:-1:-1;2611:6:8;;-1:-1:-1;2618:1:8;;-1:-1:-1;2611:9:8;;::::1;;;;;:::i;:::-;;;;;;;2569:7;;2577:1;2569:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2569:32:8::1;::::0;:52;:32:::1;:52::i;:::-;2556:7;2564:1;2556:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:65;2537:3:::1;;2502:130;;;;2398:240;2219:419:::0;;;;;;;;:::o;1426:614:14:-;1523:4;1539:29;1559:4;1565:2;1539:19;:29::i;:::-;-1:-1:-1;;;;;1596:15:14;;1578;1596;;;:9;:15;;;;;1578;1612:12;:10;:12::i;:::-;-1:-1:-1;;;;;1596:29:14;-1:-1:-1;;;;;1596:29:14;;;;;;;;;;;;;1578:47;;1687:17;1676:7;:28;1672:82;;1738:16;1748:6;1738:7;:16;:::i;:::-;-1:-1:-1;;;;;1706:15:14;;;;;;:9;:15;;;;;;1722:12;:10;:12::i;:::-;-1:-1:-1;;;;;1706:29:14;;;;;;;;;;;;-1:-1:-1;1706:29:14;:48;1672:82;-1:-1:-1;;;;;1765:15:14;;;;;;:9;:15;;;;;:25;;1784:6;;1765:15;:25;;1784:6;;1765:25;:::i;:::-;;;;-1:-1:-1;;;;;;;1936:13:14;;;;;;;:9;:13;;;;;;;:23;;;;;;1985:26;1936:13;;1985:26;;;;;;;1953:6;3791:25:17;;3779:2;3764:18;;3645:177;1985:26:14;;;;;;;;-1:-1:-1;2029:4:14;;1426:614;-1:-1:-1;;;;1426:614:14:o;5327:177:11:-;5384:7;5427:16;5410:13;:33;:87;;5473:24;:22;:24::i;:::-;5403:94;;5327:177;:::o;5410:87::-;-1:-1:-1;5446:24:11;;5327:177::o;2908:418:8:-;2105:35:14;2118:12;:10;:12::i;2105:35::-;2097:69;;;;-1:-1:-1;;;2097:69:14;;14370:2:17;2097:69:14;;;14352:21:17;14409:2;14389:18;;;14382:30;14448:23;14428:18;;;14421:51;14489:18;;2097:69:14;14168:345:17;2097:69:14;3116:15:8;;3112:77:::1;;3133:56;-1:-1:-1::0;;;;;3133:22:8;::::1;3156:4:::0;3170::::1;3177:11:::0;3133:22:::1;:56::i;:::-;3224:22;3230:2;3234:11;3224:5;:22::i;:::-;3303:2;-1:-1:-1::0;;;;;3262:57:8::1;3282:5;-1:-1:-1::0;;;;;3262:57:8::1;3268:4;-1:-1:-1::0;;;;;3262:57:8::1;;3290:11;3307;3262:57;;;;;;14692:25:17::0;;;14748:2;14733:18;;14726:34;14680:2;14665:18;;14518:248;1523:434:10;1794:5;;-1:-1:-1;;;;;1794:5:10;1780:10;:19;;:76;;-1:-1:-1;1803:9:10;;:53;;;;;1821:10;1803:53;;;16128:34:17;1841:4:10;16178:18:17;;;16171:43;1803:9:10;1848:7;;;16230:18:17;;;16223:107;-1:-1:-1;;;;;1803:9:10;;;;:17;;16040:18:17;;1803:53:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1772:85;;;;;;1868:9;:24;;;;-1:-1:-1;;;;;1868:24:10;;;;;;;;1908:42;;1925:10;;1908:42;;-1:-1:-1;;1908:42:10;1523:434;:::o;4256:117:8:-;2105:35:14;2118:12;:10;:12::i;2105:35::-;2097:69;;;;-1:-1:-1;;;2097:69:14;;14370:2:17;2097:69:14;;;14352:21:17;14409:2;14389:18;;;14382:30;14448:23;14428:18;;;14421:51;14489:18;;2097:69:14;14168:345:17;2097:69:14;4334:4:8::1;:32:::0;;;::::1;-1:-1:-1::0;;;;;4334:32:8;;;::::1;::::0;;;::::1;::::0;;4256:117::o;1056:20:11:-;;;;;;;:::i;987:433:14:-;1066:4;1082:37;1102:12;:10;:12::i;:::-;1116:2;1082:19;:37::i;:::-;1156:6;1129:9;:23;1139:12;:10;:12::i;:::-;-1:-1:-1;;;;;1129:23:14;-1:-1:-1;;;;;1129:23:14;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;1308:13:14;;;;;;:9;:13;;;;;:23;;;;;;1366:12;:10;:12::i;:::-;-1:-1:-1;;;;;1357:34:14;;1384:6;1357:34;;;;3791:25:17;;3779:2;3764:18;;3645:177;3838:1483:11;4057:15;4045:8;:27;;4037:63;;;;-1:-1:-1;;;4037:63:11;;16825:2:17;4037:63:11;;;16807:21:17;16864:2;16844:18;;;16837:30;16903:25;16883:18;;;16876:53;16946:18;;4037:63:11;16623:347:17;4037:63:11;4265:24;4292:805;4428:18;:16;:18::i;:::-;-1:-1:-1;;;;;4873:13:11;;;;;;;:6;:13;;;;;;;;;:15;;;;;;;;4511:449;;4555:165;4511:449;;;17262:25:17;17364:18;;;17357:43;;;;17436:15;;;17416:18;;;17409:43;17468:18;;;17461:34;;;17511:19;;;17504:35;;;;17555:19;;;;17548:35;;;4511:449:11;;;;;;;;;;17234:19:17;;;4511:449:11;;;4472:514;;;;;;;;17864:66:17;4350:658:11;;;17852:79:17;17947:11;;;17940:27;;;;17983:12;;;17976:28;;;;18020:12;;4350:658:11;;;;;;;;;;;;;4319:707;;4350:658;4319:707;;;;4292:805;;;;;;;;;18270:25:17;18343:4;18331:17;;18311:18;;;18304:45;18365:18;;;18358:34;;;18408:18;;;18401:34;;;18242:19;;4292:805:11;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4292:805:11;;;;;;-1:-1:-1;;;;;;;5120:30:11;;;;;;:59;;;5174:5;-1:-1:-1;;;;;5154:25:11;:16;-1:-1:-1;;;;;5154:25:11;;5120:59;5112:86;;;;-1:-1:-1;;;5112:86:11;;18648:2:17;5112:86:11;;;18630:21:17;18687:2;18667:18;;;18660:30;18726:16;18706:18;;;18699:44;18760:18;;5112:86:11;18446:338:17;5112:86:11;-1:-1:-1;;;;;5213:27:11;;;;;;;:9;:27;;;;;;;;:36;;;;;;;;;;;;;:44;;;5283:31;3791:25:17;;;5213:36:11;;5283:31;;;;;3764:18:17;5283:31:11;;;;;;;3838:1483;;;;;;;:::o;2191:118:14:-;2105:35;2118:12;:10;:12::i;2105:35::-;2097:69;;;;-1:-1:-1;;;2097:69:14;;14370:2:17;2097:69:14;;;14352:21:17;14409:2;14389:18;;;14382:30;14448:23;14428:18;;;14421:51;14489:18;;2097:69:14;14168:345:17;2097:69:14;2271:31:::1;2292:9;2271:20;:31::i;:::-;2191:118:::0;:::o;1963:164:10:-;2105:35:14;2118:12;:10;:12::i;2105:35::-;2097:69;;;;-1:-1:-1;;;2097:69:14;;14370:2:17;2097:69:14;;;14352:21:17;14409:2;14389:18;;;14382:30;14448:23;14428:18;;;14421:51;14489:18;;2097:69:14;14168:345:17;2097:69:14;2046:5:10::1;:16:::0;;;::::1;-1:-1:-1::0;;;;;2046:16:10;::::1;::::0;;::::1;::::0;;;2078:42:::1;::::0;2099:10:::1;::::0;2078:42:::1;::::0;-1:-1:-1;;2078:42:10::1;1963:164:::0;:::o;1859:217:8:-;1988:19;2105:35:14;2118:12;:10;:12::i;2105:35::-;2097:69;;;;-1:-1:-1;;;2097:69:14;;14370:2:17;2097:69:14;;;14352:21:17;14409:2;14389:18;;;14382:30;14448:23;14428:18;;;14421:51;14489:18;;2097:69:14;14168:345:17;2097:69:14;2028:41:8::1;2057:4;;2028:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;2028:28:8;::::1;::::0;;-1:-1:-1;2063:5:8;2028:28:::1;:41::i;:::-;2019:50:::0;1859:217;-1:-1:-1;;;;;1859:217:8:o;781:372:16:-;834:14;883:2;864:8;:21;;;;:55;;-1:-1:-1;671:16:16;;-1:-1:-1;;;;;671:16:16;908:10;658:29;889:30;860:287;;;-1:-1:-1;1048:23:16;1052:14;1048:23;1035:37;1031:2;1027:46;781:372;:::o;860:287::-;-1:-1:-1;1126:10:16;781:372;:::o;977:540:10:-;1097:9;;1064:4;;-1:-1:-1;;;;;1097:9:10;1415:27;;;;;:77;;-1:-1:-1;1446:46:10;;;;;-1:-1:-1;;;;;16146:15:17;;;1446:46:10;;;16128:34:17;1473:4:10;16178:18:17;;;16171:43;16262:66;16250:79;;16230:18;;;16223:107;1446:12:10;;;;;16040:18:17;;1446:46:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1414:96;;;-1:-1:-1;1505:5:10;;-1:-1:-1;;;;;1497:13:10;;;1505:5;;1497:13;1407:103;977:540;-1:-1:-1;;;;977:540:10:o;6481:328:11:-;-1:-1:-1;;;;;6553:15:11;;;;;;:9;:15;;;;;:25;;6572:6;;6553:15;:25;;6572:6;;6553:25;:::i;:::-;;;;-1:-1:-1;;6721:11:11;:21;;;;;;;6768:34;;3791:25:17;;;-1:-1:-1;;;;;;;6768:34:11;;;;;3779:2:17;3764:18;6768:34:11;;;;;;;;6481:328;;:::o;2832:1464:13:-;2944:12;3114:4;3108:11;3256:66;3237:17;3230:93;-1:-1:-1;;;;;3374:2:13;3370:51;3366:1;3347:17;3343:25;3336:86;3508:6;3503:2;3484:17;3480:26;3473:42;3855:2;3852:1;3848:2;3829:17;3826:1;3819:5;3812;3807:51;3796:62;;;4125:7;4118:2;4100:16;4097:24;4093:1;4089;4083:8;4080:15;4076:46;4069:54;4065:68;4062:172;;;-1:-1:-1;4180:18:13;;4173:26;4201:16;4170:48;4163:56;4062:172;4262:7;4254:35;;;;-1:-1:-1;;;4254:35:13;;18991:2:17;4254:35:13;;;18973:21:17;19030:2;19010:18;;;19003:30;19069:17;19049:18;;;19042:45;19104:18;;4254:35:13;18789:339:17;4254:35:13;2934:1362;2832:1464;;;:::o;4693:224:5:-;4792:12;4823:87;4845:6;4853:4;4859:5;4823:87;;;;;;;;;;;;;;;;;:21;:87::i;572:179:14:-;680:4;;-1:-1:-1;;;;;680:4:14;672:27;668:76;;701:4;;-1:-1:-1;;;;;701:4:14;:19;721:4;727:2;731:12;:10;:12::i;:::-;701:43;;;;;;;;;;-1:-1:-1;;;;;19414:15:17;;;701:43:14;;;19396:34:17;19466:15;;;19446:18;;;19439:43;19518:15;;;19498:18;;;19491:43;19308:18;;701:43:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;668:76;572:179;;:::o;5510:446:11:-;5575:7;5672:95;5805:4;5789:22;;;;;;:::i;:::-;;;;;;;;;;5640:295;;;21178:25:17;;;;21219:18;;21212:34;;;;5833:14:11;21262:18:17;;;21255:34;5869:13:11;21305:18:17;;;21298:34;5912:4:11;21348:19:17;;;21341:84;21150:19;;5640:295:11;;;;;;;;;;;;5613:336;;;;;;5594:355;;5510:446;:::o;1187:1639:13:-;1325:12;1495:4;1489:11;1637:66;1618:17;1611:93;-1:-1:-1;;;;;1755:4:13;1751:53;1747:1;1728:17;1724:25;1717:88;-1:-1:-1;;;;;1897:2:13;1893:51;1888:2;1869:17;1865:26;1858:87;2031:6;2026:2;2007:17;2003:26;1996:42;2380:2;2377:1;2372:3;2353:17;2350:1;2343:5;2336;2331:52;2320:63;;;2650:7;2643:2;2625:16;2622:24;2618:1;2614;2608:8;2605:15;2601:46;2594:54;2590:68;2587:172;;;-1:-1:-1;2705:18:13;;2698:26;2726:16;2695:48;2688:56;2587:172;2787:7;2779:40;;;;-1:-1:-1;;;2779:40:13;;21638:2:17;2779:40:13;;;21620:21:17;21677:2;21657:18;;;21650:30;21716:22;21696:18;;;21689:50;21756:18;;2779:40:13;21436:344:17;2779:40:13;1315:1511;1187:1639;;;;:::o;6150:325:11:-;6235:6;6220:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;6387:13:11;;;;;;:9;:13;;;;;;;;:23;;;;;;6436:32;3791:25:17;;;6436:32:11;;3764:18:17;6436:32:11;3645:177:17;1499:223:16;1598:16;;;-1:-1:-1;;;;;1624:28:16;;;;;;;;;;;1667:48;;1598:16;;;1624:28;1598:16;;1667:48;;1575:20;;1667:48;1565:157;1499:223;:::o;5165:446:5:-;5330:12;5387:5;5362:21;:30;;5354:81;;;;-1:-1:-1;;;5354:81:5;;22117:2:17;5354:81:5;;;22099:21:17;22156:2;22136:18;;;22129:30;22195:34;22175:18;;;22168:62;22266:8;22246:18;;;22239:36;22292:19;;5354:81:5;21915:402:17;5354:81:5;5446:12;5460:23;5487:6;-1:-1:-1;;;;;5487:11:5;5506:5;5513:4;5487:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5445:73;;;;5535:69;5562:6;5570:7;5579:10;5591:12;5535:26;:69::i;:::-;5528:76;5165:446;-1:-1:-1;;;;;;;5165:446:5:o;7671:628::-;7851:12;7879:7;7875:418;;;7906:10;:17;7927:1;7906:22;7902:286;;-1:-1:-1;;;;;1702:19:5;;;8113:60;;;;-1:-1:-1;;;8113:60:5;;22830:2:17;8113:60:5;;;22812:21:17;22869:2;22849:18;;;22842:30;22908:31;22888:18;;;22881:59;22957:18;;8113:60:5;22628:353:17;8113:60:5;-1:-1:-1;8208:10:5;8201:17;;7875:418;8249:33;8257:10;8269:12;8980:17;;:21;8976:379;;9208:10;9202:17;9264:15;9251:10;9247:2;9243:19;9236:44;8976:379;9331:12;9324:20;;-1:-1:-1;;;9324:20:5;;;;;;;;:::i;14:332:17:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:66;223:5;219:78;212:5;209:89;199:117;;312:1;309;302:12;199:117;335:5;14:332;-1:-1:-1;;;14:332:17:o;543:348::-;585:3;623:5;617:12;650:6;645:3;638:19;706:6;699:4;692:5;688:16;681:4;676:3;672:14;666:47;758:1;751:4;742:6;737:3;733:16;729:27;722:38;880:4;810:66;805:2;797:6;793:15;789:88;784:3;780:98;776:109;769:116;;;543:348;;;;:::o;896:220::-;1045:2;1034:9;1027:21;1008:4;1065:45;1106:2;1095:9;1091:18;1083:6;1065:45;:::i;1121:154::-;-1:-1:-1;;;;;1200:5:17;1196:54;1189:5;1186:65;1176:93;;1265:1;1262;1255:12;1280:315;1348:6;1356;1409:2;1397:9;1388:7;1384:23;1380:32;1377:52;;;1425:1;1422;1415:12;1377:52;1464:9;1451:23;1483:31;1508:5;1483:31;:::i;:::-;1533:5;1585:2;1570:18;;;;1557:32;;-1:-1:-1;;;1280:315:17:o;1600:184::-;1652:77;1649:1;1642:88;1749:4;1746:1;1739:15;1773:4;1770:1;1763:15;1789:334;1860:2;1854:9;1916:2;1906:13;;1921:66;1902:86;1890:99;;2019:18;2004:34;;2040:22;;;2001:62;1998:88;;;2066:18;;:::i;:::-;2102:2;2095:22;1789:334;;-1:-1:-1;1789:334:17:o;2128:589::-;2170:5;2223:3;2216:4;2208:6;2204:17;2200:27;2190:55;;2241:1;2238;2231:12;2190:55;2277:6;2264:20;2303:18;2299:2;2296:26;2293:52;;;2325:18;;:::i;:::-;2369:114;2477:4;2408:66;2401:4;2397:2;2393:13;2389:86;2385:97;2369:114;:::i;:::-;2508:2;2499:7;2492:19;2554:3;2547:4;2542:2;2534:6;2530:15;2526:26;2523:35;2520:55;;;2571:1;2568;2561:12;2520:55;2636:2;2629:4;2621:6;2617:17;2610:4;2601:7;2597:18;2584:55;2684:1;2659:16;;;2677:4;2655:27;2648:38;;;;2663:7;2128:589;-1:-1:-1;;;2128:589:17:o;2722:665::-;2817:6;2825;2833;2841;2894:3;2882:9;2873:7;2869:23;2865:33;2862:53;;;2911:1;2908;2901:12;2862:53;2950:9;2937:23;2969:31;2994:5;2969:31;:::i;:::-;3019:5;-1:-1:-1;3076:2:17;3061:18;;3048:32;3089:33;3048:32;3089:33;:::i;:::-;3141:7;-1:-1:-1;3195:2:17;3180:18;;3167:32;;-1:-1:-1;3250:2:17;3235:18;;3222:32;3277:18;3266:30;;3263:50;;;3309:1;3306;3299:12;3263:50;3332:49;3373:7;3364:6;3353:9;3349:22;3332:49;:::i;:::-;3322:59;;;2722:665;;;;;;;:::o;3827:681::-;3936:6;3944;3952;3960;3968;4021:3;4009:9;4000:7;3996:23;3992:33;3989:53;;;4038:1;4035;4028:12;3989:53;4077:9;4064:23;4096:31;4121:5;4096:31;:::i;:::-;4146:5;-1:-1:-1;4203:2:17;4188:18;;4175:32;4216:33;4175:32;4216:33;:::i;:::-;4268:7;-1:-1:-1;4322:2:17;4307:18;;4294:32;;-1:-1:-1;4378:2:17;4363:18;;4350:32;4391:33;4350:32;4391:33;:::i;:::-;3827:681;;;;-1:-1:-1;3827:681:17;;4497:3;4482:19;4469:33;;3827:681;-1:-1:-1;;3827:681:17:o;4513:367::-;4576:8;4586:6;4640:3;4633:4;4625:6;4621:17;4617:27;4607:55;;4658:1;4655;4648:12;4607:55;-1:-1:-1;4681:20:17;;4724:18;4713:30;;4710:50;;;4756:1;4753;4746:12;4710:50;4793:4;4785:6;4781:17;4769:29;;4853:3;4846:4;4836:6;4833:1;4829:14;4821:6;4817:27;4813:38;4810:47;4807:67;;;4870:1;4867;4860:12;4807:67;4513:367;;;;;:::o;4885:1099::-;5054:6;5062;5070;5078;5086;5094;5147:2;5135:9;5126:7;5122:23;5118:32;5115:52;;;5163:1;5160;5153:12;5115:52;5203:9;5190:23;5232:18;5273:2;5265:6;5262:14;5259:34;;;5289:1;5286;5279:12;5259:34;5328:70;5390:7;5381:6;5370:9;5366:22;5328:70;:::i;:::-;5417:8;;-1:-1:-1;5302:96:17;-1:-1:-1;5505:2:17;5490:18;;5477:32;;-1:-1:-1;5521:16:17;;;5518:36;;;5550:1;5547;5540:12;5518:36;5589:72;5653:7;5642:8;5631:9;5627:24;5589:72;:::i;:::-;5680:8;;-1:-1:-1;5563:98:17;-1:-1:-1;5768:2:17;5753:18;;5740:32;;-1:-1:-1;5784:16:17;;;5781:36;;;5813:1;5810;5803:12;5781:36;;5852:72;5916:7;5905:8;5894:9;5890:24;5852:72;:::i;:::-;4885:1099;;;;-1:-1:-1;4885:1099:17;;-1:-1:-1;4885:1099:17;;5943:8;;4885:1099;-1:-1:-1;;;4885:1099:17:o;5989:860::-;6149:4;6178:2;6218;6207:9;6203:18;6248:2;6237:9;6230:21;6271:6;6306;6300:13;6337:6;6329;6322:22;6375:2;6364:9;6360:18;6353:25;;6437:2;6427:6;6424:1;6420:14;6409:9;6405:30;6401:39;6387:53;;6475:2;6467:6;6463:15;6496:1;6506:314;6520:6;6517:1;6514:13;6506:314;;;6609:66;6597:9;6589:6;6585:22;6581:95;6576:3;6569:108;6700:40;6733:6;6724;6718:13;6700:40;:::i;:::-;6690:50;-1:-1:-1;6798:12:17;;;;6763:15;;;;6542:1;6535:9;6506:314;;;-1:-1:-1;6837:6:17;;5989:860;-1:-1:-1;;;;;;;5989:860:17:o;6854:456::-;6931:6;6939;6947;7000:2;6988:9;6979:7;6975:23;6971:32;6968:52;;;7016:1;7013;7006:12;6968:52;7055:9;7042:23;7074:31;7099:5;7074:31;:::i;:::-;7124:5;-1:-1:-1;7181:2:17;7166:18;;7153:32;7194:33;7153:32;7194:33;:::i;:::-;6854:456;;7246:7;;-1:-1:-1;;;7300:2:17;7285:18;;;;7272:32;;6854:456::o;7686:247::-;7745:6;7798:2;7786:9;7777:7;7773:23;7769:32;7766:52;;;7814:1;7811;7804:12;7766:52;7853:9;7840:23;7872:31;7897:5;7872:31;:::i;8696:712::-;8750:5;8803:3;8796:4;8788:6;8784:17;8780:27;8770:55;;8821:1;8818;8811:12;8770:55;8857:6;8844:20;8883:4;8906:18;8902:2;8899:26;8896:52;;;8928:18;;:::i;:::-;8974:2;8971:1;8967:10;8997:28;9021:2;9017;9013:11;8997:28;:::i;:::-;9059:15;;;9129;;;9125:24;;;9090:12;;;;9161:15;;;9158:35;;;9189:1;9186;9179:12;9158:35;9225:2;9217:6;9213:15;9202:26;;9237:142;9253:6;9248:3;9245:15;9237:142;;;9319:17;;9307:30;;9270:12;;;;9357;;;;9237:142;;9413:1071;9567:6;9575;9583;9591;9599;9652:3;9640:9;9631:7;9627:23;9623:33;9620:53;;;9669:1;9666;9659:12;9620:53;9708:9;9695:23;9727:31;9752:5;9727:31;:::i;:::-;9777:5;-1:-1:-1;9834:2:17;9819:18;;9806:32;9847:33;9806:32;9847:33;:::i;:::-;9899:7;-1:-1:-1;9957:2:17;9942:18;;9929:32;9980:18;10010:14;;;10007:34;;;10037:1;10034;10027:12;10007:34;10060:61;10113:7;10104:6;10093:9;10089:22;10060:61;:::i;:::-;10050:71;;10174:2;10163:9;10159:18;10146:32;10130:48;;10203:2;10193:8;10190:16;10187:36;;;10219:1;10216;10209:12;10187:36;10242:63;10297:7;10286:8;10275:9;10271:24;10242:63;:::i;:::-;10232:73;;10358:3;10347:9;10343:19;10330:33;10314:49;;10388:2;10378:8;10375:16;10372:36;;;10404:1;10401;10394:12;10372:36;;10427:51;10470:7;10459:8;10448:9;10444:24;10427:51;:::i;:::-;10417:61;;;9413:1071;;;;;;;;:::o;10738:829::-;10849:6;10857;10865;10873;10881;10889;10897;10950:3;10938:9;10929:7;10925:23;10921:33;10918:53;;;10967:1;10964;10957:12;10918:53;11006:9;10993:23;11025:31;11050:5;11025:31;:::i;:::-;11075:5;-1:-1:-1;11132:2:17;11117:18;;11104:32;11145:33;11104:32;11145:33;:::i;:::-;11197:7;-1:-1:-1;11251:2:17;11236:18;;11223:32;;-1:-1:-1;11302:2:17;11287:18;;11274:32;;-1:-1:-1;11358:3:17;11343:19;;11330:33;11407:4;11394:18;;11382:31;;11372:59;;11427:1;11424;11417:12;11372:59;10738:829;;;;-1:-1:-1;10738:829:17;;;;11450:7;11504:3;11489:19;;11476:33;;-1:-1:-1;11556:3:17;11541:19;;;11528:33;;10738:829;-1:-1:-1;;10738:829:17:o;11572:388::-;11640:6;11648;11701:2;11689:9;11680:7;11676:23;11672:32;11669:52;;;11717:1;11714;11707:12;11669:52;11756:9;11743:23;11775:31;11800:5;11775:31;:::i;:::-;11825:5;-1:-1:-1;11882:2:17;11867:18;;11854:32;11895:33;11854:32;11895:33;:::i;:::-;11947:7;11937:17;;;11572:388;;;;;:::o;11965:734::-;12069:6;12077;12085;12093;12101;12154:3;12142:9;12133:7;12129:23;12125:33;12122:53;;;12171:1;12168;12161:12;12122:53;12210:9;12197:23;12229:31;12254:5;12229:31;:::i;:::-;12279:5;-1:-1:-1;12336:2:17;12321:18;;12308:32;12349:33;12308:32;12349:33;:::i;:::-;12401:7;-1:-1:-1;12455:2:17;12440:18;;12427:32;;-1:-1:-1;12506:2:17;12491:18;;12478:32;;-1:-1:-1;12561:3:17;12546:19;;12533:33;12589:18;12578:30;;12575:50;;;12621:1;12618;12611:12;12575:50;12644:49;12685:7;12676:6;12665:9;12661:22;12644:49;:::i;12704:794::-;12792:6;12800;12808;12816;12869:2;12857:9;12848:7;12844:23;12840:32;12837:52;;;12885:1;12882;12875:12;12837:52;12924:9;12911:23;12943:31;12968:5;12943:31;:::i;:::-;12993:5;-1:-1:-1;13049:2:17;13034:18;;13021:32;13072:18;13102:14;;;13099:34;;;13129:1;13126;13119:12;13099:34;13167:6;13156:9;13152:22;13142:32;;13212:7;13205:4;13201:2;13197:13;13193:27;13183:55;;13234:1;13231;13224:12;13183:55;13274:2;13261:16;13300:2;13292:6;13289:14;13286:34;;;13316:1;13313;13306:12;13286:34;13361:7;13356:2;13347:6;13343:2;13339:15;13335:24;13332:37;13329:57;;;13382:1;13379;13372:12;13329:57;12704:794;;13413:2;13405:11;;;;;-1:-1:-1;13435:6:17;;13488:2;13473:18;13460:32;;-1:-1:-1;12704:794:17;-1:-1:-1;;;12704:794:17:o;13726:437::-;13805:1;13801:12;;;;13848;;;13869:61;;13923:4;13915:6;13911:17;13901:27;;13869:61;13976:2;13968:6;13965:14;13945:18;13942:38;13939:218;;14013:77;14010:1;14003:88;14114:4;14111:1;14104:15;14142:4;14139:1;14132:15;13939:218;;13726:437;;;:::o;14771:184::-;14823:77;14820:1;14813:88;14920:4;14917:1;14910:15;14944:4;14941:1;14934:15;14960:580;15037:4;15043:6;15103:11;15090:25;15193:66;15182:8;15166:14;15162:29;15158:102;15138:18;15134:127;15124:155;;15275:1;15272;15265:12;15124:155;15302:33;;15354:20;;;-1:-1:-1;15397:18:17;15386:30;;15383:50;;;15429:1;15426;15419:12;15383:50;15462:4;15450:17;;-1:-1:-1;15493:14:17;15489:27;;;15479:38;;15476:58;;;15530:1;15527;15520:12;15545:184;15597:77;15594:1;15587:88;15694:4;15691:1;15684:15;15718:4;15715:1;15708:15;15734:128;15801:9;;;15822:11;;;15819:37;;;15836:18;;:::i;16341:277::-;16408:6;16461:2;16449:9;16440:7;16436:23;16432:32;16429:52;;;16477:1;16474;16467:12;16429:52;16509:9;16503:16;16562:5;16555:13;16548:21;16541:5;16538:32;16528:60;;16584:1;16581;16574:12;19674:1240;19804:3;19833:1;19866:6;19860:13;19896:1;19916;19943:9;19940:1;19936:17;19926:27;;20003:1;19992:9;19988:17;20024:18;20014:61;;20068:4;20060:6;20056:17;20046:27;;20014:61;20094:2;20142;20134:6;20131:14;20111:18;20108:38;20105:218;;20179:77;20176:1;20169:88;20280:4;20277:1;20270:15;20308:4;20305:1;20298:15;20105:218;20339:18;20366:191;;;;20571:1;20566:323;;;;20332:557;;20366:191;20414:66;20403:9;20399:82;20394:3;20387:95;20537:6;20530:14;20523:22;20515:6;20511:35;20506:3;20502:45;20495:52;;20366:191;;20566:323;19621:1;19614:14;;;19658:4;19645:18;;20664:1;20678:165;20692:6;20689:1;20686:13;20678:165;;;20770:14;;20757:11;;;20750:35;20813:16;;;;20707:10;;20678:165;;;20682:3;;20872:6;20867:3;20863:16;20856:23;;20332:557;-1:-1:-1;20905:3:17;;19674:1240;-1:-1:-1;;;;;;;;19674:1240:17:o;21785:125::-;21850:9;;;21871:10;;;21868:36;;;21884:18;;:::i;22322:301::-;22451:3;22489:6;22483:13;22535:6;22528:4;22520:6;22516:17;22511:3;22505:37;22597:1;22561:16;;22586:13;;;-1:-1:-1;22561:16:17;22322:301;-1:-1:-1;22322:301:17:o
Swarm Source
ipfs://75043171e4acfec8ecca490f57bc1a821658e55573425b38497fd44d57dbf073
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.
Add Token to MetaMask (Web3)