Source Code
Latest 25 from a total of 49,501 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Grant Approvals | 30201770 | 2 days ago | IN | 0 ETH | 0.00000022 | ||||
| Grant Approvals | 30046402 | 5 days ago | IN | 0 ETH | 0.00000029 | ||||
| Grant Approvals | 29830009 | 10 days ago | IN | 0 ETH | 0.00000471 | ||||
| Grant Approvals | 29664089 | 14 days ago | IN | 0 ETH | 0.00000116 | ||||
| Grant Approvals | 29649191 | 14 days ago | IN | 0 ETH | 0.0000007 | ||||
| Grant Approvals | 29368263 | 21 days ago | IN | 0 ETH | 0.00000024 | ||||
| Grant Approvals | 29326154 | 22 days ago | IN | 0 ETH | 0.00000014 | ||||
| Grant Approvals | 28989841 | 30 days ago | IN | 0 ETH | 0.00000004 | ||||
| Grant Approvals | 28775597 | 35 days ago | IN | 0 ETH | 0.00000004 | ||||
| Grant Approvals | 28362376 | 44 days ago | IN | 0 ETH | 0.0000004 | ||||
| Grant Approvals | 28269656 | 46 days ago | IN | 0 ETH | 0.0000571 | ||||
| Grant Approvals | 27752730 | 58 days ago | IN | 0 ETH | 0.00000004 | ||||
| Grant Approvals | 27703087 | 59 days ago | IN | 0 ETH | 0.00000004 | ||||
| Grant Approvals | 27660876 | 60 days ago | IN | 0 ETH | 0 | ||||
| Grant Approvals | 27564759 | 63 days ago | IN | 0 ETH | 0 | ||||
| Grant Approvals | 27395310 | 67 days ago | IN | 0 ETH | 0.00000001 | ||||
| Grant Approvals | 27384051 | 67 days ago | IN | 0 ETH | 0.00000005 | ||||
| Grant Approvals | 27323763 | 68 days ago | IN | 0 ETH | 0.00000003 | ||||
| Grant Approvals | 27319578 | 68 days ago | IN | 0 ETH | 0.00000002 | ||||
| Grant Approvals | 27275010 | 69 days ago | IN | 0 ETH | 0.00000001 | ||||
| Grant Approvals | 27265511 | 70 days ago | IN | 0 ETH | 0 | ||||
| Grant Approvals | 27237518 | 70 days ago | IN | 0 ETH | 0.00000001 | ||||
| Grant Approvals | 27233498 | 70 days ago | IN | 0 ETH | 0 | ||||
| Grant Approvals | 27227904 | 70 days ago | IN | 0 ETH | 0.00000004 | ||||
| Grant Approvals | 27219321 | 71 days ago | IN | 0 ETH | 0 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers.
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | ||||
|---|---|---|---|---|---|---|---|
| 30249934 | 22 hrs ago | 0 ETH | |||||
| 30249934 | 22 hrs ago | 0 ETH | |||||
| 30201776 | 2 days ago | 0 ETH | |||||
| 30201776 | 2 days ago | 0 ETH | |||||
| 29947272 | 7 days ago | 0 ETH | |||||
| 29947272 | 7 days ago | 0 ETH | |||||
| 29725960 | 13 days ago | 0 ETH | |||||
| 29725960 | 13 days ago | 0 ETH | |||||
| 29719326 | 13 days ago | 0 ETH | |||||
| 29719326 | 13 days ago | 0 ETH | |||||
| 29696793 | 13 days ago | 0 ETH | |||||
| 29696793 | 13 days ago | 0 ETH | |||||
| 29683012 | 14 days ago | 0 ETH | |||||
| 29683012 | 14 days ago | 0 ETH | |||||
| 29649261 | 14 days ago | 0 ETH | |||||
| 29649261 | 14 days ago | 0 ETH | |||||
| 29450367 | 19 days ago | 0 ETH | |||||
| 29450367 | 19 days ago | 0 ETH | |||||
| 29449674 | 19 days ago | 0 ETH | |||||
| 29449674 | 19 days ago | 0 ETH | |||||
| 29447016 | 19 days ago | 0 ETH | |||||
| 29447016 | 19 days ago | 0 ETH | |||||
| 29368274 | 21 days ago | 0 ETH | |||||
| 29368274 | 21 days ago | 0 ETH | |||||
| 29327269 | 22 days ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BlastTransferManager
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
import {OwnableTwoSteps} from "@looksrare/contracts-libs/contracts/OwnableTwoSteps.sol";
import {LowLevelERC20Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC20Transfer.sol";
import {LowLevelERC721Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC721Transfer.sol";
import {LowLevelERC1155Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC1155Transfer.sol";
import {TransferManager} from "./TransferManager.sol";
import {IBlast, YieldMode, GasMode} from "./interfaces/IBlast.sol";
/**
* @title BlastTransferManager
* @notice This contract provides the transfer functions for ERC20/ERC721/ERC1155 for contracts on Blast that require them.
* @author YOLO Games protocol team
*/
contract BlastTransferManager is TransferManager {
/**
* @notice Constructor
* @param _owner Owner address
* @param _blast Blast yield contract
*/
constructor(address _owner, address _blast) TransferManager(_owner) {
IBlast(_blast).configure(YieldMode.CLAIMABLE, GasMode.CLAIMABLE, _owner);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
// Interfaces
import {IOwnableTwoSteps} from "./interfaces/IOwnableTwoSteps.sol";
/**
* @title OwnableTwoSteps
* @notice This contract offers transfer of ownership in two steps with potential owner
* having to confirm the transaction to become the owner.
* Renouncement of the ownership is also a two-step process since the next potential owner is the address(0).
* @author LooksRare protocol team (👀,💎)
*/
abstract contract OwnableTwoSteps is IOwnableTwoSteps {
/**
* @notice Address of the current owner.
*/
address public owner;
/**
* @notice Address of the potential owner.
*/
address public potentialOwner;
/**
* @notice Ownership status.
*/
Status public ownershipStatus;
/**
* @notice Modifier to wrap functions for contracts that inherit this contract.
*/
modifier onlyOwner() {
_onlyOwner();
_;
}
/**
* @notice Constructor
* @param _owner The contract's owner
*/
constructor(address _owner) {
owner = _owner;
emit NewOwner(_owner);
}
/**
* @notice This function is used to cancel the ownership transfer.
* @dev This function can be used for both cancelling a transfer to a new owner and
* cancelling the renouncement of the ownership.
*/
function cancelOwnershipTransfer() external onlyOwner {
Status _ownershipStatus = ownershipStatus;
if (_ownershipStatus == Status.NoOngoingTransfer) {
revert NoOngoingTransferInProgress();
}
if (_ownershipStatus == Status.TransferInProgress) {
delete potentialOwner;
}
delete ownershipStatus;
emit CancelOwnershipTransfer();
}
/**
* @notice This function is used to confirm the ownership renouncement.
*/
function confirmOwnershipRenouncement() external onlyOwner {
if (ownershipStatus != Status.RenouncementInProgress) {
revert RenouncementNotInProgress();
}
delete owner;
delete ownershipStatus;
emit NewOwner(address(0));
}
/**
* @notice This function is used to confirm the ownership transfer.
* @dev This function can only be called by the current potential owner.
*/
function confirmOwnershipTransfer() external {
if (ownershipStatus != Status.TransferInProgress) {
revert TransferNotInProgress();
}
if (msg.sender != potentialOwner) {
revert WrongPotentialOwner();
}
owner = msg.sender;
delete ownershipStatus;
delete potentialOwner;
emit NewOwner(msg.sender);
}
/**
* @notice This function is used to initiate the transfer of ownership to a new owner.
* @param newPotentialOwner New potential owner address
*/
function initiateOwnershipTransfer(address newPotentialOwner) external onlyOwner {
if (ownershipStatus != Status.NoOngoingTransfer) {
revert TransferAlreadyInProgress();
}
ownershipStatus = Status.TransferInProgress;
potentialOwner = newPotentialOwner;
/**
* @dev This function can only be called by the owner, so msg.sender is the owner.
* We don't have to SLOAD the owner again.
*/
emit InitiateOwnershipTransfer(msg.sender, newPotentialOwner);
}
/**
* @notice This function is used to initiate the ownership renouncement.
*/
function initiateOwnershipRenouncement() external onlyOwner {
if (ownershipStatus != Status.NoOngoingTransfer) {
revert TransferAlreadyInProgress();
}
ownershipStatus = Status.RenouncementInProgress;
emit InitiateOwnershipRenouncement();
}
function _onlyOwner() private view {
if (msg.sender != owner) revert NotOwner();
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
// Interfaces
import {IERC20} from "../interfaces/generic/IERC20.sol";
// Errors
import {ERC20TransferFail, ERC20TransferFromFail} from "../errors/LowLevelErrors.sol";
import {NotAContract} from "../errors/GenericErrors.sol";
/**
* @title LowLevelERC20Transfer
* @notice This contract contains low-level calls to transfer ERC20 tokens.
* @author LooksRare protocol team (👀,💎)
*/
contract LowLevelERC20Transfer {
/**
* @notice Execute ERC20 transferFrom
* @param currency Currency address
* @param from Sender address
* @param to Recipient address
* @param amount Amount to transfer
*/
function _executeERC20TransferFrom(address currency, address from, address to, uint256 amount) internal {
if (currency.code.length == 0) {
revert NotAContract();
}
(bool status, bytes memory data) = currency.call(abi.encodeCall(IERC20.transferFrom, (from, to, amount)));
if (!status) {
revert ERC20TransferFromFail();
}
if (data.length > 0) {
if (!abi.decode(data, (bool))) {
revert ERC20TransferFromFail();
}
}
}
/**
* @notice Execute ERC20 (direct) transfer
* @param currency Currency address
* @param to Recipient address
* @param amount Amount to transfer
*/
function _executeERC20DirectTransfer(address currency, address to, uint256 amount) internal {
if (currency.code.length == 0) {
revert NotAContract();
}
(bool status, bytes memory data) = currency.call(abi.encodeCall(IERC20.transfer, (to, amount)));
if (!status) {
revert ERC20TransferFail();
}
if (data.length > 0) {
if (!abi.decode(data, (bool))) {
revert ERC20TransferFail();
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
// Interfaces
import {IERC721} from "../interfaces/generic/IERC721.sol";
// Errors
import {ERC721TransferFromFail} from "../errors/LowLevelErrors.sol";
import {NotAContract} from "../errors/GenericErrors.sol";
/**
* @title LowLevelERC721Transfer
* @notice This contract contains low-level calls to transfer ERC721 tokens.
* @author LooksRare protocol team (👀,💎)
*/
contract LowLevelERC721Transfer {
/**
* @notice Execute ERC721 transferFrom
* @param collection Address of the collection
* @param from Address of the sender
* @param to Address of the recipient
* @param tokenId tokenId to transfer
*/
function _executeERC721TransferFrom(address collection, address from, address to, uint256 tokenId) internal {
if (collection.code.length == 0) {
revert NotAContract();
}
(bool status, ) = collection.call(abi.encodeCall(IERC721.transferFrom, (from, to, tokenId)));
if (!status) {
revert ERC721TransferFromFail();
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
// Interfaces
import {IERC1155} from "../interfaces/generic/IERC1155.sol";
// Errors
import {ERC1155SafeTransferFromFail, ERC1155SafeBatchTransferFromFail} from "../errors/LowLevelErrors.sol";
import {NotAContract} from "../errors/GenericErrors.sol";
/**
* @title LowLevelERC1155Transfer
* @notice This contract contains low-level calls to transfer ERC1155 tokens.
* @author LooksRare protocol team (👀,💎)
*/
contract LowLevelERC1155Transfer {
/**
* @notice Execute ERC1155 safeTransferFrom
* @param collection Address of the collection
* @param from Address of the sender
* @param to Address of the recipient
* @param tokenId tokenId to transfer
* @param amount Amount to transfer
*/
function _executeERC1155SafeTransferFrom(
address collection,
address from,
address to,
uint256 tokenId,
uint256 amount
) internal {
if (collection.code.length == 0) {
revert NotAContract();
}
(bool status, ) = collection.call(abi.encodeCall(IERC1155.safeTransferFrom, (from, to, tokenId, amount, "")));
if (!status) {
revert ERC1155SafeTransferFromFail();
}
}
/**
* @notice Execute ERC1155 safeBatchTransferFrom
* @param collection Address of the collection
* @param from Address of the sender
* @param to Address of the recipient
* @param tokenIds Array of tokenIds to transfer
* @param amounts Array of amounts to transfer
*/
function _executeERC1155SafeBatchTransferFrom(
address collection,
address from,
address to,
uint256[] calldata tokenIds,
uint256[] calldata amounts
) internal {
if (collection.code.length == 0) {
revert NotAContract();
}
(bool status, ) = collection.call(
abi.encodeCall(IERC1155.safeBatchTransferFrom, (from, to, tokenIds, amounts, ""))
);
if (!status) {
revert ERC1155SafeBatchTransferFromFail();
}
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
// LooksRare unopinionated libraries
import {OwnableTwoSteps} from "@looksrare/contracts-libs/contracts/OwnableTwoSteps.sol";
import {LowLevelERC20Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC20Transfer.sol";
import {LowLevelERC721Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC721Transfer.sol";
import {LowLevelERC1155Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC1155Transfer.sol";
// Interfaces and errors
import {ITransferManager} from "./interfaces/ITransferManager.sol";
import {AmountInvalid, LengthsInvalid} from "./errors/SharedErrors.sol";
// Enums
import {TokenType} from "./enums/TokenType.sol";
/**
* @title TransferManager
* @notice This contract provides the transfer functions for ERC20/ERC721/ERC1155 for contracts that require them.
* Token type "0" refers to ERC20 transfer functions.
* Token type "1" refers to ERC721 transfer functions.
* Token type "2" refers to ERC1155 transfer functions.
* @dev "Safe" transfer functions for ERC721 are not implemented since they come with added gas costs
* to verify if the recipient is a contract as it requires verifying the receiver interface is valid.
* @author YOLO Games protocol team
*/
contract TransferManager is
ITransferManager,
LowLevelERC20Transfer,
LowLevelERC721Transfer,
LowLevelERC1155Transfer,
OwnableTwoSteps
{
/**
* @notice This returns whether the user has approved the operator address.
* The first address is the user and the second address is the operator.
*/
mapping(address => mapping(address => bool)) public hasUserApprovedOperator;
/**
* @notice This returns whether the operator address is allowed by this contract's owner.
*/
mapping(address => bool) public isOperatorAllowed;
/**
* @notice Constructor
* @param _owner Owner address
*/
constructor(address _owner) OwnableTwoSteps(_owner) {}
/**
* @inheritdoc ITransferManager
*/
function transferERC20(
address tokenAddress,
address from,
address to,
uint256 amount
) external {
_isOperatorValidForTransfer(from, msg.sender);
if (amount == 0) {
revert AmountInvalid();
}
_executeERC20TransferFrom(tokenAddress, from, to, amount);
}
/**
* @inheritdoc ITransferManager
*/
function transferItemERC721(
address tokenAddress,
address from,
address to,
uint256 itemId
) external {
_isOperatorValidForTransfer(from, msg.sender);
_executeERC721TransferFrom(tokenAddress, from, to, itemId);
}
/**
* @inheritdoc ITransferManager
*/
function transferItemsERC721(
address tokenAddress,
address from,
address to,
uint256[] calldata itemIds,
uint256[] calldata amounts
) external {
uint256 length = itemIds.length;
if (length == 0 || amounts.length != length) {
revert LengthsInvalid();
}
_isOperatorValidForTransfer(from, msg.sender);
for (uint256 i; i < length; ) {
if (amounts[i] != 1) {
revert AmountInvalid();
}
_executeERC721TransferFrom(tokenAddress, from, to, itemIds[i]);
unchecked {
++i;
}
}
}
/**
* @inheritdoc ITransferManager
*/
function transferItemERC1155(
address tokenAddress,
address from,
address to,
uint256 itemId,
uint256 amount
) external {
_isOperatorValidForTransfer(from, msg.sender);
if (amount == 0) {
revert AmountInvalid();
}
_executeERC1155SafeTransferFrom(tokenAddress, from, to, itemId, amount);
}
/**
* @inheritdoc ITransferManager
*/
function transferItemsERC1155(
address tokenAddress,
address from,
address to,
uint256[] calldata itemIds,
uint256[] calldata amounts
) external {
uint256 length = itemIds.length;
if (length == 0 || amounts.length != length) {
revert LengthsInvalid();
}
_isOperatorValidForTransfer(from, msg.sender);
if (length == 1) {
if (amounts[0] == 0) {
revert AmountInvalid();
}
_executeERC1155SafeTransferFrom(tokenAddress, from, to, itemIds[0], amounts[0]);
} else {
for (uint256 i; i < length; ) {
if (amounts[i] == 0) {
revert AmountInvalid();
}
unchecked {
++i;
}
}
_executeERC1155SafeBatchTransferFrom(tokenAddress, from, to, itemIds, amounts);
}
}
/**
* @inheritdoc ITransferManager
*/
function transferBatchItemsAcrossCollections(
BatchTransferItem[] calldata items,
address from,
address to
) external {
uint256 itemsLength = items.length;
if (itemsLength == 0) {
revert LengthsInvalid();
}
if (from != msg.sender) {
_isOperatorValidForTransfer(from, msg.sender);
}
for (uint256 i; i < itemsLength; ) {
uint256[] calldata itemIds = items[i].itemIds;
uint256 itemIdsLengthForSingleCollection = itemIds.length;
uint256[] calldata amounts = items[i].amounts;
TokenType tokenType = items[i].tokenType;
if (tokenType == TokenType.ERC20) {
if (itemIdsLengthForSingleCollection != 0 || amounts.length != 1) {
revert LengthsInvalid();
}
} else {
if (itemIdsLengthForSingleCollection == 0 || amounts.length != itemIdsLengthForSingleCollection) {
revert LengthsInvalid();
}
}
if (tokenType == TokenType.ERC20) {
uint256 amount = amounts[0];
if (amount == 0) {
revert AmountInvalid();
}
_executeERC20TransferFrom(items[i].tokenAddress, from, to, amount);
} else if (tokenType == TokenType.ERC721) {
for (uint256 j; j < itemIdsLengthForSingleCollection; ) {
if (amounts[j] != 1) {
revert AmountInvalid();
}
_executeERC721TransferFrom(items[i].tokenAddress, from, to, itemIds[j]);
unchecked {
++j;
}
}
} else if (tokenType == TokenType.ERC1155) {
for (uint256 j; j < itemIdsLengthForSingleCollection; ) {
if (amounts[j] == 0) {
revert AmountInvalid();
}
unchecked {
++j;
}
}
_executeERC1155SafeBatchTransferFrom(items[i].tokenAddress, from, to, itemIds, amounts);
}
unchecked {
++i;
}
}
}
/**
* @inheritdoc ITransferManager
*/
function grantApprovals(address[] calldata operators) external {
uint256 length = operators.length;
if (length == 0) {
revert LengthsInvalid();
}
for (uint256 i; i < length; ) {
address operator = operators[i];
if (!isOperatorAllowed[operator]) {
revert OperatorNotAllowed();
}
if (hasUserApprovedOperator[msg.sender][operator]) {
revert OperatorAlreadyApprovedByUser();
}
hasUserApprovedOperator[msg.sender][operator] = true;
unchecked {
++i;
}
}
emit ApprovalsGranted(msg.sender, operators);
}
/**
* @inheritdoc ITransferManager
*/
function revokeApprovals(address[] calldata operators) external {
uint256 length = operators.length;
if (length == 0) {
revert LengthsInvalid();
}
for (uint256 i; i < length; ) {
address operator = operators[i];
if (!hasUserApprovedOperator[msg.sender][operator]) {
revert OperatorNotApprovedByUser();
}
delete hasUserApprovedOperator[msg.sender][operator];
unchecked {
++i;
}
}
emit ApprovalsRemoved(msg.sender, operators);
}
/**
* @inheritdoc ITransferManager
*/
function allowOperator(address operator) external onlyOwner {
if (isOperatorAllowed[operator]) {
revert OperatorAlreadyAllowed();
}
isOperatorAllowed[operator] = true;
emit OperatorAllowed(operator);
}
/**
* @inheritdoc ITransferManager
*/
function removeOperator(address operator) external onlyOwner {
if (!isOperatorAllowed[operator]) {
revert OperatorNotAllowed();
}
delete isOperatorAllowed[operator];
emit OperatorRemoved(operator);
}
/**
* @notice This function is internal and verifies whether the transfer
* (by an operator on behalf of a user) is valid. If not, it reverts.
* @param user User address
* @param operator Operator address
*/
function _isOperatorValidForTransfer(address user, address operator) private view {
if (isOperatorAllowed[operator] && hasUserApprovedOperator[user][operator]) {
return;
}
revert TransferCallerInvalid();
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
enum YieldMode {
AUTOMATIC,
VOID,
CLAIMABLE
}
enum GasMode {
VOID,
CLAIMABLE
}
interface IBlast {
// configure
function configureContract(
address contractAddress,
YieldMode _yield,
GasMode gasMode,
address governor
) external;
function configure(
YieldMode _yield,
GasMode gasMode,
address governor
) external;
// base configuration options
function configureClaimableYield() external;
function configureClaimableYieldOnBehalf(address contractAddress) external;
function configureAutomaticYield() external;
function configureAutomaticYieldOnBehalf(address contractAddress) external;
function configureVoidYield() external;
function configureVoidYieldOnBehalf(address contractAddress) external;
function configureClaimableGas() external;
function configureClaimableGasOnBehalf(address contractAddress) external;
function configureVoidGas() external;
function configureVoidGasOnBehalf(address contractAddress) external;
function configureGovernor(address _governor) external;
function configureGovernorOnBehalf(address _newGovernor, address contractAddress) external;
// claim yield
function claimYield(
address contractAddress,
address recipientOfYield,
uint256 amount
) external returns (uint256);
function claimAllYield(address contractAddress, address recipientOfYield) external returns (uint256);
// claim gas
function claimAllGas(address contractAddress, address recipientOfGas) external returns (uint256);
function claimGasAtMinClaimRate(
address contractAddress,
address recipientOfGas,
uint256 minClaimRateBips
) external returns (uint256);
function claimMaxGas(address contractAddress, address recipientOfGas) external returns (uint256);
function claimGas(
address contractAddress,
address recipientOfGas,
uint256 gasToClaim,
uint256 gasSecondsToConsume
) external returns (uint256);
// read functions
function readClaimableYield(address contractAddress) external view returns (uint256);
function readYieldConfiguration(address contractAddress) external view returns (uint8);
function readGasParams(address contractAddress)
external
view
returns (
uint256 etherSeconds,
uint256 etherBalance,
uint256 lastUpdated,
GasMode
);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
/**
* @title IOwnableTwoSteps
* @author LooksRare protocol team (👀,💎)
*/
interface IOwnableTwoSteps {
/**
* @notice This enum keeps track of the ownership status.
* @param NoOngoingTransfer The default status when the owner is set
* @param TransferInProgress The status when a transfer to a new owner is initialized
* @param RenouncementInProgress The status when a transfer to address(0) is initialized
*/
enum Status {
NoOngoingTransfer,
TransferInProgress,
RenouncementInProgress
}
/**
* @notice This is returned when there is no transfer of ownership in progress.
*/
error NoOngoingTransferInProgress();
/**
* @notice This is returned when the caller is not the owner.
*/
error NotOwner();
/**
* @notice This is returned when there is no renouncement in progress but
* the owner tries to validate the ownership renouncement.
*/
error RenouncementNotInProgress();
/**
* @notice This is returned when the transfer is already in progress but the owner tries
* initiate a new ownership transfer.
*/
error TransferAlreadyInProgress();
/**
* @notice This is returned when there is no ownership transfer in progress but the
* ownership change tries to be approved.
*/
error TransferNotInProgress();
/**
* @notice This is returned when the ownership transfer is attempted to be validated by the
* a caller that is not the potential owner.
*/
error WrongPotentialOwner();
/**
* @notice This is emitted if the ownership transfer is cancelled.
*/
event CancelOwnershipTransfer();
/**
* @notice This is emitted if the ownership renouncement is initiated.
*/
event InitiateOwnershipRenouncement();
/**
* @notice This is emitted if the ownership transfer is initiated.
* @param previousOwner Previous/current owner
* @param potentialOwner Potential/future owner
*/
event InitiateOwnershipTransfer(address previousOwner, address potentialOwner);
/**
* @notice This is emitted when there is a new owner.
*/
event NewOwner(address newOwner);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; /** * @notice It is emitted if the ETH transfer fails. */ error ETHTransferFail(); /** * @notice It is emitted if the ERC20 approval fails. */ error ERC20ApprovalFail(); /** * @notice It is emitted if the ERC20 transfer fails. */ error ERC20TransferFail(); /** * @notice It is emitted if the ERC20 transferFrom fails. */ error ERC20TransferFromFail(); /** * @notice It is emitted if the ERC721 transferFrom fails. */ error ERC721TransferFromFail(); /** * @notice It is emitted if the ERC1155 safeTransferFrom fails. */ error ERC1155SafeTransferFromFail(); /** * @notice It is emitted if the ERC1155 safeBatchTransferFrom fails. */ error ERC1155SafeBatchTransferFromFail();
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; /** * @notice It is emitted if the call recipient is not a contract. */ error NotAContract();
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
interface IERC721 {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
function safeTransferFrom(address from, address to, uint256 tokenId) external;
function transferFrom(address from, address to, uint256 tokenId) external;
function approve(address to, uint256 tokenId) external;
function setApprovalForAll(address operator, bool _approved) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function isApprovedForAll(address owner, address operator) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
interface IERC1155 {
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
event URI(string value, uint256 indexed id);
function balanceOf(address account, uint256 id) external view returns (uint256);
function balanceOfBatch(
address[] calldata accounts,
uint256[] calldata ids
) external view returns (uint256[] memory);
function setApprovalForAll(address operator, bool approved) external;
function isApprovedForAll(address account, address operator) external view returns (bool);
function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
// Enums
import {TokenType} from "../enums/TokenType.sol";
/**
* @title ITransferManager
* @author LooksRare protocol team (👀,💎)
*/
interface ITransferManager {
/**
* @notice This struct is only used for transferBatchItemsAcrossCollections.
* @param tokenAddress Token address
* @param tokenType 0 for ERC721, 1 for ERC1155
* @param itemIds Array of item ids to transfer
* @param amounts Array of amounts to transfer
*/
struct BatchTransferItem {
address tokenAddress;
TokenType tokenType;
uint256[] itemIds;
uint256[] amounts;
}
/**
* @notice It is emitted if operators' approvals to transfer NFTs are granted by a user.
* @param user Address of the user
* @param operators Array of operator addresses
*/
event ApprovalsGranted(address user, address[] operators);
/**
* @notice It is emitted if operators' approvals to transfer NFTs are revoked by a user.
* @param user Address of the user
* @param operators Array of operator addresses
*/
event ApprovalsRemoved(address user, address[] operators);
/**
* @notice It is emitted if a new operator is added to the global allowlist.
* @param operator Operator address
*/
event OperatorAllowed(address operator);
/**
* @notice It is emitted if an operator is removed from the global allowlist.
* @param operator Operator address
*/
event OperatorRemoved(address operator);
/**
* @notice It is returned if the operator to approve has already been approved by the user.
*/
error OperatorAlreadyApprovedByUser();
/**
* @notice It is returned if the operator to revoke has not been previously approved by the user.
*/
error OperatorNotApprovedByUser();
/**
* @notice It is returned if the transfer caller is already allowed by the owner.
* @dev This error can only be returned for owner operations.
*/
error OperatorAlreadyAllowed();
/**
* @notice It is returned if the operator to approve is not in the global allowlist defined by the owner.
* @dev This error can be returned if the user tries to grant approval to an operator address not in the
* allowlist or if the owner tries to remove the operator from the global allowlist.
*/
error OperatorNotAllowed();
/**
* @notice It is returned if the transfer caller is invalid.
* For a transfer called to be valid, the operator must be in the global allowlist and
* approved by the 'from' user.
*/
error TransferCallerInvalid();
/**
* @notice This function transfers ERC20 tokens.
* @param tokenAddress Token address
* @param from Sender address
* @param to Recipient address
* @param amount amount
*/
function transferERC20(
address tokenAddress,
address from,
address to,
uint256 amount
) external;
/**
* @notice This function transfers a single item for a single ERC721 collection.
* @param tokenAddress Token address
* @param from Sender address
* @param to Recipient address
* @param itemId Item ID
*/
function transferItemERC721(
address tokenAddress,
address from,
address to,
uint256 itemId
) external;
/**
* @notice This function transfers items for a single ERC721 collection.
* @param tokenAddress Token address
* @param from Sender address
* @param to Recipient address
* @param itemIds Array of itemIds
* @param amounts Array of amounts
*/
function transferItemsERC721(
address tokenAddress,
address from,
address to,
uint256[] calldata itemIds,
uint256[] calldata amounts
) external;
/**
* @notice This function transfers a single item for a single ERC1155 collection.
* @param tokenAddress Token address
* @param from Sender address
* @param to Recipient address
* @param itemId Item ID
* @param amount Amount
*/
function transferItemERC1155(
address tokenAddress,
address from,
address to,
uint256 itemId,
uint256 amount
) external;
/**
* @notice This function transfers items for a single ERC1155 collection.
* @param tokenAddress Token address
* @param from Sender address
* @param to Recipient address
* @param itemIds Array of itemIds
* @param amounts Array of amounts
* @dev It does not allow batch transferring if from = msg.sender since native function should be used.
*/
function transferItemsERC1155(
address tokenAddress,
address from,
address to,
uint256[] calldata itemIds,
uint256[] calldata amounts
) external;
/**
* @notice This function transfers items across an array of tokens that can be ERC20, ERC721 and ERC1155.
* @param items Array of BatchTransferItem
* @param from Sender address
* @param to Recipient address
*/
function transferBatchItemsAcrossCollections(
BatchTransferItem[] calldata items,
address from,
address to
) external;
/**
* @notice This function allows a user to grant approvals for an array of operators.
* Users cannot grant approvals if the operator is not allowed by this contract's owner.
* @param operators Array of operator addresses
* @dev Each operator address must be globally allowed to be approved.
*/
function grantApprovals(address[] calldata operators) external;
/**
* @notice This function allows a user to revoke existing approvals for an array of operators.
* @param operators Array of operator addresses
* @dev Each operator address must be approved at the user level to be revoked.
*/
function revokeApprovals(address[] calldata operators) external;
/**
* @notice This function allows an operator to be added for the shared transfer system.
* Once the operator is allowed, users can grant NFT approvals to this operator.
* @param operator Operator address to allow
* @dev Only callable by owner.
*/
function allowOperator(address operator) external;
/**
* @notice This function allows the user to remove an operator for the shared transfer system.
* @param operator Operator address to remove
* @dev Only callable by owner.
*/
function removeOperator(address operator) external;
/**
* @notice This returns whether the user has approved the operator address.
* The first address is the user and the second address is the operator.
*/
function hasUserApprovedOperator(address user, address operator) external view returns (bool);
}// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; /** * @notice It is returned if the amount is invalid. * For ERC20, if amount is 0. * For ERC721, any number that is not 1. * For ERC1155, if amount is 0. */ error AmountInvalid(); /** * @notice It is returned if there is either a mismatch or an error in the length of the array(s). */ error LengthsInvalid();
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
enum TokenType {
ERC20,
ERC721,
ERC1155
}{
"remappings": [
"@ensdomains/=node_modules/@ensdomains/",
"@looksrare/=node_modules/@looksrare/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"eth-gas-reporter/=node_modules/eth-gas-reporter/",
"forge-std/=lib/forge-std/src/",
"hardhat/=node_modules/hardhat/",
"solmate/=node_modules/solmate/"
],
"optimizer": {
"enabled": true,
"runs": 888888
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"evmVersion": "london",
"viaIR": true,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_blast","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmountInvalid","type":"error"},{"inputs":[],"name":"ERC1155SafeBatchTransferFromFail","type":"error"},{"inputs":[],"name":"ERC1155SafeTransferFromFail","type":"error"},{"inputs":[],"name":"ERC20TransferFromFail","type":"error"},{"inputs":[],"name":"ERC721TransferFromFail","type":"error"},{"inputs":[],"name":"LengthsInvalid","type":"error"},{"inputs":[],"name":"NoOngoingTransferInProgress","type":"error"},{"inputs":[],"name":"NotAContract","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"OperatorAlreadyAllowed","type":"error"},{"inputs":[],"name":"OperatorAlreadyApprovedByUser","type":"error"},{"inputs":[],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OperatorNotApprovedByUser","type":"error"},{"inputs":[],"name":"RenouncementNotInProgress","type":"error"},{"inputs":[],"name":"TransferAlreadyInProgress","type":"error"},{"inputs":[],"name":"TransferCallerInvalid","type":"error"},{"inputs":[],"name":"TransferNotInProgress","type":"error"},{"inputs":[],"name":"WrongPotentialOwner","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address[]","name":"operators","type":"address[]"}],"name":"ApprovalsGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address[]","name":"operators","type":"address[]"}],"name":"ApprovalsRemoved","type":"event"},{"anonymous":false,"inputs":[],"name":"CancelOwnershipTransfer","type":"event"},{"anonymous":false,"inputs":[],"name":"InitiateOwnershipRenouncement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"address","name":"potentialOwner","type":"address"}],"name":"InitiateOwnershipTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"NewOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorAllowed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorRemoved","type":"event"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"allowOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmOwnershipRenouncement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"operators","type":"address[]"}],"name":"grantApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"hasUserApprovedOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initiateOwnershipRenouncement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPotentialOwner","type":"address"}],"name":"initiateOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOperatorAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownershipStatus","outputs":[{"internalType":"enum IOwnableTwoSteps.Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"potentialOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"operators","type":"address[]"}],"name":"revokeApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"enum TokenType","name":"tokenType","type":"uint8"},{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct ITransferManager.BatchTransferItem[]","name":"items","type":"tuple[]"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"transferBatchItemsAcrossCollections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferItemERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"transferItemERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"transferItemsERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"transferItemsERC721","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608034620001355762001e28906001600160401b03601f38849003908101601f1916830190828211848310176200013a578084916040968794855283398101031262000135576200005e6020620000568462000150565b930162000150565b600080546001600160a01b0319166001600160a01b03948516908117825585518181529194909290917f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc90602090a11690813b156200013157839291606484928751968793849263c8992e6160e01b8452600260048501526001602485015260448401525af18015620001275762000100575b8351611cc29081620001668239f35b82116200011357508152388080620000f1565b634e487b7160e01b81526041600452602490fd5b84513d84823e3d90fd5b8380fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620001355756fe608060409080825260048036101561001657600080fd5b600091823560e01c9081630ca8e8a814611007575080631ba9a45814610f1457806323452b9c14610e0c5780632bb5a9e614610dc15780633cc4cb0614610d485780633e56753914610c545780635b6ac01114610b785780636cf0859c14610a135780637200b829146108e157806375ccc1321461087a5780637762df25146108275780638da5cb5b146107d6578063a0a406c61461066a578063a7bc96d3146105a4578063ac8a584a146104b3578063c0b6f561146103a8578063cda20f0b14610380578063da3e8ce414610350578063e62edc35146102b75763e8f9f1dc1461010057600080fd5b346102b357602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57803567ffffffffffffffff81116102ab5761014f903690830161136b565b929091831561028457845b84811061019b575050506101957f2689e1a312b4212a2eb518d23bfd4c7cc30e3a7bc7a7e2524e8ec16e6a3713ab9394519283923384611649565b0390a180f35b73ffffffffffffffffffffffffffffffffffffffff6101c36101be838888611555565b611628565b168087526003845260ff8089892054161561025c57338852600290818652898920838a5286528989205416610234573388528452878720908752835286862090600191827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790550161015a565b8389517fabb0fc96000000000000000000000000000000000000000000000000000000008152fd5b8389517f8a109193000000000000000000000000000000000000000000000000000000008152fd5b85517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b8380fd5b8280fd5b5080fd5b5091346102b35760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b3576102f06113e7565b6102f86113a1565b6103006113c4565b906084359361030f33836116b5565b841561032857506103259495506064359261185a565b80f35b8690517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b5091346102b357610360366114e9565b9361036e93919333846116b5565b84156103285750610325949550611acc565b82346103a557610325610392366114e9565b926103a092919233836116b5565b611bd6565b80fd5b508290346102af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af576103e26113e7565b6103ea611741565b6001549160ff8360a01c166103fe8161140a565b61048c5750740100000000000000000000000000000000000000007fb86c75c9bffca616b2d314cc914f7c3f1d174255b16b941c3f3ededee276d5ef939273ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffff00000000000000000000000000000000000000000093169283911617176001558151903382526020820152a180f35b83517f74ed79ae000000000000000000000000000000000000000000000000000000008152fd5b5082346102af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af5773ffffffffffffffffffffffffffffffffffffffff6105016113e7565b610509611741565b1691828452600360205260ff82852054161561057d5750816020917f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d938552600383528085207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905551908152a180f35b90517f8a109193000000000000000000000000000000000000000000000000000000008152fd5b508290346102af576105b536611443565b9690959492919788158015610660575b61063a576105d333856116b5565b895b8981106105e0578a80f35b600190816105ef828c8c611555565b35036106125761060c610603828d88611555565b3588888b611bd6565b016105d5565b5050517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b50888814156105c5565b5091346102b35761067a36611443565b8295949515928380156107cc575b6107a45761069633876116b5565b6001908082036107415750501561071557359586156106ed57506106c157610325959650359261185a565b6024866032897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8890517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b60248860328b7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b969495935099899891989792975b878110610764575050506103259798506119c5565b61076f818b8b611555565b351561077c578b0161074f565b5090517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b8a89517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b5080821415610688565b8284346102b357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b8284346102b357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35760209073ffffffffffffffffffffffffffffffffffffffff600154169051908152f35b8284346102b35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35760ff8160209373ffffffffffffffffffffffffffffffffffffffff6108ce6113e7565b1681526003855220541690519015158152f35b508290346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af5760015490600160ff8360a01c166109288161140a565b036109ec5773ffffffffffffffffffffffffffffffffffffffff821633036109c557507f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc917fffffffffffffffffffffff000000000000000000000000000000000000000000602092337fffffffffffffffffffffffff00000000000000000000000000000000000000008754161786551660015551338152a180f35b82517fafdcfb92000000000000000000000000000000000000000000000000000000008152fd5b82517f5e4f2826000000000000000000000000000000000000000000000000000000008152fd5b50346102b3576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57813567ffffffffffffffff81116102ab57610a62903690840161136b565b9290918315610b5057845b848110610aa8575050506101957fcd827905c56d07b7e3668c6d264b27603a45324dd955aadca79cf47eb24ca5fa9394519283923384611649565b610ab66101be828787611555565b338752600280845273ffffffffffffffffffffffffffffffffffffffff898920921691828952845260ff898920541615610b28573388528352878720908752825286862080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610a6d565b8489517f21d29a86000000000000000000000000000000000000000000000000000000008152fd5b5084517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b508290346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57610bb1611741565b6001549160ff8360a01c16610bc58161140a565b610c2e5783740200000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8516176001557f3ff05a45e46337fa1cbf20996d2eeb927280bce099f37252bcca1040609604ec8180a180f35b517f74ed79ae000000000000000000000000000000000000000000000000000000008152fd5b508290346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57610c8d611741565b60015490600260ff8360a01c16610ca38161140a565b03610d2157507f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff6020927fffffffffffffffffffffffff000000000000000000000000000000000000000086541686551660015551838152a180f35b82517f045c5122000000000000000000000000000000000000000000000000000000008152fd5b8284346102b357807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35760ff81602093610d866113e7565b610d8e6113a1565b73ffffffffffffffffffffffffffffffffffffffff91821683526002875283832091168252855220549151911615158152f35b8284346102b357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b357600154905160209160a01c60ff16610e088161140a565b8152f35b5082346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57610e44611741565b6001549160ff8360a01c1691610e598361140a565b8215610eee57505080610e6d60019261140a565b14610ec3575b507fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff600154166001557f8eca980489e87f7dba4f26917aa4bfc906eb3f2b4f7b4b9fd0ff2b8bb3e21ae38180a180f35b7fffffffffffffffffffffffff00000000000000000000000000000000000000001660015581610e73565b517fccf69db7000000000000000000000000000000000000000000000000000000008152fd5b5082346102af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af5773ffffffffffffffffffffffffffffffffffffffff610f626113e7565b610f6a611741565b1691828452600360205260ff8285205416610fe05750816020917fdde65206cdee4ea27ef1b170724ba50b41ad09a3bf2dda12935fc40c4dbf6e759385526003835280852060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905551908152a180f35b90517f730e0eb0000000000000000000000000000000000000000000000000000000008152fd5b84929150346102ab57606091827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261136757803567ffffffffffffffff81116113635761105a903690830161136b565b906110636113a1565b9261106c6113c4565b94831561133e57503373ffffffffffffffffffffffffffffffffffffffff85160361132f575b875b83811061109f578880f35b6110b66110ad828686611594565b898101906115d4565b6110cd6110c4848888611594565b8a8101906115d4565b91909260206110dd868a8a611594565b013591600383101561132b576110f28361140a565b821580156112eb5781158015906112e0575b6112b8575b6111128461140a565b1561119c5750505015611170573580156111485790611142600192888861113d6101be868b8b611594565b611acc565b01611094565b8289517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b60248a6032857f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b909193926111a98561140a565b60019480860361123557508d5b8281106111cb57505050505050600190611142565b856111d7828488611555565b350361120d5785906112078c8e6111f46101be8f8f908e91611594565b9161120085898b611555565b3592611bd6565b016111b6565b878e517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b8061124760029297939795949561140a565b1461125a575b5050505050600190611142565b89898f8d938b915b878110611294575050916112856101be8a60019b9a98969461128a9a9896611594565b6119c5565b908a80808061124d565b9350935050506112a5818787611555565b351561120d57810189898d938d93611262565b878e517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b506001851415611104565b81158015611321575b1561110957878e517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b50818514156112f4565b8d80fd5b61133933856116b5565b611092565b7f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b8580fd5b8480fd5b9181601f8401121561139c5782359167ffffffffffffffff831161139c576020808501948460051b01011161139c57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361139c57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361139c57565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361139c57565b6003111561141457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261139c5773ffffffffffffffffffffffffffffffffffffffff90600435828116810361139c5792602435838116810361139c5792604435908116810361139c579167ffffffffffffffff9160643583811161139c57826114cb9160040161136b565b9390939260843591821161139c576114e59160040161136b565b9091565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc608091011261139c5773ffffffffffffffffffffffffffffffffffffffff600435818116810361139c5791602435828116810361139c5791604435908116810361139c579060643590565b91908110156115655760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156115655760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818136030182121561139c570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561139c570180359067ffffffffffffffff821161139c57602001918160051b3603831361139c57565b3573ffffffffffffffffffffffffffffffffffffffff8116810361139c5790565b73ffffffffffffffffffffffffffffffffffffffff91821681526040602080830182905290820185905260609091019391600090815b84831061168f5750505050505090565b90919293949586358381168091036102af5781528401958401949392600101919061167f565b9073ffffffffffffffffffffffffffffffffffffffff809116600090808252600360205260ff604083205416928361171d575b505050905061171b5760046040517fb5509544000000000000000000000000000000000000000000000000000000008152fd5b565b6040935060ff941682526002602052828220908252602052205416803880806116e8565b73ffffffffffffffffffffffffffffffffffffffff60005416330361176257565b60046040517f30cd7471000000000000000000000000000000000000000000000000000000008152fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176117cd57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3d15611855573d9067ffffffffffffffff82116117cd576040519161184960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461178c565b82523d6000602084013e565b606090565b92939093833b1561195e576040519460208601937ff242432a00000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff80921660248801521660448601526064850152608484015260a060a48401526000928360c482015260c48152610100810181811067ffffffffffffffff8211176119315784939291849160405251925af16118ff6117fc565b501561190757565b60046040517f02f8f11e000000000000000000000000000000000000000000000000000000008152fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60046040517f09ee12d5000000000000000000000000000000000000000000000000000000008152fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161139c5760209260051b809284830137010190565b93919095843b1561195e5760206000979688611a78611a8e94611a467f2eb2c2d60000000000000000000000000000000000000000000000000000000099849c99859a6040519a898c019d8e5273ffffffffffffffffffffffffffffffffffffffff80921660248d01521660448b015260a060648b015260c48a0191611988565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc94858984030160848a0152611988565b85810392830160a487015252808452018261178c565b51925af1611a9a6117fc565b5015611aa257565b60046040517f65da8e40000000000000000000000000000000000000000000000000000000008152fd5b929091833b1561195e576040517f23b872dd000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff94851660248301529390911660448201526064810191909152611b6481608481015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261178c565b600092839283809351925af1611b786117fc565b9015611bac57805180611b8a57505050565b81602091810103126102b35760200151908115918215036103a55750611bac57565b60046040517fe5605213000000000000000000000000000000000000000000000000000000008152fd5b90929192813b1561195e576040517f23b872dd000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff9283166024830152949091166044820152606481019290925260009283928390611c4e8160848101611b38565b51925af1611c5a6117fc565b5015611c6257565b60046040517fe0f5c508000000000000000000000000000000000000000000000000000000008152fdfea264697066735822122022e7439513dcb6576f04ababd4e3b55180645db99734c24e1fdcbfc68c27ea4164736f6c634300081400330000000000000000000000002c64e6ee1dd9fc2a0db6a6b1aa2c3f163c7a2c780000000000000000000000004300000000000000000000000000000000000002
Deployed Bytecode
0x608060409080825260048036101561001657600080fd5b600091823560e01c9081630ca8e8a814611007575080631ba9a45814610f1457806323452b9c14610e0c5780632bb5a9e614610dc15780633cc4cb0614610d485780633e56753914610c545780635b6ac01114610b785780636cf0859c14610a135780637200b829146108e157806375ccc1321461087a5780637762df25146108275780638da5cb5b146107d6578063a0a406c61461066a578063a7bc96d3146105a4578063ac8a584a146104b3578063c0b6f561146103a8578063cda20f0b14610380578063da3e8ce414610350578063e62edc35146102b75763e8f9f1dc1461010057600080fd5b346102b357602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57803567ffffffffffffffff81116102ab5761014f903690830161136b565b929091831561028457845b84811061019b575050506101957f2689e1a312b4212a2eb518d23bfd4c7cc30e3a7bc7a7e2524e8ec16e6a3713ab9394519283923384611649565b0390a180f35b73ffffffffffffffffffffffffffffffffffffffff6101c36101be838888611555565b611628565b168087526003845260ff8089892054161561025c57338852600290818652898920838a5286528989205416610234573388528452878720908752835286862090600191827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790550161015a565b8389517fabb0fc96000000000000000000000000000000000000000000000000000000008152fd5b8389517f8a109193000000000000000000000000000000000000000000000000000000008152fd5b85517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b8380fd5b8280fd5b5080fd5b5091346102b35760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b3576102f06113e7565b6102f86113a1565b6103006113c4565b906084359361030f33836116b5565b841561032857506103259495506064359261185a565b80f35b8690517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b5091346102b357610360366114e9565b9361036e93919333846116b5565b84156103285750610325949550611acc565b82346103a557610325610392366114e9565b926103a092919233836116b5565b611bd6565b80fd5b508290346102af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af576103e26113e7565b6103ea611741565b6001549160ff8360a01c166103fe8161140a565b61048c5750740100000000000000000000000000000000000000007fb86c75c9bffca616b2d314cc914f7c3f1d174255b16b941c3f3ededee276d5ef939273ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffff00000000000000000000000000000000000000000093169283911617176001558151903382526020820152a180f35b83517f74ed79ae000000000000000000000000000000000000000000000000000000008152fd5b5082346102af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af5773ffffffffffffffffffffffffffffffffffffffff6105016113e7565b610509611741565b1691828452600360205260ff82852054161561057d5750816020917f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d938552600383528085207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905551908152a180f35b90517f8a109193000000000000000000000000000000000000000000000000000000008152fd5b508290346102af576105b536611443565b9690959492919788158015610660575b61063a576105d333856116b5565b895b8981106105e0578a80f35b600190816105ef828c8c611555565b35036106125761060c610603828d88611555565b3588888b611bd6565b016105d5565b5050517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b50888814156105c5565b5091346102b35761067a36611443565b8295949515928380156107cc575b6107a45761069633876116b5565b6001908082036107415750501561071557359586156106ed57506106c157610325959650359261185a565b6024866032897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8890517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b60248860328b7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b969495935099899891989792975b878110610764575050506103259798506119c5565b61076f818b8b611555565b351561077c578b0161074f565b5090517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b8a89517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b5080821415610688565b8284346102b357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b8284346102b357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35760209073ffffffffffffffffffffffffffffffffffffffff600154169051908152f35b8284346102b35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35760ff8160209373ffffffffffffffffffffffffffffffffffffffff6108ce6113e7565b1681526003855220541690519015158152f35b508290346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af5760015490600160ff8360a01c166109288161140a565b036109ec5773ffffffffffffffffffffffffffffffffffffffff821633036109c557507f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc917fffffffffffffffffffffff000000000000000000000000000000000000000000602092337fffffffffffffffffffffffff00000000000000000000000000000000000000008754161786551660015551338152a180f35b82517fafdcfb92000000000000000000000000000000000000000000000000000000008152fd5b82517f5e4f2826000000000000000000000000000000000000000000000000000000008152fd5b50346102b3576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57813567ffffffffffffffff81116102ab57610a62903690840161136b565b9290918315610b5057845b848110610aa8575050506101957fcd827905c56d07b7e3668c6d264b27603a45324dd955aadca79cf47eb24ca5fa9394519283923384611649565b610ab66101be828787611555565b338752600280845273ffffffffffffffffffffffffffffffffffffffff898920921691828952845260ff898920541615610b28573388528352878720908752825286862080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610a6d565b8489517f21d29a86000000000000000000000000000000000000000000000000000000008152fd5b5084517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b508290346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57610bb1611741565b6001549160ff8360a01c16610bc58161140a565b610c2e5783740200000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8516176001557f3ff05a45e46337fa1cbf20996d2eeb927280bce099f37252bcca1040609604ec8180a180f35b517f74ed79ae000000000000000000000000000000000000000000000000000000008152fd5b508290346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57610c8d611741565b60015490600260ff8360a01c16610ca38161140a565b03610d2157507f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff6020927fffffffffffffffffffffffff000000000000000000000000000000000000000086541686551660015551838152a180f35b82517f045c5122000000000000000000000000000000000000000000000000000000008152fd5b8284346102b357807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35760ff81602093610d866113e7565b610d8e6113a1565b73ffffffffffffffffffffffffffffffffffffffff91821683526002875283832091168252855220549151911615158152f35b8284346102b357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b357600154905160209160a01c60ff16610e088161140a565b8152f35b5082346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57610e44611741565b6001549160ff8360a01c1691610e598361140a565b8215610eee57505080610e6d60019261140a565b14610ec3575b507fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff600154166001557f8eca980489e87f7dba4f26917aa4bfc906eb3f2b4f7b4b9fd0ff2b8bb3e21ae38180a180f35b7fffffffffffffffffffffffff00000000000000000000000000000000000000001660015581610e73565b517fccf69db7000000000000000000000000000000000000000000000000000000008152fd5b5082346102af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af5773ffffffffffffffffffffffffffffffffffffffff610f626113e7565b610f6a611741565b1691828452600360205260ff8285205416610fe05750816020917fdde65206cdee4ea27ef1b170724ba50b41ad09a3bf2dda12935fc40c4dbf6e759385526003835280852060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905551908152a180f35b90517f730e0eb0000000000000000000000000000000000000000000000000000000008152fd5b84929150346102ab57606091827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261136757803567ffffffffffffffff81116113635761105a903690830161136b565b906110636113a1565b9261106c6113c4565b94831561133e57503373ffffffffffffffffffffffffffffffffffffffff85160361132f575b875b83811061109f578880f35b6110b66110ad828686611594565b898101906115d4565b6110cd6110c4848888611594565b8a8101906115d4565b91909260206110dd868a8a611594565b013591600383101561132b576110f28361140a565b821580156112eb5781158015906112e0575b6112b8575b6111128461140a565b1561119c5750505015611170573580156111485790611142600192888861113d6101be868b8b611594565b611acc565b01611094565b8289517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b60248a6032857f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b909193926111a98561140a565b60019480860361123557508d5b8281106111cb57505050505050600190611142565b856111d7828488611555565b350361120d5785906112078c8e6111f46101be8f8f908e91611594565b9161120085898b611555565b3592611bd6565b016111b6565b878e517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b8061124760029297939795949561140a565b1461125a575b5050505050600190611142565b89898f8d938b915b878110611294575050916112856101be8a60019b9a98969461128a9a9896611594565b6119c5565b908a80808061124d565b9350935050506112a5818787611555565b351561120d57810189898d938d93611262565b878e517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b506001851415611104565b81158015611321575b1561110957878e517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b50818514156112f4565b8d80fd5b61133933856116b5565b611092565b7f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b8580fd5b8480fd5b9181601f8401121561139c5782359167ffffffffffffffff831161139c576020808501948460051b01011161139c57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361139c57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361139c57565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361139c57565b6003111561141457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261139c5773ffffffffffffffffffffffffffffffffffffffff90600435828116810361139c5792602435838116810361139c5792604435908116810361139c579167ffffffffffffffff9160643583811161139c57826114cb9160040161136b565b9390939260843591821161139c576114e59160040161136b565b9091565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc608091011261139c5773ffffffffffffffffffffffffffffffffffffffff600435818116810361139c5791602435828116810361139c5791604435908116810361139c579060643590565b91908110156115655760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156115655760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818136030182121561139c570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561139c570180359067ffffffffffffffff821161139c57602001918160051b3603831361139c57565b3573ffffffffffffffffffffffffffffffffffffffff8116810361139c5790565b73ffffffffffffffffffffffffffffffffffffffff91821681526040602080830182905290820185905260609091019391600090815b84831061168f5750505050505090565b90919293949586358381168091036102af5781528401958401949392600101919061167f565b9073ffffffffffffffffffffffffffffffffffffffff809116600090808252600360205260ff604083205416928361171d575b505050905061171b5760046040517fb5509544000000000000000000000000000000000000000000000000000000008152fd5b565b6040935060ff941682526002602052828220908252602052205416803880806116e8565b73ffffffffffffffffffffffffffffffffffffffff60005416330361176257565b60046040517f30cd7471000000000000000000000000000000000000000000000000000000008152fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176117cd57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3d15611855573d9067ffffffffffffffff82116117cd576040519161184960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461178c565b82523d6000602084013e565b606090565b92939093833b1561195e576040519460208601937ff242432a00000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff80921660248801521660448601526064850152608484015260a060a48401526000928360c482015260c48152610100810181811067ffffffffffffffff8211176119315784939291849160405251925af16118ff6117fc565b501561190757565b60046040517f02f8f11e000000000000000000000000000000000000000000000000000000008152fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60046040517f09ee12d5000000000000000000000000000000000000000000000000000000008152fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161139c5760209260051b809284830137010190565b93919095843b1561195e5760206000979688611a78611a8e94611a467f2eb2c2d60000000000000000000000000000000000000000000000000000000099849c99859a6040519a898c019d8e5273ffffffffffffffffffffffffffffffffffffffff80921660248d01521660448b015260a060648b015260c48a0191611988565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc94858984030160848a0152611988565b85810392830160a487015252808452018261178c565b51925af1611a9a6117fc565b5015611aa257565b60046040517f65da8e40000000000000000000000000000000000000000000000000000000008152fd5b929091833b1561195e576040517f23b872dd000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff94851660248301529390911660448201526064810191909152611b6481608481015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261178c565b600092839283809351925af1611b786117fc565b9015611bac57805180611b8a57505050565b81602091810103126102b35760200151908115918215036103a55750611bac57565b60046040517fe5605213000000000000000000000000000000000000000000000000000000008152fd5b90929192813b1561195e576040517f23b872dd000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff9283166024830152949091166044820152606481019290925260009283928390611c4e8160848101611b38565b51925af1611c5a6117fc565b5015611c6257565b60046040517fe0f5c508000000000000000000000000000000000000000000000000000000008152fdfea264697066735822122022e7439513dcb6576f04ababd4e3b55180645db99734c24e1fdcbfc68c27ea4164736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002c64e6ee1dd9fc2a0db6a6b1aa2c3f163c7a2c780000000000000000000000004300000000000000000000000000000000000002
-----Decoded View---------------
Arg [0] : _owner (address): 0x2C64e6Ee1Dd9Fc2a0Db6a6B1aa2c3f163C7A2C78
Arg [1] : _blast (address): 0x4300000000000000000000000000000000000002
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000002c64e6ee1dd9fc2a0db6a6b1aa2c3f163c7a2c78
Arg [1] : 0000000000000000000000004300000000000000000000000000000000000002
Deployed Bytecode Sourcemap
828:334:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7530:11:1;;;;;7526:65;;7606:9;7617:10;;;;;;828:334:0;;;8073:39:1;;828:334:0;;;7827:10:1;;;;8073:39;;:::i;:::-;;;;828:334:0;;7606:9:1;828:334:0;7664:12:1;;;;;;:::i;:::-;;:::i;:::-;828:334:0;;;;7696:17:1;828:334:0;;;;;;;;;7695:28:1;7691:94;;7827:10;828:334:0;;7803:23:1;828:334:0;;;;;;;;;;;;;;;;;7799:122:1;;7827:10;828:334:0;;;;;;;;;;;;;;;7983:4:1;;828:334:0;;;;;;;;;;7606:9:1;;7799:122;828:334:0;;;7875:31:1;;;;7691:94;828:334:0;;;7750:20:1;;;;7526:65;828:334:0;;7564:16:1;;;;828:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;3780:10:1;;;;;:::i;:::-;3805:11;;3801:64;;828:334:0;3938:6:1;828:334:0;;;;;3938:6:1;;:::i;:::-;828:334:0;;3801:64:1;828:334:0;;;3839:15:1;;;;828:334:0;;;;;;;;;:::i;:::-;2300:10:1;;;;;;;;:::i;:::-;2326:11;;2322:64;;2446:6;;;;;;:::i;828:334:0:-;;;;;2773:6:1;828:334:0;;;:::i;:::-;2701:10:1;;;;;;;;:::i;:::-;2773:6;:::i;828:334:0:-;;;;;;;;;;;;;;;;;;;:::i;:::-;926:61:6;;:::i;:::-;3027:15;828:334:0;;;;;;;;;;:::i;:::-;3023:108:6;;828:334:0;;3415:56:6;828:334:0;;;;;;;;;;;;3027:15:6;828:334:0;;;3441:10:6;;828:334:0;;;;;;3415:56:6;828:334:0;;3023:108:6;828:334:0;;3093:27:6;;;;828:334:0;;;;;;;;;;;;;;;;:::i;:::-;926:61:6;;:::i;:::-;828:334:0;;;;;9218:17:1;828:334:0;;;;;;;;9217:28:1;9213:86;;828:334:0;;;;9359:25:1;828:334:0;;;9218:17:1;828:334:0;;;;;;;;;;;;;;;9359:25:1;828:334:0;;9213:86:1;828:334:0;;9268:20:1;;;;828:334:0;;;;;;;;;;:::i;:::-;3088:11:1;;;;;;;;;:39;;;;828:334:0;3084:93:1;;3221:10;;;;:::i;:::-;3248:9;3259:10;;;;;;828:334:0;;;3248:9:1;3305:1;3291:10;;;;;;;:::i;:::-;828:334:0;3291:15:1;3287:76;;3427:10;;;;;;:::i;:::-;828:334:0;3427:10:1;;;;:::i;:::-;828:334:0;3248:9:1;;3287:76;828:334:0;;;3333:15:1;;;;3084:93;828:334:0;3150:16:1;;;;3088:39;3103:24;;;;;3088:39;;828:334:0;;;;;;;;;:::i;:::-;4255:11:1;;;;;:39;;;;;;828:334:0;4251:93:1;;4388:10;;;;:::i;:::-;4424:1;;4414:11;;;4424:1;;828:334:0;;;;;;4445:15:1;;;4441:76;;828:334:0;;;4598:10:1;828:334:0;;;;4598:10:1;;:::i;828:334:0:-;;;;;;;;;;4441:76:1;828:334:0;;;4487:15:1;;;;828:334:0;;;;;;;;;;4410:550:1;4645:9;;;;;;;;;;;;;4656:10;;;;;;4941:7;;;;;;;;:::i;4645:9::-;4692:10;;;;;:::i;:::-;828:334:0;4692:15:1;4688:84;;828:334:0;;4645:9:1;;4688:84;828:334:0;;;4738:15:1;;;;4251:93;828:334:0;;;4317:16:1;;;;4255:39;4270:24;;;;;4255:39;;828:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;705:29:6;828:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;1876:49:1;828:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;2427:15:6;828:334:0;;2427:15:6;828:334:0;;;;;;;;:::i;:::-;2427:44:6;2423:105;;828:334:0;;;2542:10:6;:28;2538:87;;2542:10;2732:20;2542:10;828:334:0;;2542:10:6;;828:334:0;;;;;;;;2427:15:6;828:334:0;;2542:10:6;828:334:0;;2732:20:6;828:334:0;;2538:87:6;828:334:0;;2593:21:6;;;;2423:105;828:334:0;;2494:23:6;;;;828:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8298:11:1;;;;;8294:65;;8374:9;8385:10;;;;;;828:334:0;;;8729:39:1;;828:334:0;;;8488:10:1;;;;8729:39;;:::i;8374:9::-;8432:12;;;;;;:::i;:::-;8488:10;828:334:0;;8464:23:1;828:334:0;;;;;;;;;;;;;;;;;;;;;8463:46:1;8459:119;;8488:10;828:334:0;;;;;;;;;;;;;;;;;;;;;;;8374:9:1;;8459:119;828:334:0;;;8536:27:1;;;;8294:65;828:334:0;;;8332:16:1;;;;828:334:0;;;;;;;;;;;;;;926:61:6;;:::i;:::-;3651:15;828:334:0;;;;;;;;;;:::i;:::-;3647:108:6;;828:334:0;;;;;;3651:15:6;828:334:0;3828:31:6;;;;828:334:0;;3647:108:6;828:334:0;3717:27:6;;;;828:334:0;;;;;;;;;;;;;;926:61:6;;:::i;:::-;1991:15;828:334:0;;2010:29:6;828:334:0;;;;;;;;:::i;:::-;1991:48:6;1987:113;;828:334:0;2170:20:6;828:334:0;;;;;;;;;;;1991:15:6;828:334:0;;;;;2170:20:6;828:334:0;;1987:113:6;828:334:0;;2062:27:6;;;;828:334:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;1684:75:1;828:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;790:29:6;828:334:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;926:61:6;;:::i;:::-;1497:15;828:334:0;;;;;;;;;;;:::i;:::-;1526:44:6;;1522:111;;828:334:0;;;;1497:15:6;828:334:0;;:::i;:::-;1647:45:6;1643:97;;828:334:0;;;1497:15:6;828:334:0;;1497:15:6;828:334:0;1788:25:6;;;;828:334:0;;1643:97:6;828:334:0;;1497:15:6;828:334:0;1643:97:6;;;1522:111;828:334:0;1593:29:6;;;;828:334:0;;;;;;;;;;;;;;;;:::i;:::-;926:61:6;;:::i;:::-;828:334:0;;;;;8907:17:1;828:334:0;;;;;;;;8903:89:1;;828:334:0;;;;9052:25:1;828:334:0;;;8907:17:1;828:334:0;;;;;9032:4:1;828:334:0;;;;;;;;;;;9052:25:1;828:334:0;;8903:89:1;828:334:0;;8957:24:1;;;;828:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;5229:16:1;;;5225:70;;5317:10;;828:334:0;;;5309:18:1;5305:94;;828:334:0;5414:9:1;5425:15;;;;;;828:334:0;;;5414:9:1;5487:16;:8;;;;;:::i;:::-;:16;;;;;:::i;:::-;5617;:8;;;;;:::i;:::-;:16;;;;;:::i;:::-;5670:8;;;828:334:0;5670:8:1;;;;;:::i;:::-;:18;828:334:0;;;;;;;;;;;:::i;:::-;5707:28:1;;;;;;5759:37;;;;:60;;;5703:395;5755:130;;5703:395;828:334:0;;;:::i;:::-;6116:28:1;;;828:334:0;;;;;;;6213:11:1;;6209:80;;6332:8;6365:6;828:334:0;6332:8:1;;;:21;:8;;;;;:::i;:21::-;6365:6;:::i;:::-;828:334:0;5414:9:1;;6209:80;828:334:0;;;6255:15:1;;;;828:334:0;;;;;;;;;;6112:1163:1;828:334:0;;;;;;;:::i;:::-;;;6397:29:1;;;828:334:0;;6451:9:1;;6462:36;;;;;;6393:882;;;;;;828:334:0;6393:882:1;6112:1163;;6451:9;6528:10;;;;;;:::i;:::-;828:334:0;6528:15:1;6524:92;;6664:8;;6697:10;6664:8;;:21;:8;;;;;;;:::i;:21::-;6697:10;;;;;;:::i;:::-;828:334:0;6697:10:1;;:::i;:::-;828:334:0;6451:9:1;;6524:92;828:334:0;;;6578:15:1;;;;6393:882;828:334:0;;6847:17:1;828:334:0;;;;;;;;:::i;:::-;6834:30:1;6830:445;;6393:882;;;;;;828:334:0;6393:882:1;6112:1163;;6830:445;6889:9;;;;;;;6900:36;;;;;;7210:8;;;:21;:8;;828:334:0;7210:8:1;;;;;7252:7;7210:8;;;;:::i;:21::-;7252:7;:::i;:::-;6830:445;;;;;;;6889:9;6966:10;;;;;;;;;;;:::i;:::-;828:334:0;6966:15:1;6962:92;;828:334:0;;6889:9:1;;;;;;;;5755:130;828:334:0;;;5850:16:1;;;;5759:60;5800:19;828:334:0;5800:19:1;;;5759:60;;5703:395;5927:37;;:91;;;;5703:395;5923:161;5703:395;5923:161;828:334:0;;;6049:16:1;;;;5927:91;5968:50;;;;;5927:91;;828:334:0;;;;5305:94:1;5377:10;5317;5377;;:::i;:::-;5305:94;;5225:70;5268:16;;;;828:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;-1:-1:-1;828:334:0;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;828:334:0;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9642:246:1;;828:334:0;;;;-1:-1:-1;828:334:0;;;;9738:17:1;828:334:0;;;;;;;;9738:70:1;;;;9642:246;9734:107;;;;;;;9858:23;828:334:0;;9858:23:1;;;;9734:107;9824:7::o;9738:70::-;828:334:0;;;;;;;;9769:23:1;828:334:0;;;;;;;;;;;;;9738:70:1;;;;;;3872:94:6;828:334:0;3935:5:6;828:334:0;;3921:10:6;:19;3917:42;;3872:94::o;3917:42::-;3949:10;828:334:0;;3949:10:6;;;;828:334:0;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;828:334:0;;;;:::o;:::-;;;:::o;797:474:13:-;;;;;986:22;;:27;982:79;;828:334:0;;1105:74:13;;;;;;;;828:334:0;;;;1105:74:13;;;828:334:0;;;;;;;;;;;;;;;;;;;1012:1:13;828:334:0;;;;;;;1105:74:13;;828:334:0;;;;;;;;;;;;;;;;;;;;1089:91:13;;;;;;:::i;:::-;;1195:7;1191:74;;797:474::o;1191:74::-;1105;828:334:0;;1225:29:13;;;;828:334:0;1105:74:13;828:334:0;;;;;;;;982:79:13;1036:14;828:334:0;;1036:14:13;;;;828:334:0;;;;;;;;;;;;;;;;;;;;;;;;:::o;1584:537:13:-;;;;;1802:22;;:27;1798:79;;1934:81;1828:1;828:334:0;;;;1934:81:13;828:334:0;;1934:81:13;828:334:0;;;;;;;;1934:81:13;;;;;;;828:334:0;;;;1934:81:13;;;828:334:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;1934:81:13;;;;;;:::i;:::-;1905:120;;;;;;:::i;:::-;;2040:7;2036:79;;1584:537::o;2036:79::-;1934:81;828:334:0;;2070:34:13;;;;693:540:14;;;;811:20;;:25;807:77;;828:334:0;;943:55:14;;;;;;;828:334:0;;;;943:55:14;;;828:334:0;;;;;;;;;;;;;;;;943:55:14;828:334:0;;;;943:55:14;;;;;;;;;:::i;:::-;835:1;929:70;;;;;;;;;;;;:::i;:::-;1014:7;;1010:68;;828:334:0;;1092:15:14;1088:139;;693:540;;;:::o;1088:139::-;1128:24;943:55;1128:24;;;828:334:0;;;;943:55:14;1128:24;828:334:0;;;;;;;;;;1123:94:14;;;693:540::o;1123:94::-;943:55;828:334:0;;1179:23:14;;;;708:385:15;;;;;830:22;;:27;826:79;;828:334:0;;949:57:15;;;;;;;828:334:0;;;;949:57:15;;;828:334:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;949:57:15;828:334:0;;;;949:57:15;828:334:0;949:57:15;933:74;;;;;;:::i;:::-;;1022:7;1018:69;;708:385::o;1018:69::-;949:57;828:334:0;;1052:24:15;;;
Swarm Source
ipfs://22e7439513dcb6576f04ababd4e3b55180645db99734c24e1fdcbfc68c27ea41
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.