Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 265 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 25364620 | 2 days ago | IN | 0 HYPE | 0.00000462 | ||||
| Approve | 25327405 | 2 days ago | IN | 0 HYPE | 0.00003987 | ||||
| Transfer | 25145393 | 4 days ago | IN | 0 HYPE | 0.00005983 | ||||
| Approve | 24810310 | 8 days ago | IN | 0 HYPE | 0.00000462 | ||||
| Approve | 24680071 | 9 days ago | IN | 0 HYPE | 0.00019012 | ||||
| Permit | 24459687 | 12 days ago | IN | 0 HYPE | 0.00000888 | ||||
| Approve | 23436968 | 23 days ago | IN | 0 HYPE | 0.00003784 | ||||
| Approve | 23201298 | 26 days ago | IN | 0 HYPE | 0.00001488 | ||||
| Approve | 22824457 | 30 days ago | IN | 0 HYPE | 0.00004025 | ||||
| Approve | 22789557 | 31 days ago | IN | 0 HYPE | 0.00000462 | ||||
| Approve | 22542214 | 34 days ago | IN | 0 HYPE | 0.00012019 | ||||
| Approve | 22369978 | 36 days ago | IN | 0 HYPE | 0.00008071 | ||||
| Approve | 22094867 | 39 days ago | IN | 0 HYPE | 0.0006143 | ||||
| Approve | 22094038 | 39 days ago | IN | 0 HYPE | 0.00010676 | ||||
| Approve | 21729440 | 43 days ago | IN | 0 HYPE | 0.00001494 | ||||
| Transfer | 21654382 | 44 days ago | IN | 0 HYPE | 0.00001773 | ||||
| Approve | 21569840 | 45 days ago | IN | 0 HYPE | 0.00002772 | ||||
| Approve | 21555853 | 45 days ago | IN | 0 HYPE | 0.00002773 | ||||
| Transfer | 21209673 | 49 days ago | IN | 0 HYPE | 0.00000391 | ||||
| Transfer | 21209660 | 49 days ago | IN | 0 HYPE | 0.00000507 | ||||
| Transfer | 21209641 | 49 days ago | IN | 0 HYPE | 0.00002629 | ||||
| Transfer | 21209627 | 49 days ago | IN | 0 HYPE | 0.00000818 | ||||
| Transfer | 21209610 | 49 days ago | IN | 0 HYPE | 0.00000615 | ||||
| Transfer | 21209596 | 49 days ago | IN | 0 HYPE | 0.00000414 | ||||
| Transfer | 21209578 | 49 days ago | IN | 0 HYPE | 0.00000746 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 15844252 | 110 days ago | Contract Creation | 0 HYPE |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BoringVault
Compiler Version
v0.8.21+commit.d9974bed
Optimization Enabled:
Yes with 200 runs
Other Settings:
shanghai EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.21;
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 "src/interfaces/BeforeTransferHook.sol";
import { Auth, Authority } from "@solmate/auth/Auth.sol";
/**
* @title BoringVault
* @custom:security-contact [email protected]
*/
contract BoringVault is ERC20, Auth, ERC721Holder, ERC1155Holder {
using Address for address;
using SafeTransferLib for ERC20;
using FixedPointMathLib for uint256;
// ========================================= STATE =========================================
/**
* @notice Contract responsible 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 Requires auth.
*/
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 Requires auth.
*/
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 Check if from addresses shares are locked, reverting if so.
*/
function _callBeforeTransfer(address from) internal view {
if (address(hook) != address(0)) hook.beforeTransfer(from);
}
function transfer(address to, uint256 amount) public override returns (bool) {
_callBeforeTransfer(msg.sender);
return super.transfer(to, amount);
}
function transferFrom(address from, address to, uint256 amount) public override returns (bool) {
_callBeforeTransfer(from);
return super.transferFrom(from, to, amount);
}
//============================== RECEIVE ===============================
receive() external payable { }
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)
pragma solidity ^0.8.20;
import {Errors} from "./Errors.sol";
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev There's no code at `target` (it is not a contract).
*/
error AddressEmptyCode(address target);
/**
* @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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
if (address(this).balance < amount) {
revert Errors.InsufficientBalance(address(this).balance, amount);
}
(bool success, ) = recipient.call{value: amount}("");
if (!success) {
revert Errors.FailedCall();
}
}
/**
* @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 or custom error, it is bubbled
* up by this function (like regular Solidity function calls). However, if
* the call reverted with no returned reason, this function reverts with a
* {Errors.FailedCall} error.
*
* 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.
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0);
}
/**
* @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`.
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
if (address(this).balance < value) {
revert Errors.InsufficientBalance(address(this).balance, value);
}
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
* was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case
* of an unsuccessful call.
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata
) internal view returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
// only check if target is a contract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
if (returndata.length == 0 && target.code.length == 0) {
revert AddressEmptyCode(target);
}
return returndata;
}
}
/**
* @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
* revert reason or with a default {Errors.FailedCall} error.
*/
function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
return returndata;
}
}
/**
* @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.
*/
function _revert(bytes memory returndata) 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 Errors.FailedCall();
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/utils/ERC721Holder.sol)
pragma solidity ^0.8.20;
import {IERC721Receiver} from "../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}.
*/
abstract contract ERC721Holder is IERC721Receiver {
/**
* @dev See {IERC721Receiver-onERC721Received}.
*
* Always returns `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(address, address, uint256, bytes memory) public virtual returns (bytes4) {
return this.onERC721Received.selector;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/utils/ERC1155Holder.sol)
pragma solidity ^0.8.20;
import {IERC165, ERC165} from "../../../utils/introspection/ERC165.sol";
import {IERC1155Receiver} from "../IERC1155Receiver.sol";
/**
* @dev Simple implementation of `IERC1155Receiver` that will allow a contract to hold ERC-1155 tokens.
*
* IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be
* stuck.
*/
abstract contract ERC1155Holder 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);
}
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: 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.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
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.
success := and(
// 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.
or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
// 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.
// Counterintuitively, this call must be positioned second to the or() call in the
// surrounding and() call or else returndatasize() will be zero during the computation.
call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
)
}
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.
success := and(
// 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.
or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
// 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.
// Counterintuitively, this call must be positioned second to the or() call in the
// surrounding and() call or else returndatasize() will be zero during the computation.
call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
)
}
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.
success := and(
// 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.
or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
// 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.
// Counterintuitively, this call must be positioned second to the or() call in the
// surrounding and() call or else returndatasize() will be zero during the computation.
call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
)
}
require(success, "APPROVE_FAILED");
}
}// 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: MIT
pragma solidity 0.8.21;
interface BeforeTransferHook {
function beforeTransfer(address from) 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: MIT
pragma solidity ^0.8.20;
/**
* @dev Collection of common custom errors used in multiple contracts
*
* IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.
* It is recommended to avoid relying on the error API for critical functionality.
*/
library Errors {
/**
* @dev The ETH balance of the account is not enough to perform the operation.
*/
error InsufficientBalance(uint256 balance, uint256 needed);
/**
* @dev A call to an address target failed. The target may have reverted.
*/
error FailedCall();
/**
* @dev The deployment failed.
*/
error FailedDeployment();
/**
* @dev A necessary precompile is missing.
*/
error MissingPrecompile(address);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.20;
/**
* @title ERC-721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC-721 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 v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC-165 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);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155Receiver.sol)
pragma solidity ^0.8.20;
import {IERC165} from "../../utils/introspection/IERC165.sol";
/**
* @dev Interface that must be implemented by smart contracts in order to receive
* ERC-1155 token transfers.
*/
interface IERC1155Receiver is IERC165 {
/**
* @dev Handles the receipt of a single ERC-1155 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 ERC-1155 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 v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[ERC].
*
* 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[ERC 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);
}{
"remappings": [
"@solmate/=lib/solmate/src/",
"@forge-std/=lib/forge-std/src/",
"forge-std/=lib/forge-std/src/",
"@ds-test/=lib/forge-std/lib/ds-test/src/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"@openzeppelin/=lib/openzeppelin-contracts/",
"@ion-protocol/=lib/ion-protocol/src/",
"@layerzerolabs/=node_modules/@layerzerolabs/",
"@axelar-network/=node_modules/@axelar-network/",
"@balancer-labs/v2-interfaces/=lib/ion-protocol/lib/balancer-v2-monorepo/pkg/interfaces/",
"@balancer-labs/v2-pool-stable/=lib/ion-protocol/lib/balancer-v2-monorepo/pkg/pool-stable/",
"@chainlink/=node_modules/@chainlink/",
"@eth-optimism/=node_modules/@eth-optimism/",
"@uniswap/v3-core/=lib/ion-protocol/lib/v3-core/",
"@uniswap/v3-periphery/=lib/ion-protocol/lib/v3-periphery/",
"balancer-v2-monorepo/=lib/ion-protocol/lib/",
"chainlink/=lib/ion-protocol/lib/chainlink/",
"createx/=lib/createx/src/",
"erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
"forge-safe/=lib/ion-protocol/lib/forge-safe/",
"halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
"hardhat-deploy/=node_modules/hardhat-deploy/",
"ion-protocol/=lib/ion-protocol/",
"openzeppelin-contracts-upgradeable/=lib/ion-protocol/lib/openzeppelin-contracts-upgradeable/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"openzeppelin/=lib/createx/lib/openzeppelin-contracts/contracts/",
"pendle-core-v2-public/=lib/ion-protocol/lib/pendle-core-v2-public/contracts/",
"solady/=lib/ion-protocol/lib/solady/",
"solarray/=lib/ion-protocol/lib/solarray/src/",
"solidity-bytes-utils/=node_modules/solidity-bytes-utils/",
"solidity-stringutils/=lib/ion-protocol/lib/forge-safe/lib/surl/lib/solidity-stringutils/",
"solmate/=lib/solmate/src/",
"surl/=lib/ion-protocol/lib/forge-safe/lib/surl/",
"v3-core/=lib/ion-protocol/lib/v3-core/",
"v3-periphery/=lib/v3-periphery/contracts/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "shanghai",
"viaIR": false
}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"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"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"},{"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":"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":"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"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60e060405234801562000010575f80fd5b506040516200223f3803806200223f833981016040819052620000339162000263565b835f848484836200004584826200038c565b5060016200005483826200038c565b5060ff81166080524660a0526200006a6200010b565b60c0525050600680546001600160a01b038086166001600160a01b03199283168117909355600780549186169190921617905560405190915033907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a36040516001600160a01b0382169033907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a3505050505050620004ce565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200013d919062000454565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001c9575f80fd5b81516001600160401b0380821115620001e657620001e6620001a5565b604051601f8301601f19908116603f01168101908282118183101715620002115762000211620001a5565b816040528381526020925086838588010111156200022d575f80fd5b5f91505b8382101562000250578582018301518183018401529082019062000231565b5f93810190920192909252949350505050565b5f805f806080858703121562000277575f80fd5b84516001600160a01b03811681146200028e575f80fd5b60208601519094506001600160401b0380821115620002ab575f80fd5b620002b988838901620001b9565b94506040870151915080821115620002cf575f80fd5b50620002de87828801620001b9565b925050606085015160ff81168114620002f5575f80fd5b939692955090935050565b600181811c908216806200031557607f821691505b6020821081036200033457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000387575f81815260208120601f850160051c81016020861015620003625750805b601f850160051c820191505b8181101562000383578281556001016200036e565b5050505b505050565b81516001600160401b03811115620003a857620003a8620001a5565b620003c081620003b9845462000300565b846200033a565b602080601f831160018114620003f6575f8415620003de5750858301515b5f19600386901b1c1916600185901b17855562000383565b5f85815260208120601f198616915b82811015620004265788860151825594840194600190910190840162000405565b50858210156200044457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f808354620004638162000300565b600182811680156200047e57600181146200049457620004c2565b60ff1984168752821515830287019450620004c2565b875f526020805f205f5b85811015620004b95781548a8201529084019082016200049e565b50505082870194505b50929695505050505050565b60805160a05160c051611d46620004f95f395f61092801525f6108f301525f6102e00152611d465ff3fe60806040526004361061017e575f3560e01c80637ecebe00116100cd578063bc197c8111610087578063dd62ed3e11610062578063dd62ed3e146104cd578063f23a6e6114610503578063f2fde38b1461052e578063f6e715d01461054d575f80fd5b8063bc197c8114610464578063bf7e214f1461048f578063d505accf146104ae575f80fd5b80637ecebe00146103915780637f5a7c7b146103bc5780638929565f146103f35780638da5cb5b1461041257806395d89b4114610431578063a9059cbb14610445575f80fd5b8063224d8703116101385780633644e515116101135780633644e5151461031457806339d6ba321461032857806370a08231146103475780637a9e5e4b14610372575f80fd5b8063224d87031461028457806323b872dd146102b0578063313ce567146102cf575f80fd5b806301ffc9a71461018957806306fdde03146101bd578063095ea7b3146101de578063150b7a02146101fd57806318160ddd1461024057806318457e6114610263575f80fd5b3661018557005b5f80fd5b348015610194575f80fd5b506101a86101a336600461146a565b61056c565b60405190151581526020015b60405180910390f35b3480156101c8575f80fd5b506101d16105a2565b6040516101b491906114de565b3480156101e9575f80fd5b506101a86101f8366004611504565b61062d565b348015610208575f80fd5b506102276102173660046115df565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016101b4565b34801561024b575f80fd5b5061025560025481565b6040519081526020016101b4565b34801561026e575f80fd5b5061028261027d366004611647565b610698565b005b34801561028f575f80fd5b506102a361029e3660046116e6565b61075d565b6040516101b49190611779565b3480156102bb575f80fd5b506101a86102ca3660046117d9565b6108d1565b3480156102da575f80fd5b506103027f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016101b4565b34801561031f575f80fd5b506102556108f0565b348015610333575f80fd5b50610282610342366004611647565b61094a565b348015610352575f80fd5b50610255610361366004611817565b60036020525f908152604090205481565b34801561037d575f80fd5b5061028261038c366004611817565b6109f8565b34801561039c575f80fd5b506102556103ab366004611817565b60056020525f908152604090205481565b3480156103c7575f80fd5b506008546103db906001600160a01b031681565b6040516001600160a01b0390911681526020016101b4565b3480156103fe575f80fd5b5061028261040d366004611817565b610add565b34801561041d575f80fd5b506006546103db906001600160a01b031681565b34801561043c575f80fd5b506101d1610b30565b348015610450575f80fd5b506101a861045f366004611504565b610b3d565b34801561046f575f80fd5b5061022761047e3660046118af565b63bc197c8160e01b95945050505050565b34801561049a575f80fd5b506007546103db906001600160a01b031681565b3480156104b9575f80fd5b506102826104c8366004611956565b610b51565b3480156104d8575f80fd5b506102556104e73660046119c7565b600460209081525f928352604080842090915290825290205481565b34801561050e575f80fd5b5061022761051d3660046119fe565b63f23a6e6160e01b95945050505050565b348015610539575f80fd5b50610282610548366004611817565b610d8f565b348015610558575f80fd5b506101d1610567366004611a62565b610e0b565b5f6001600160e01b03198216630271189760e51b148061059c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f80546105ae90611ae6565b80601f01602080910402602001604051908101604052809291908181526020018280546105da90611ae6565b80156106255780601f106105fc57610100808354040283529160200191610625565b820191905f5260205f20905b81548152906001019060200180831161060857829003601f168201915b505050505081565b335f8181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106879086815260200190565b60405180910390a350600192915050565b6106ad335f356001600160e01b031916610e91565b6106d25760405162461bcd60e51b81526004016106c990611b1e565b60405180910390fd5b6106dc8282610f38565b82156106f6576106f66001600160a01b0385168685610f9f565b816001600160a01b0316846001600160a01b0316866001600160a01b03167fe0c82280a1164680e0cf43be7db4c4c9f985423623ad7a544fb76c772bdc6043868560405161074e929190918252602082015260400190565b60405180910390a45050505050565b6060610774335f356001600160e01b031916610e91565b6107905760405162461bcd60e51b81526004016106c990611b1e565b858067ffffffffffffffff8111156107aa576107aa61152e565b6040519080825280602002602001820160405280156107dd57816020015b60608152602001906001900390816107c85790505b5091505f5b818110156108c5576108978787838181106107ff576107ff611b44565b90506020028101906108119190611b58565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525089925088915085905081811061085957610859611b44565b905060200201358b8b8581811061087257610872611b44565b90506020020160208101906108879190611817565b6001600160a01b03169190611022565b8382815181106108a9576108a9611b44565b6020026020010181905250806108be90611baf565b90506107e2565b50509695505050505050565b5f6108db846110c2565b6108e6848484611130565b90505b9392505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146109255761092061120a565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b61095f335f356001600160e01b031916610e91565b61097b5760405162461bcd60e51b81526004016106c990611b1e565b8215610996576109966001600160a01b0385168630866112a2565b6109a08282611333565b816001600160a01b0316846001600160a01b0316866001600160a01b03167fea00f88768a86184a6e515238a549c171769fe7460a011d6fd0bcd48ca078ea4868560405161074e929190918252602082015260400190565b6006546001600160a01b0316331480610a8a575060075460405163b700961360e01b81526001600160a01b039091169063b700961390610a4b90339030906001600160e01b03195f351690600401611bc7565b602060405180830381865afa158015610a66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a8a9190611bf4565b610a92575f80fd5b600780546001600160a01b0319166001600160a01b03831690811790915560405133907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a350565b610af2335f356001600160e01b031916610e91565b610b0e5760405162461bcd60e51b81526004016106c990611b1e565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600180546105ae90611ae6565b5f610b47336110c2565b6108e98383611382565b42841015610ba15760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064016106c9565b5f6001610bac6108f0565b6001600160a01b038a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f1981840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610cb4573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590610cea5750876001600160a01b0316816001600160a01b0316145b610d275760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b60448201526064016106c9565b6001600160a01b039081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b610da4335f356001600160e01b031916610e91565b610dc05760405162461bcd60e51b81526004016106c990611b1e565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b6060610e22335f356001600160e01b031916610e91565b610e3e5760405162461bcd60e51b81526004016106c990611b1e565b610e8884848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050506001600160a01b03881691905084611022565b95945050505050565b6007545f906001600160a01b03168015801590610f18575060405163b700961360e01b81526001600160a01b0382169063b700961390610ed990879030908890600401611bc7565b602060405180830381865afa158015610ef4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f189190611bf4565b80610f3057506006546001600160a01b038581169116145b949350505050565b6001600160a01b0382165f9081526003602052604081208054839290610f5f908490611c13565b90915550506002805482900390556040518181525f906001600160a01b038416905f80516020611cf1833981519152906020015b60405180910390a35050565b5f60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af13d15601f3d1160015f51141617169150508061101c5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b60448201526064016106c9565b50505050565b60608147101561104e5760405163cf47918160e01b8152476004820152602481018390526044016106c9565b5f80856001600160a01b031684866040516110699190611c26565b5f6040518083038185875af1925050503d805f81146110a3576040519150601f19603f3d011682016040523d82523d5f602084013e6110a8565b606091505b50915091506110b88683836113e5565b9695505050505050565b6008546001600160a01b03161561112d5760085460405163e83931af60e01b81526001600160a01b0383811660048301529091169063e83931af906024015f6040518083038186803b158015611116575f80fd5b505afa158015611128573d5f803e3d5ffd5b505050505b50565b6001600160a01b0383165f9081526004602090815260408083203384529091528120545f198114611189576111658382611c13565b6001600160a01b0386165f9081526004602090815260408083203384529091529020555b6001600160a01b0385165f90815260036020526040812080548592906111b0908490611c13565b90915550506001600160a01b038085165f81815260036020526040908190208054870190555190918716905f80516020611cf1833981519152906111f79087815260200190565b60405180910390a3506001949350505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161123a9190611c41565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f6040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b038416602482015282604482015260205f6064835f8a5af13d15601f3d1160015f5114161716915050806111285760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b60448201526064016106c9565b8060025f8282546113449190611cdd565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481525f80516020611cf18339815191529101610f93565b335f908152600360205260408120805483919083906113a2908490611c13565b90915550506001600160a01b0383165f81815260036020526040908190208054850190555133905f80516020611cf1833981519152906106879086815260200190565b6060826113fa576113f582611441565b6108e9565b815115801561141157506001600160a01b0384163b155b1561143a57604051639996b31560e01b81526001600160a01b03851660048201526024016106c9565b50806108e9565b8051156114515780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f6020828403121561147a575f80fd5b81356001600160e01b0319811681146108e9575f80fd5b5f5b838110156114ab578181015183820152602001611493565b50505f910152565b5f81518084526114ca816020860160208601611491565b601f01601f19169290920160200192915050565b602081525f6108e960208301846114b3565b6001600160a01b038116811461112d575f80fd5b5f8060408385031215611515575f80fd5b8235611520816114f0565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561156b5761156b61152e565b604052919050565b5f82601f830112611582575f80fd5b813567ffffffffffffffff81111561159c5761159c61152e565b6115af601f8201601f1916602001611542565b8181528460208386010111156115c3575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f80608085870312156115f2575f80fd5b84356115fd816114f0565b9350602085013561160d816114f0565b925060408501359150606085013567ffffffffffffffff81111561162f575f80fd5b61163b87828801611573565b91505092959194509250565b5f805f805f60a0868803121561165b575f80fd5b8535611666816114f0565b94506020860135611676816114f0565b935060408601359250606086013561168d816114f0565b949793965091946080013592915050565b5f8083601f8401126116ae575f80fd5b50813567ffffffffffffffff8111156116c5575f80fd5b6020830191508360208260051b85010111156116df575f80fd5b9250929050565b5f805f805f80606087890312156116fb575f80fd5b863567ffffffffffffffff80821115611712575f80fd5b61171e8a838b0161169e565b90985096506020890135915080821115611736575f80fd5b6117428a838b0161169e565b9096509450604089013591508082111561175a575f80fd5b5061176789828a0161169e565b979a9699509497509295939492505050565b5f602080830181845280855180835260408601915060408160051b87010192508387015f5b828110156117cc57603f198886030184526117ba8583516114b3565b9450928501929085019060010161179e565b5092979650505050505050565b5f805f606084860312156117eb575f80fd5b83356117f6816114f0565b92506020840135611806816114f0565b929592945050506040919091013590565b5f60208284031215611827575f80fd5b81356108e9816114f0565b5f82601f830112611841575f80fd5b8135602067ffffffffffffffff82111561185d5761185d61152e565b8160051b61186c828201611542565b9283528481018201928281019087851115611885575f80fd5b83870192505b848310156118a45782358252918301919083019061188b565b979650505050505050565b5f805f805f60a086880312156118c3575f80fd5b85356118ce816114f0565b945060208601356118de816114f0565b9350604086013567ffffffffffffffff808211156118fa575f80fd5b61190689838a01611832565b9450606088013591508082111561191b575f80fd5b61192789838a01611832565b9350608088013591508082111561193c575f80fd5b5061194988828901611573565b9150509295509295909350565b5f805f805f805f60e0888a03121561196c575f80fd5b8735611977816114f0565b96506020880135611987816114f0565b95506040880135945060608801359350608088013560ff811681146119aa575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156119d8575f80fd5b82356119e3816114f0565b915060208301356119f3816114f0565b809150509250929050565b5f805f805f60a08688031215611a12575f80fd5b8535611a1d816114f0565b94506020860135611a2d816114f0565b93506040860135925060608601359150608086013567ffffffffffffffff811115611a56575f80fd5b61194988828901611573565b5f805f8060608587031215611a75575f80fd5b8435611a80816114f0565b9350602085013567ffffffffffffffff80821115611a9c575f80fd5b818701915087601f830112611aaf575f80fd5b813581811115611abd575f80fd5b886020828501011115611ace575f80fd5b95986020929092019750949560400135945092505050565b600181811c90821680611afa57607f821691505b602082108103611b1857634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f808335601e19843603018112611b6d575f80fd5b83018035915067ffffffffffffffff821115611b87575f80fd5b6020019150368190038213156116df575f80fd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201611bc057611bc0611b9b565b5060010190565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f60208284031215611c04575f80fd5b815180151581146108e9575f80fd5b8181038181111561059c5761059c611b9b565b5f8251611c37818460208701611491565b9190910192915050565b5f80835481600182811c915080831680611c5c57607f831692505b60208084108203611c7b57634e487b7160e01b86526022600452602486fd5b818015611c8f5760018114611ca457611ccf565b60ff1986168952841515850289019650611ccf565b5f8a8152602090205f5b86811015611cc75781548b820152908501908301611cae565b505084890196505b509498975050505050505050565b8082018082111561059c5761059c611b9b56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212200abcada56eeb61e3a408cfd4e74ebccaa027c43bfb2d520c584c464bdc1bee0864736f6c634300081500330000000000000000000000003cfb6b7fc75f8a7141a67eaed3ee3cb366cae237000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000105374616b6564204879706572776176650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054757415645000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061017e575f3560e01c80637ecebe00116100cd578063bc197c8111610087578063dd62ed3e11610062578063dd62ed3e146104cd578063f23a6e6114610503578063f2fde38b1461052e578063f6e715d01461054d575f80fd5b8063bc197c8114610464578063bf7e214f1461048f578063d505accf146104ae575f80fd5b80637ecebe00146103915780637f5a7c7b146103bc5780638929565f146103f35780638da5cb5b1461041257806395d89b4114610431578063a9059cbb14610445575f80fd5b8063224d8703116101385780633644e515116101135780633644e5151461031457806339d6ba321461032857806370a08231146103475780637a9e5e4b14610372575f80fd5b8063224d87031461028457806323b872dd146102b0578063313ce567146102cf575f80fd5b806301ffc9a71461018957806306fdde03146101bd578063095ea7b3146101de578063150b7a02146101fd57806318160ddd1461024057806318457e6114610263575f80fd5b3661018557005b5f80fd5b348015610194575f80fd5b506101a86101a336600461146a565b61056c565b60405190151581526020015b60405180910390f35b3480156101c8575f80fd5b506101d16105a2565b6040516101b491906114de565b3480156101e9575f80fd5b506101a86101f8366004611504565b61062d565b348015610208575f80fd5b506102276102173660046115df565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016101b4565b34801561024b575f80fd5b5061025560025481565b6040519081526020016101b4565b34801561026e575f80fd5b5061028261027d366004611647565b610698565b005b34801561028f575f80fd5b506102a361029e3660046116e6565b61075d565b6040516101b49190611779565b3480156102bb575f80fd5b506101a86102ca3660046117d9565b6108d1565b3480156102da575f80fd5b506103027f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff90911681526020016101b4565b34801561031f575f80fd5b506102556108f0565b348015610333575f80fd5b50610282610342366004611647565b61094a565b348015610352575f80fd5b50610255610361366004611817565b60036020525f908152604090205481565b34801561037d575f80fd5b5061028261038c366004611817565b6109f8565b34801561039c575f80fd5b506102556103ab366004611817565b60056020525f908152604090205481565b3480156103c7575f80fd5b506008546103db906001600160a01b031681565b6040516001600160a01b0390911681526020016101b4565b3480156103fe575f80fd5b5061028261040d366004611817565b610add565b34801561041d575f80fd5b506006546103db906001600160a01b031681565b34801561043c575f80fd5b506101d1610b30565b348015610450575f80fd5b506101a861045f366004611504565b610b3d565b34801561046f575f80fd5b5061022761047e3660046118af565b63bc197c8160e01b95945050505050565b34801561049a575f80fd5b506007546103db906001600160a01b031681565b3480156104b9575f80fd5b506102826104c8366004611956565b610b51565b3480156104d8575f80fd5b506102556104e73660046119c7565b600460209081525f928352604080842090915290825290205481565b34801561050e575f80fd5b5061022761051d3660046119fe565b63f23a6e6160e01b95945050505050565b348015610539575f80fd5b50610282610548366004611817565b610d8f565b348015610558575f80fd5b506101d1610567366004611a62565b610e0b565b5f6001600160e01b03198216630271189760e51b148061059c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f80546105ae90611ae6565b80601f01602080910402602001604051908101604052809291908181526020018280546105da90611ae6565b80156106255780601f106105fc57610100808354040283529160200191610625565b820191905f5260205f20905b81548152906001019060200180831161060857829003601f168201915b505050505081565b335f8181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106879086815260200190565b60405180910390a350600192915050565b6106ad335f356001600160e01b031916610e91565b6106d25760405162461bcd60e51b81526004016106c990611b1e565b60405180910390fd5b6106dc8282610f38565b82156106f6576106f66001600160a01b0385168685610f9f565b816001600160a01b0316846001600160a01b0316866001600160a01b03167fe0c82280a1164680e0cf43be7db4c4c9f985423623ad7a544fb76c772bdc6043868560405161074e929190918252602082015260400190565b60405180910390a45050505050565b6060610774335f356001600160e01b031916610e91565b6107905760405162461bcd60e51b81526004016106c990611b1e565b858067ffffffffffffffff8111156107aa576107aa61152e565b6040519080825280602002602001820160405280156107dd57816020015b60608152602001906001900390816107c85790505b5091505f5b818110156108c5576108978787838181106107ff576107ff611b44565b90506020028101906108119190611b58565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525089925088915085905081811061085957610859611b44565b905060200201358b8b8581811061087257610872611b44565b90506020020160208101906108879190611817565b6001600160a01b03169190611022565b8382815181106108a9576108a9611b44565b6020026020010181905250806108be90611baf565b90506107e2565b50509695505050505050565b5f6108db846110c2565b6108e6848484611130565b90505b9392505050565b5f7f00000000000000000000000000000000000000000000000000000000000003e746146109255761092061120a565b905090565b507fef92109deda9ae4797a2dc512644f3e4d19e7073a14529b6a199ed214a6b0b7490565b61095f335f356001600160e01b031916610e91565b61097b5760405162461bcd60e51b81526004016106c990611b1e565b8215610996576109966001600160a01b0385168630866112a2565b6109a08282611333565b816001600160a01b0316846001600160a01b0316866001600160a01b03167fea00f88768a86184a6e515238a549c171769fe7460a011d6fd0bcd48ca078ea4868560405161074e929190918252602082015260400190565b6006546001600160a01b0316331480610a8a575060075460405163b700961360e01b81526001600160a01b039091169063b700961390610a4b90339030906001600160e01b03195f351690600401611bc7565b602060405180830381865afa158015610a66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a8a9190611bf4565b610a92575f80fd5b600780546001600160a01b0319166001600160a01b03831690811790915560405133907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a350565b610af2335f356001600160e01b031916610e91565b610b0e5760405162461bcd60e51b81526004016106c990611b1e565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600180546105ae90611ae6565b5f610b47336110c2565b6108e98383611382565b42841015610ba15760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064016106c9565b5f6001610bac6108f0565b6001600160a01b038a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f1981840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610cb4573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590610cea5750876001600160a01b0316816001600160a01b0316145b610d275760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b60448201526064016106c9565b6001600160a01b039081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b610da4335f356001600160e01b031916610e91565b610dc05760405162461bcd60e51b81526004016106c990611b1e565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b6060610e22335f356001600160e01b031916610e91565b610e3e5760405162461bcd60e51b81526004016106c990611b1e565b610e8884848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050506001600160a01b03881691905084611022565b95945050505050565b6007545f906001600160a01b03168015801590610f18575060405163b700961360e01b81526001600160a01b0382169063b700961390610ed990879030908890600401611bc7565b602060405180830381865afa158015610ef4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f189190611bf4565b80610f3057506006546001600160a01b038581169116145b949350505050565b6001600160a01b0382165f9081526003602052604081208054839290610f5f908490611c13565b90915550506002805482900390556040518181525f906001600160a01b038416905f80516020611cf1833981519152906020015b60405180910390a35050565b5f60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af13d15601f3d1160015f51141617169150508061101c5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b60448201526064016106c9565b50505050565b60608147101561104e5760405163cf47918160e01b8152476004820152602481018390526044016106c9565b5f80856001600160a01b031684866040516110699190611c26565b5f6040518083038185875af1925050503d805f81146110a3576040519150601f19603f3d011682016040523d82523d5f602084013e6110a8565b606091505b50915091506110b88683836113e5565b9695505050505050565b6008546001600160a01b03161561112d5760085460405163e83931af60e01b81526001600160a01b0383811660048301529091169063e83931af906024015f6040518083038186803b158015611116575f80fd5b505afa158015611128573d5f803e3d5ffd5b505050505b50565b6001600160a01b0383165f9081526004602090815260408083203384529091528120545f198114611189576111658382611c13565b6001600160a01b0386165f9081526004602090815260408083203384529091529020555b6001600160a01b0385165f90815260036020526040812080548592906111b0908490611c13565b90915550506001600160a01b038085165f81815260036020526040908190208054870190555190918716905f80516020611cf1833981519152906111f79087815260200190565b60405180910390a3506001949350505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161123a9190611c41565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f6040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b038416602482015282604482015260205f6064835f8a5af13d15601f3d1160015f5114161716915050806111285760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b60448201526064016106c9565b8060025f8282546113449190611cdd565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481525f80516020611cf18339815191529101610f93565b335f908152600360205260408120805483919083906113a2908490611c13565b90915550506001600160a01b0383165f81815260036020526040908190208054850190555133905f80516020611cf1833981519152906106879086815260200190565b6060826113fa576113f582611441565b6108e9565b815115801561141157506001600160a01b0384163b155b1561143a57604051639996b31560e01b81526001600160a01b03851660048201526024016106c9565b50806108e9565b8051156114515780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f6020828403121561147a575f80fd5b81356001600160e01b0319811681146108e9575f80fd5b5f5b838110156114ab578181015183820152602001611493565b50505f910152565b5f81518084526114ca816020860160208601611491565b601f01601f19169290920160200192915050565b602081525f6108e960208301846114b3565b6001600160a01b038116811461112d575f80fd5b5f8060408385031215611515575f80fd5b8235611520816114f0565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561156b5761156b61152e565b604052919050565b5f82601f830112611582575f80fd5b813567ffffffffffffffff81111561159c5761159c61152e565b6115af601f8201601f1916602001611542565b8181528460208386010111156115c3575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f80608085870312156115f2575f80fd5b84356115fd816114f0565b9350602085013561160d816114f0565b925060408501359150606085013567ffffffffffffffff81111561162f575f80fd5b61163b87828801611573565b91505092959194509250565b5f805f805f60a0868803121561165b575f80fd5b8535611666816114f0565b94506020860135611676816114f0565b935060408601359250606086013561168d816114f0565b949793965091946080013592915050565b5f8083601f8401126116ae575f80fd5b50813567ffffffffffffffff8111156116c5575f80fd5b6020830191508360208260051b85010111156116df575f80fd5b9250929050565b5f805f805f80606087890312156116fb575f80fd5b863567ffffffffffffffff80821115611712575f80fd5b61171e8a838b0161169e565b90985096506020890135915080821115611736575f80fd5b6117428a838b0161169e565b9096509450604089013591508082111561175a575f80fd5b5061176789828a0161169e565b979a9699509497509295939492505050565b5f602080830181845280855180835260408601915060408160051b87010192508387015f5b828110156117cc57603f198886030184526117ba8583516114b3565b9450928501929085019060010161179e565b5092979650505050505050565b5f805f606084860312156117eb575f80fd5b83356117f6816114f0565b92506020840135611806816114f0565b929592945050506040919091013590565b5f60208284031215611827575f80fd5b81356108e9816114f0565b5f82601f830112611841575f80fd5b8135602067ffffffffffffffff82111561185d5761185d61152e565b8160051b61186c828201611542565b9283528481018201928281019087851115611885575f80fd5b83870192505b848310156118a45782358252918301919083019061188b565b979650505050505050565b5f805f805f60a086880312156118c3575f80fd5b85356118ce816114f0565b945060208601356118de816114f0565b9350604086013567ffffffffffffffff808211156118fa575f80fd5b61190689838a01611832565b9450606088013591508082111561191b575f80fd5b61192789838a01611832565b9350608088013591508082111561193c575f80fd5b5061194988828901611573565b9150509295509295909350565b5f805f805f805f60e0888a03121561196c575f80fd5b8735611977816114f0565b96506020880135611987816114f0565b95506040880135945060608801359350608088013560ff811681146119aa575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156119d8575f80fd5b82356119e3816114f0565b915060208301356119f3816114f0565b809150509250929050565b5f805f805f60a08688031215611a12575f80fd5b8535611a1d816114f0565b94506020860135611a2d816114f0565b93506040860135925060608601359150608086013567ffffffffffffffff811115611a56575f80fd5b61194988828901611573565b5f805f8060608587031215611a75575f80fd5b8435611a80816114f0565b9350602085013567ffffffffffffffff80821115611a9c575f80fd5b818701915087601f830112611aaf575f80fd5b813581811115611abd575f80fd5b886020828501011115611ace575f80fd5b95986020929092019750949560400135945092505050565b600181811c90821680611afa57607f821691505b602082108103611b1857634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f808335601e19843603018112611b6d575f80fd5b83018035915067ffffffffffffffff821115611b87575f80fd5b6020019150368190038213156116df575f80fd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201611bc057611bc0611b9b565b5060010190565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f60208284031215611c04575f80fd5b815180151581146108e9575f80fd5b8181038181111561059c5761059c611b9b565b5f8251611c37818460208701611491565b9190910192915050565b5f80835481600182811c915080831680611c5c57607f831692505b60208084108203611c7b57634e487b7160e01b86526022600452602486fd5b818015611c8f5760018114611ca457611ccf565b60ff1986168952841515850289019650611ccf565b5f8a8152602090205f5b86811015611cc75781548b820152908501908301611cae565b505084890196505b509498975050505050505050565b8082018082111561059c5761059c611b9b56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212200abcada56eeb61e3a408cfd4e74ebccaa027c43bfb2d520c584c464bdc1bee0864736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003cfb6b7fc75f8a7141a67eaed3ee3cb366cae237000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000105374616b6564204879706572776176650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054757415645000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _owner (address): 0x3CFb6B7FC75f8A7141a67eAed3Ee3cB366CAE237
Arg [1] : _name (string): Staked Hyperwave
Arg [2] : _symbol (string): GWAVE
Arg [3] : _decimals (uint8): 18
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000003cfb6b7fc75f8a7141a67eaed3ee3cb366cae237
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [5] : 5374616b65642048797065727761766500000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 4757415645000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in HYPE
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.