Overview
S Balance
0 S
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 20 from a total of 20 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Scatter Native C... | 5283295 | 37 hrs ago | IN | 20 S | 0.02330443 | ||||
Scatter ERC20Tok... | 5283254 | 37 hrs ago | IN | 0 S | 0.01971948 | ||||
Scatter Native C... | 5237661 | 46 hrs ago | IN | 1 S | 0.00257911 | ||||
Scatter ERC1155T... | 5226936 | 2 days ago | IN | 0 S | 0.07327728 | ||||
Scatter ERC20Tok... | 5155394 | 2 days ago | IN | 0 S | 0.0241128 | ||||
Scatter ERC1155T... | 5135524 | 2 days ago | IN | 0 S | 0.10233767 | ||||
Scatter ERC1155T... | 5135366 | 2 days ago | IN | 0 S | 0.01604597 | ||||
Scatter ERC20Tok... | 5048135 | 3 days ago | IN | 0 S | 0.82424024 | ||||
Scatter ERC20Tok... | 5047785 | 3 days ago | IN | 0 S | 0.0068121 | ||||
Scatter Native C... | 4991938 | 3 days ago | IN | 118 S | 0.04314256 | ||||
Scatter Native C... | 4927867 | 4 days ago | IN | 0.4 S | 0.0075067 | ||||
Scatter ERC1155T... | 4888230 | 4 days ago | IN | 0 S | 0.04413513 | ||||
Scatter ERC1155T... | 4832957 | 4 days ago | IN | 0 S | 0.04413376 | ||||
Scatter ERC1155T... | 4832807 | 4 days ago | IN | 0 S | 0.03425851 | ||||
Scatter ERC1155T... | 4832670 | 4 days ago | IN | 0 S | 0.04413376 | ||||
Scatter Native C... | 4819856 | 4 days ago | IN | 18 S | 0.00618587 | ||||
Scatter ERC1155T... | 4762592 | 5 days ago | IN | 0 S | 0.07327728 | ||||
Scatter ERC1155T... | 4762361 | 5 days ago | IN | 0 S | 0.07327728 | ||||
Scatter Native C... | 4687598 | 5 days ago | IN | 0.02 S | 0.00351522 | ||||
Scatter Native C... | 4687210 | 5 days ago | IN | 0.02 S | 0.00435497 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
5283295 | 37 hrs ago | 2 S | ||||
5283295 | 37 hrs ago | 2 S | ||||
5283295 | 37 hrs ago | 2 S | ||||
5283295 | 37 hrs ago | 2 S | ||||
5283295 | 37 hrs ago | 2 S | ||||
5283295 | 37 hrs ago | 2 S | ||||
5283295 | 37 hrs ago | 2 S | ||||
5283295 | 37 hrs ago | 2 S | ||||
5283295 | 37 hrs ago | 2 S | ||||
5283295 | 37 hrs ago | 2 S | ||||
5237661 | 46 hrs ago | 1 S | ||||
4991938 | 3 days ago | 2 S | ||||
4991938 | 3 days ago | 2 S | ||||
4991938 | 3 days ago | 2 S | ||||
4991938 | 3 days ago | 2 S | ||||
4991938 | 3 days ago | 2 S | ||||
4991938 | 3 days ago | 2 S | ||||
4991938 | 3 days ago | 2 S | ||||
4991938 | 3 days ago | 2 S | ||||
4991938 | 3 days ago | 2 S | ||||
4991938 | 3 days ago | 2 S | ||||
4991938 | 3 days ago | 2 S | ||||
4991938 | 3 days ago | 2 S | ||||
4991938 | 3 days ago | 2 S | ||||
4991938 | 3 days ago | 2 S |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Scatter
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 20000 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/utils/ReentrancyGuardTransient.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Pausable.sol"; import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol"; /// @title Scatter /// @notice A contract for distributing native currency, ERC20, and ERC1155 tokens to multiple recipients /// @dev Implements multiple security features and gas optimizations: /// - ReentrancyGuardTransient: Uses transient storage for gas-efficient reentrancy protection /// - Custom errors: Uses error strings instead of require statements for lower gas costs /// - Optimized loops: Uses unchecked increment (++i) for gas savings /// - ERC1155 batching: Uses batch transfers when possible to reduce gas costs /// - Transfer gas limit: Configurable gas limit for ETH transfers to prevent griefing /// - Ownable: Restricts admin functions to the contract owner /// - Pausable: Allows emergency pause of all distribution functions /// - ERC1155Holder: Enables the contract to receive ERC1155 tokens to be able to withdraw stuck tokens contract Scatter is ReentrancyGuardTransient, Ownable, Pausable, ERC1155Holder { // Events emitted when tokens are scattered event NativeCurrencyScattered(address indexed sender, address[] recipients, uint256[] amounts); event ERC20Scattered(address indexed sender, address indexed token, address[] recipients, uint256[] amounts); event ERC1155Scattered( address indexed sender, address indexed token, address[] recipients, uint256[] ids, uint256[] amounts ); event TransferGasLimitUpdated(uint256 oldLimit, uint256 newLimit); // Custom errors for better gas efficiency and clearer error messages error ArrayLengthMismatch(); error InsufficientValue(); error ZeroAddress(); error ZeroAmount(); error NoTokensToWithdraw(); error NoETHToWithdraw(); error ETHTransferFailed(); error TokenTransferFailed(); error ERC1155TransferFailed(); // State variables mapping(address => uint256) public totalTokenScattered; mapping(address => mapping(uint256 => uint256)) public totalERC1155Scattered; uint256 public totalNativeScattered; uint256 public transferGasLimit = 50000; constructor() Ownable(msg.sender) {} /// @notice Distributes native currency to multiple recipients /// @dev Validates input arrays, calculates total amount needed, transfers ETH to each recipient, /// and returns any excess ETH to the sender. Prevents reentrancy and can be paused. /// @param recipients Array of recipient addresses /// @param amounts Array of amounts to send to each recipient function scatterNativeCurrency(address[] calldata recipients, uint256[] calldata amounts) external payable nonReentrant whenNotPaused { require(recipients.length == amounts.length, ArrayLengthMismatch()); require(recipients.length != 0, ArrayLengthMismatch()); // Calculate total amount needed uint256 totalAmount; for (uint256 i = 0; i < amounts.length; ++i) { totalAmount += amounts[i]; } require(msg.value >= totalAmount, InsufficientValue()); // Transfer to each recipient for (uint256 i = 0; i < recipients.length; ++i) { require(recipients[i] != address(0), ZeroAddress()); require(amounts[i] != 0, ZeroAmount()); (bool success,) = recipients[i].call{value: amounts[i], gas: transferGasLimit}(""); require(success, ETHTransferFailed()); totalNativeScattered += amounts[i]; } // Return excess ETH if any uint256 excess = msg.value - totalAmount; if (excess > 0) { (bool success,) = payable(msg.sender).call{value: excess}(""); require(success, ETHTransferFailed()); } emit NativeCurrencyScattered(msg.sender, recipients, amounts); } /// @notice Distributes ERC20 tokens to multiple recipients /// @dev Uses transferFrom to move tokens directly from sender to recipients. /// Requires prior approval from sender. Returns any excess tokens that may have been /// directly transferred to the contract. Prevents reentrancy and can be paused. /// @param token Address of the ERC20 token contract /// @param recipients Array of recipient addresses /// @param amounts Array of token amounts to send to each recipient function scatterERC20Token(address token, address[] calldata recipients, uint256[] calldata amounts) external nonReentrant whenNotPaused { require(recipients.length == amounts.length, ArrayLengthMismatch()); require(recipients.length != 0, ArrayLengthMismatch()); require(token != address(0), ZeroAddress()); uint256 totalAmount; for (uint256 i = 0; i < amounts.length; ++i) { totalAmount += amounts[i]; } // Transfer tokens from sender to recipients for (uint256 i = 0; i < recipients.length; ++i) { require(recipients[i] != address(0), ZeroAddress()); require(amounts[i] != 0, ZeroAmount()); IERC20(token).transferFrom(msg.sender, recipients[i], amounts[i]); totalTokenScattered[token] += amounts[i]; } emit ERC20Scattered(msg.sender, token, recipients, amounts); // Return excess tokens if any were transferred to the contract uint256 contractBalance = IERC20(token).balanceOf(address(this)); if (contractBalance > 0) { require(IERC20(token).transfer(msg.sender, contractBalance), TokenTransferFailed()); } } /// @notice Distributes ERC1155 tokens to multiple recipients /// @dev Optimizes for gas by using batch transfer when there's only one recipient. /// For multiple recipients, performs individual transfers. Requires prior approval /// from sender. Prevents reentrancy and can be paused. /// @param token Address of the ERC1155 token contract /// @param recipients Array of recipient addresses /// @param amounts Array of token amounts to send to each recipient /// @param ids Array of token IDs to send to each recipient function scatterERC1155Token( address token, address[] calldata recipients, uint256[] calldata amounts, uint256[] calldata ids ) external nonReentrant whenNotPaused { require(recipients.length == amounts.length && recipients.length == ids.length, ArrayLengthMismatch()); require(recipients.length != 0, ArrayLengthMismatch()); require(token != address(0), ZeroAddress()); if (recipients.length == 1) { // For single recipient, use batch transfer for gas efficiency require(recipients[0] != address(0), ZeroAddress()); require(amounts[0] != 0, ZeroAmount()); IERC1155(token).safeBatchTransferFrom(msg.sender, recipients[0], ids, amounts, ""); for (uint256 i = 0; i < ids.length; ++i) { totalERC1155Scattered[token][ids[i]] += amounts[i]; } } else { // Multiple recipients - transfer tokens individually for (uint256 i = 0; i < recipients.length; ++i) { require(recipients[i] != address(0), ZeroAddress()); require(amounts[i] != 0, ZeroAmount()); IERC1155(token).safeTransferFrom(msg.sender, recipients[i], ids[i], amounts[i], ""); totalERC1155Scattered[token][ids[i]] += amounts[i]; } } emit ERC1155Scattered(msg.sender, token, recipients, ids, amounts); } /// @notice Allows owner to withdraw any ETH accidentally sent to the contract /// @dev Safety function to recover ETH. Only callable by contract owner. /// Transfers entire contract ETH balance to owner. function withdrawStuckETH() external onlyOwner { uint256 balance = address(this).balance; require(balance != 0, NoETHToWithdraw()); (bool success,) = payable(owner()).call{value: balance}(""); require(success, ETHTransferFailed()); } /// @notice Allows owner to withdraw any ERC20 tokens accidentally sent to the contract /// @dev Safety function to recover ERC20 tokens. Only callable by contract owner. /// Transfers entire token balance to owner. /// @param token Address of the ERC20 token contract to withdraw function withdrawStuckERC20(address token) external onlyOwner { uint256 balance = IERC20(token).balanceOf(address(this)); require(balance != 0, NoTokensToWithdraw()); require(IERC20(token).transfer(owner(), balance), TokenTransferFailed()); } /// @notice Allows owner to withdraw any ERC1155 tokens accidentally sent to the contract /// @dev Safety function to recover a single ERC1155 token. Only callable by contract owner. /// Transfers entire token balance to owner. /// @param token Address of the ERC1155 token contract /// @param id ID of the token to withdraw function withdrawStuckERC1155(address token, uint256 id) external onlyOwner { uint256 balance = IERC1155(token).balanceOf(address(this), id); require(balance != 0, NoTokensToWithdraw()); IERC1155(token).safeTransferFrom(address(this), owner(), id, balance, ""); } /// @notice Allows owner to withdraw multiple ERC1155 tokens in a single transaction /// @dev Safety function to recover multiple ERC1155 tokens in one transaction. /// Only callable by contract owner. Checks if at least one token has positive balance /// before attempting withdrawal. /// @param token Address of the ERC1155 token contract /// @param ids Array of token IDs to withdraw function withdrawStuckERC1155Batch(address token, uint256[] calldata ids) external onlyOwner { uint256[] memory balances = new uint256[](ids.length); bool hasTokens = false; for (uint256 i = 0; i < ids.length; ++i) { balances[i] = IERC1155(token).balanceOf(address(this), ids[i]); if (balances[i] > 0) hasTokens = true; } require(hasTokens, NoTokensToWithdraw()); IERC1155(token).safeBatchTransferFrom(address(this), owner(), ids, balances, ""); } /// @notice Allows the contract to receive ETH /// @dev Required for contract to receive ETH transfers and refunds receive() external payable {} /// @notice Pauses all token scattering operations /// @dev Emergency function to pause all scatter operations. /// Only callable by contract owner. function pause() external onlyOwner { _pause(); } /// @notice Unpauses all token scattering operations /// @dev Resumes scatter operations after emergency pause. /// Only callable by contract owner. function unpause() external onlyOwner { _unpause(); } /// @notice Adds a new setter function /// @dev Allows the owner to update the transfer gas limit /// @param newLimit The new transfer gas limit function setTransferGasLimit(uint256 newLimit) external onlyOwner { uint256 oldLimit = transferGasLimit; transferGasLimit = newLimit; emit TransferGasLimitUpdated(oldLimit, newLimit); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuardTransient.sol) pragma solidity ^0.8.24; import {TransientSlot} from "./TransientSlot.sol"; /** * @dev Variant of {ReentrancyGuard} that uses transient storage. * * NOTE: This variant only works on networks where EIP-1153 is available. * * _Available since v5.1._ */ abstract contract ReentrancyGuardTransient { using TransientSlot for *; // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ReentrancyGuard")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant REENTRANCY_GUARD_STORAGE = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_reentrancyGuardEntered()) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail REENTRANCY_GUARD_STORAGE.asBoolean().tstore(true); } function _nonReentrantAfter() private { REENTRANCY_GUARD_STORAGE.asBoolean().tstore(false); } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return REENTRANCY_GUARD_STORAGE.asBoolean().tload(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.20; import {IERC165} from "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC-1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[ERC]. */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` amount of tokens of type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the value of tokens of token type `id` owned by `account`. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] calldata accounts, uint256[] calldata ids ) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the zero address. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`. * * WARNING: This function can potentially allow a reentrancy attack when transferring tokens * to an untrusted contract, when invoking {onERC1155Received} on the receiver. * Ensure to follow the checks-effects-interactions pattern and consider employing * reentrancy guards when interacting with untrusted contracts. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `value` amount. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * WARNING: This function can potentially allow a reentrancy attack when transferring tokens * to an untrusted contract, when invoking {onERC1155BatchReceived} on the receiver. * Ensure to follow the checks-effects-interactions pattern and consider employing * reentrancy guards when interacting with untrusted contracts. * * Emits either a {TransferSingle} or a {TransferBatch} event, depending on the length of the array arguments. * * Requirements: * * - `ids` and `values` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { bool private _paused; /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.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: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/TransientSlot.sol) // This file was procedurally generated from scripts/generate/templates/TransientSlot.js. pragma solidity ^0.8.24; /** * @dev Library for reading and writing value-types to specific transient storage slots. * * Transient slots are often used to store temporary values that are removed after the current transaction. * This library helps with reading and writing to such slots without the need for inline assembly. * * * Example reading and writing values using transient storage: * ```solidity * contract Lock { * using TransientSlot for *; * * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot. * bytes32 internal constant _LOCK_SLOT = 0xf4678858b2b588224636b8522b729e7722d32fc491da849ed75b3fdf3c84f542; * * modifier locked() { * require(!_LOCK_SLOT.asBoolean().tload()); * * _LOCK_SLOT.asBoolean().tstore(true); * _; * _LOCK_SLOT.asBoolean().tstore(false); * } * } * ``` * * TIP: Consider using this library along with {SlotDerivation}. */ library TransientSlot { /** * @dev UDVT that represent a slot holding a address. */ type AddressSlot is bytes32; /** * @dev Cast an arbitrary slot to a AddressSlot. */ function asAddress(bytes32 slot) internal pure returns (AddressSlot) { return AddressSlot.wrap(slot); } /** * @dev UDVT that represent a slot holding a bool. */ type BooleanSlot is bytes32; /** * @dev Cast an arbitrary slot to a BooleanSlot. */ function asBoolean(bytes32 slot) internal pure returns (BooleanSlot) { return BooleanSlot.wrap(slot); } /** * @dev UDVT that represent a slot holding a bytes32. */ type Bytes32Slot is bytes32; /** * @dev Cast an arbitrary slot to a Bytes32Slot. */ function asBytes32(bytes32 slot) internal pure returns (Bytes32Slot) { return Bytes32Slot.wrap(slot); } /** * @dev UDVT that represent a slot holding a uint256. */ type Uint256Slot is bytes32; /** * @dev Cast an arbitrary slot to a Uint256Slot. */ function asUint256(bytes32 slot) internal pure returns (Uint256Slot) { return Uint256Slot.wrap(slot); } /** * @dev UDVT that represent a slot holding a int256. */ type Int256Slot is bytes32; /** * @dev Cast an arbitrary slot to a Int256Slot. */ function asInt256(bytes32 slot) internal pure returns (Int256Slot) { return Int256Slot.wrap(slot); } /** * @dev Load the value held at location `slot` in transient storage. */ function tload(AddressSlot slot) internal view returns (address value) { assembly ("memory-safe") { value := tload(slot) } } /** * @dev Store `value` at location `slot` in transient storage. */ function tstore(AddressSlot slot, address value) internal { assembly ("memory-safe") { tstore(slot, value) } } /** * @dev Load the value held at location `slot` in transient storage. */ function tload(BooleanSlot slot) internal view returns (bool value) { assembly ("memory-safe") { value := tload(slot) } } /** * @dev Store `value` at location `slot` in transient storage. */ function tstore(BooleanSlot slot, bool value) internal { assembly ("memory-safe") { tstore(slot, value) } } /** * @dev Load the value held at location `slot` in transient storage. */ function tload(Bytes32Slot slot) internal view returns (bytes32 value) { assembly ("memory-safe") { value := tload(slot) } } /** * @dev Store `value` at location `slot` in transient storage. */ function tstore(Bytes32Slot slot, bytes32 value) internal { assembly ("memory-safe") { tstore(slot, value) } } /** * @dev Load the value held at location `slot` in transient storage. */ function tload(Uint256Slot slot) internal view returns (uint256 value) { assembly ("memory-safe") { value := tload(slot) } } /** * @dev Store `value` at location `slot` in transient storage. */ function tstore(Uint256Slot slot, uint256 value) internal { assembly ("memory-safe") { tstore(slot, value) } } /** * @dev Load the value held at location `slot` in transient storage. */ function tload(Int256Slot slot) internal view returns (int256 value) { assembly ("memory-safe") { value := tload(slot) } } /** * @dev Store `value` at location `slot` in transient storage. */ function tstore(Int256Slot slot, int256 value) internal { assembly ("memory-safe") { tstore(slot, value) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.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.1.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); }
{ "remappings": [ "@openzeppelin/=lib/openzeppelin-contracts/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/" ], "optimizer": { "enabled": true, "runs": 20000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "cancun", "viaIR": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"ERC1155TransferFailed","type":"error"},{"inputs":[],"name":"ETHTransferFailed","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"InsufficientValue","type":"error"},{"inputs":[],"name":"NoETHToWithdraw","type":"error"},{"inputs":[],"name":"NoTokensToWithdraw","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"TokenTransferFailed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address[]","name":"recipients","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"ERC1155Scattered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address[]","name":"recipients","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"ERC20Scattered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"recipients","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"NativeCurrencyScattered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"TransferGasLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"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":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"scatterERC1155Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"scatterERC20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"scatterNativeCurrency","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"setTransferGasLimit","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":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalERC1155Scattered","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNativeScattered","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalTokenScattered","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferGasLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"withdrawStuckERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"withdrawStuckERC1155Batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdrawStuckERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405261c3506004553480156014575f5ffd5b503380603957604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6040816051565b505f805460ff60a01b1916905560a0565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61271c806100ad5f395ff3fe608060405260043610610165575f3560e01c80638c70830b116100c6578063d4d1830e1161007c578063f23a6e6111610057578063f23a6e611461041e578063f2fde38b14610462578063f5648a4f14610481575f5ffd5b8063d4d1830e146103b4578063e1f98e7b146103ea578063e8f67c3b14610409575f5ffd5b8063a6f1eae1116100ac578063a6f1eae11461030d578063abd8dbb114610320578063bc197c811461033f575f5ffd5b80638c70830b146102bb5780638da5cb5b146102da575f5ffd5b80635c975abb1161011b578063715018a611610101578063715018a614610274578063776a6483146102885780638456cb59146102a7575f5ffd5b80635c975abb1461021b5780636eab769d14610249575f5ffd5b80633963510b1161014b5780633963510b146101c75780633d771887146101e85780633f4ba83a14610207575f5ffd5b806301ffc9a714610170578063238601f1146101a4575f5ffd5b3661016c57005b5f5ffd5b34801561017b575f5ffd5b5061018f61018a366004611e88565b610495565b60405190151581526020015b60405180910390f35b3480156101af575f5ffd5b506101b960035481565b60405190815260200161019b565b3480156101d2575f5ffd5b506101e66101e1366004611ef6565b61052d565b005b3480156101f3575f5ffd5b506101e6610202366004611f57565b610705565b348015610212575f5ffd5b506101e6610ce9565b348015610226575f5ffd5b505f5474010000000000000000000000000000000000000000900460ff1661018f565b348015610254575f5ffd5b506101b9610263366004611ef6565b60016020525f908152604090205481565b34801561027f575f5ffd5b506101e6610cfb565b348015610293575f5ffd5b506101e66102a2366004612006565b610d0c565b3480156102b2575f5ffd5b506101e6610f42565b3480156102c6575f5ffd5b506101e66102d5366004612055565b610f52565b3480156102e5575f5ffd5b505f5460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101e661031b36600461206c565b610f9f565b34801561032b575f5ffd5b506101e661033a3660046120d8565b61136f565b34801561034a575f5ffd5b50610383610359366004612286565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161019b565b3480156103bf575f5ffd5b506101b96103ce3660046120d8565b600260209081525f928352604080842090915290825290205481565b3480156103f5575f5ffd5b506101e6610404366004612335565b611517565b348015610414575f5ffd5b506101b960045481565b348015610429575f5ffd5b506103836104383660046123b5565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b34801561046d575f5ffd5b506101e661047c366004611ef6565b611a38565b34801561048c575f5ffd5b506101e6611aa0565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000148061052757507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610535611b7a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561059f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c39190612409565b9050805f036105fe576040517ffba5154e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6106385f5473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303815f875af11580156106a7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106cb9190612420565b610701576040517f045c4b0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b61070d611bcc565b610715611c52565b848314801561072357508481145b610759576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f859003610793576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166107e0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018590036109ec575f868682816107fa576107fa61243f565b905060200201602081019061080f9190611ef6565b73ffffffffffffffffffffffffffffffffffffffff160361085c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83835f81811061086e5761086e61243f565b905060200201355f036108ad576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff16632eb2c2d63388885f8181106108dc576108dc61243f565b90506020020160208101906108f19190611ef6565b858589896040518763ffffffff1660e01b8152600401610916969594939291906124b5565b5f604051808303815f87803b15801561092d575f5ffd5b505af115801561093f573d5f5f3e3d5ffd5b505f925050505b818110156109e6578484828181106109605761096061243f565b9050602002013560025f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8585858181106109b7576109b761243f565b9050602002013581526020019081526020015f205f8282546109d9919061255e565b9091555050600101610946565b50610c69565b5f5b85811015610c67575f878783818110610a0957610a0961243f565b9050602002016020810190610a1e9190611ef6565b73ffffffffffffffffffffffffffffffffffffffff1603610a6b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b848482818110610a7d57610a7d61243f565b905060200201355f03610abc576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff1663f242432a33898985818110610aeb57610aeb61243f565b9050602002016020810190610b009190611ef6565b868686818110610b1257610b1261243f565b90506020020135898987818110610b2b57610b2b61243f565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b16815273ffffffffffffffffffffffffffffffffffffffff968716600482015295909416602486015250604484019190915260209091020135606482015260a060848201525f60a482015260c4015f604051808303815f87803b158015610bb9575f5ffd5b505af1158015610bcb573d5f5f3e3d5ffd5b50505050848482818110610be157610be161243f565b9050602002013560025f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f858585818110610c3857610c3861243f565b9050602002013581526020019081526020015f205f828254610c5a919061255e565b90915550506001016109ee565b505b8673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc5184a241770af29d7459c80daa96e85e86fbc8c12e7b82cce60728a2b29c2e1888886868a8a604051610cd0969594939291906125c4565b60405180910390a3610ce0611ca6565b50505050505050565b610cf1611b7a565b610cf9611cd0565b565b610d03611b7a565b610cf95f611d4c565b610d14611b7a565b5f8167ffffffffffffffff811115610d2e57610d2e612100565b604051908082528060200260200182016040528015610d57578160200160208202803683370190505b5090505f805b83811015610e78578573ffffffffffffffffffffffffffffffffffffffff1662fdd58e30878785818110610d9357610d9361243f565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff90941660048501526020029190910135602483015250604401602060405180830381865afa158015610e08573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2c9190612409565b838281518110610e3e57610e3e61243f565b6020026020010181815250505f838281518110610e5d57610e5d61243f565b60200260200101511115610e7057600191505b600101610d5d565b5080610eb0576040517ffba5154e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16632eb2c2d630610eeb5f5473ffffffffffffffffffffffffffffffffffffffff1690565b8787876040518663ffffffff1660e01b8152600401610f0e95949392919061260c565b5f604051808303815f87803b158015610f25575f5ffd5b505af1158015610f37573d5f5f3e3d5ffd5b505050505050505050565b610f4a611b7a565b610cf9611dc0565b610f5a611b7a565b600480549082905560408051828152602081018490527ffae5331c56ab4b703b1c2589f46ab028047b78d85b768f73163900a1c5ece595910160405180910390a15050565b610fa7611bcc565b610faf611c52565b828114610fe8576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f839003611022576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8281101561105b5783838281811061103f5761103f61243f565b9050602002013582611051919061255e565b9150600101611025565b5080341015611096576040517f1101129400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b84811015611276575f8686838181106110b3576110b361243f565b90506020020160208101906110c89190611ef6565b73ffffffffffffffffffffffffffffffffffffffff1603611115576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8383828181106111275761112761243f565b905060200201355f03611166576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8686838181106111795761117961243f565b905060200201602081019061118e9190611ef6565b73ffffffffffffffffffffffffffffffffffffffff168585848181106111b6576111b661243f565b90506020020135600454906040515f60405180830381858888f193505050503d805f81146111ff576040519150601f19603f3d011682016040523d82523d5f602084013e611204565b606091505b505090508061123f576040517fb12d13eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8484838181106112515761125161243f565b9050602002013560035f828254611268919061255e565b909155505050600101611098565b505f61128282346126a2565b9050801561130b576040515f90339083908381818185875af1925050503d805f81146112c9576040519150601f19603f3d011682016040523d82523d5f602084013e6112ce565b606091505b5050905080611309576040517fb12d13eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b3373ffffffffffffffffffffffffffffffffffffffff167fba00c2df84b6aff886654a052347e9e06e6c7ab9fe2b0a14d205f28b3bf79ef28787878760405161135794939291906126b5565b60405180910390a25050611369611ca6565b50505050565b611377611b7a565b6040517efdd58e000000000000000000000000000000000000000000000000000000008152306004820152602481018290525f9073ffffffffffffffffffffffffffffffffffffffff84169062fdd58e90604401602060405180830381865afa1580156113e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140a9190612409565b9050805f03611445576040517ffba5154e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663f242432a306114805f5473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604481018590526064810184905260a060848201525f60a482015260c4015f604051808303815f87803b158015611505575f5ffd5b505af1158015610ce0573d5f5f3e3d5ffd5b61151f611bcc565b611527611c52565b828114611560576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f83900361159a576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85166115e7576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b82811015611620578383828181106116045761160461243f565b9050602002013582611616919061255e565b91506001016115ea565b505f5b8481101561185b575f86868381811061163e5761163e61243f565b90506020020160208101906116539190611ef6565b73ffffffffffffffffffffffffffffffffffffffff16036116a0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8383828181106116b2576116b261243f565b905060200201355f036116f1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff166323b872dd338888858181106117205761172061243f565b90506020020160208101906117359190611ef6565b8787868181106117475761174761243f565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff9586166004820152949093166024850152506020909102013560448201526064016020604051808303815f875af11580156117c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117e99190612420565b508383828181106117fc576117fc61243f565b9050602002013560015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461184e919061255e565b9091555050600101611623565b508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f38692dfb6a7f7ea9462f67ca0ea1284ccb9ffb48cd6e505a8ec1c9b3571e7ef1878787876040516118bf94939291906126b5565b60405180910390a36040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa158015611931573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119559190612409565b90508015611a27576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff88169063a9059cbb906044016020604051808303815f875af11580156119cd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119f19190612420565b611a27576040517f045c4b0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050611a31611ca6565b5050505050565b611a40611b7a565b73ffffffffffffffffffffffffffffffffffffffff8116611a94576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b611a9d81611d4c565b50565b611aa8611b7a565b475f819003611ae3576040517fcff858f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805460405173ffffffffffffffffffffffffffffffffffffffff9091169083908381818185875af1925050503d805f8114611b3a576040519150601f19603f3d011682016040523d82523d5f602084013e611b3f565b606091505b5050905080610701576040517fb12d13eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5473ffffffffffffffffffffffffffffffffffffffff163314610cf9576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401611a8b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c15611c25576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cf960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b90611e2e565b5f5474010000000000000000000000000000000000000000900460ff1615610cf9576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cf95f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00611c4c565b611cd8611e35565b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611dc8611c52565b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611d223390565b80825d5050565b5f5474010000000000000000000000000000000000000000900460ff16610cf9576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60208284031215611e98575f5ffd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611ec7575f5ffd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611ef1575f5ffd5b919050565b5f60208284031215611f06575f5ffd5b611ec782611ece565b5f5f83601f840112611f1f575f5ffd5b50813567ffffffffffffffff811115611f36575f5ffd5b6020830191508360208260051b8501011115611f50575f5ffd5b9250929050565b5f5f5f5f5f5f5f6080888a031215611f6d575f5ffd5b611f7688611ece565b9650602088013567ffffffffffffffff811115611f91575f5ffd5b611f9d8a828b01611f0f565b909750955050604088013567ffffffffffffffff811115611fbc575f5ffd5b611fc88a828b01611f0f565b909550935050606088013567ffffffffffffffff811115611fe7575f5ffd5b611ff38a828b01611f0f565b989b979a50959850939692959293505050565b5f5f5f60408486031215612018575f5ffd5b61202184611ece565b9250602084013567ffffffffffffffff81111561203c575f5ffd5b61204886828701611f0f565b9497909650939450505050565b5f60208284031215612065575f5ffd5b5035919050565b5f5f5f5f6040858703121561207f575f5ffd5b843567ffffffffffffffff811115612095575f5ffd5b6120a187828801611f0f565b909550935050602085013567ffffffffffffffff8111156120c0575f5ffd5b6120cc87828801611f0f565b95989497509550505050565b5f5f604083850312156120e9575f5ffd5b6120f283611ece565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561217457612174612100565b604052919050565b5f82601f83011261218b575f5ffd5b813567ffffffffffffffff8111156121a5576121a5612100565b8060051b6121b56020820161212d565b918252602081850181019290810190868411156121d0575f5ffd5b6020860192505b838310156121f25782358252602092830192909101906121d7565b9695505050505050565b5f82601f83011261220b575f5ffd5b813567ffffffffffffffff81111561222557612225612100565b61225660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161212d565b81815284602083860101111561226a575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f5f60a0868803121561229a575f5ffd5b6122a386611ece565b94506122b160208701611ece565b9350604086013567ffffffffffffffff8111156122cc575f5ffd5b6122d88882890161217c565b935050606086013567ffffffffffffffff8111156122f4575f5ffd5b6123008882890161217c565b925050608086013567ffffffffffffffff81111561231c575f5ffd5b612328888289016121fc565b9150509295509295909350565b5f5f5f5f5f60608688031215612349575f5ffd5b61235286611ece565b9450602086013567ffffffffffffffff81111561236d575f5ffd5b61237988828901611f0f565b909550935050604086013567ffffffffffffffff811115612398575f5ffd5b6123a488828901611f0f565b969995985093965092949392505050565b5f5f5f5f5f60a086880312156123c9575f5ffd5b6123d286611ece565b94506123e060208701611ece565b93506040860135925060608601359150608086013567ffffffffffffffff81111561231c575f5ffd5b5f60208284031215612419575f5ffd5b5051919050565b5f60208284031215612430575f5ffd5b81518015158114611ec7575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8183525f7f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561249c575f5ffd5b8260051b80836020870137939093016020019392505050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015260a060408201525f61250060a08301868861246c565b828103606084015261251381858761246c565b83810360809094019390935250505f81526020019695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561052757610527612531565b8183526020830192505f815f5b848110156125ba5773ffffffffffffffffffffffffffffffffffffffff6125a483611ece565b168652602095860195919091019060010161257e565b5093949350505050565b606081525f6125d760608301888a612571565b82810360208401526125ea81878961246c565b905082810360408401526125ff81858761246c565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015260a060408201525f61265760a08301858761246c565b8281036060840152835180825260208086019201905f5b8181101561268c57835183526020938401939092019160010161266e565b505083810360808501525f8152602081016125ff565b8181038181111561052757610527612531565b604081525f6126c8604083018688612571565b82810360208401526126db81858761246c565b97965050505050505056fea264697066735822122094962330e864a9db56133231fd17220a6e6bbedfb656da265c040d0087aa650c64736f6c634300081c0033
Deployed Bytecode
0x608060405260043610610165575f3560e01c80638c70830b116100c6578063d4d1830e1161007c578063f23a6e6111610057578063f23a6e611461041e578063f2fde38b14610462578063f5648a4f14610481575f5ffd5b8063d4d1830e146103b4578063e1f98e7b146103ea578063e8f67c3b14610409575f5ffd5b8063a6f1eae1116100ac578063a6f1eae11461030d578063abd8dbb114610320578063bc197c811461033f575f5ffd5b80638c70830b146102bb5780638da5cb5b146102da575f5ffd5b80635c975abb1161011b578063715018a611610101578063715018a614610274578063776a6483146102885780638456cb59146102a7575f5ffd5b80635c975abb1461021b5780636eab769d14610249575f5ffd5b80633963510b1161014b5780633963510b146101c75780633d771887146101e85780633f4ba83a14610207575f5ffd5b806301ffc9a714610170578063238601f1146101a4575f5ffd5b3661016c57005b5f5ffd5b34801561017b575f5ffd5b5061018f61018a366004611e88565b610495565b60405190151581526020015b60405180910390f35b3480156101af575f5ffd5b506101b960035481565b60405190815260200161019b565b3480156101d2575f5ffd5b506101e66101e1366004611ef6565b61052d565b005b3480156101f3575f5ffd5b506101e6610202366004611f57565b610705565b348015610212575f5ffd5b506101e6610ce9565b348015610226575f5ffd5b505f5474010000000000000000000000000000000000000000900460ff1661018f565b348015610254575f5ffd5b506101b9610263366004611ef6565b60016020525f908152604090205481565b34801561027f575f5ffd5b506101e6610cfb565b348015610293575f5ffd5b506101e66102a2366004612006565b610d0c565b3480156102b2575f5ffd5b506101e6610f42565b3480156102c6575f5ffd5b506101e66102d5366004612055565b610f52565b3480156102e5575f5ffd5b505f5460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101e661031b36600461206c565b610f9f565b34801561032b575f5ffd5b506101e661033a3660046120d8565b61136f565b34801561034a575f5ffd5b50610383610359366004612286565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161019b565b3480156103bf575f5ffd5b506101b96103ce3660046120d8565b600260209081525f928352604080842090915290825290205481565b3480156103f5575f5ffd5b506101e6610404366004612335565b611517565b348015610414575f5ffd5b506101b960045481565b348015610429575f5ffd5b506103836104383660046123b5565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b34801561046d575f5ffd5b506101e661047c366004611ef6565b611a38565b34801561048c575f5ffd5b506101e6611aa0565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000148061052757507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610535611b7a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561059f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c39190612409565b9050805f036105fe576040517ffba5154e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6106385f5473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303815f875af11580156106a7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106cb9190612420565b610701576040517f045c4b0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b61070d611bcc565b610715611c52565b848314801561072357508481145b610759576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f859003610793576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166107e0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018590036109ec575f868682816107fa576107fa61243f565b905060200201602081019061080f9190611ef6565b73ffffffffffffffffffffffffffffffffffffffff160361085c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83835f81811061086e5761086e61243f565b905060200201355f036108ad576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff16632eb2c2d63388885f8181106108dc576108dc61243f565b90506020020160208101906108f19190611ef6565b858589896040518763ffffffff1660e01b8152600401610916969594939291906124b5565b5f604051808303815f87803b15801561092d575f5ffd5b505af115801561093f573d5f5f3e3d5ffd5b505f925050505b818110156109e6578484828181106109605761096061243f565b9050602002013560025f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8585858181106109b7576109b761243f565b9050602002013581526020019081526020015f205f8282546109d9919061255e565b9091555050600101610946565b50610c69565b5f5b85811015610c67575f878783818110610a0957610a0961243f565b9050602002016020810190610a1e9190611ef6565b73ffffffffffffffffffffffffffffffffffffffff1603610a6b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b848482818110610a7d57610a7d61243f565b905060200201355f03610abc576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff1663f242432a33898985818110610aeb57610aeb61243f565b9050602002016020810190610b009190611ef6565b868686818110610b1257610b1261243f565b90506020020135898987818110610b2b57610b2b61243f565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b16815273ffffffffffffffffffffffffffffffffffffffff968716600482015295909416602486015250604484019190915260209091020135606482015260a060848201525f60a482015260c4015f604051808303815f87803b158015610bb9575f5ffd5b505af1158015610bcb573d5f5f3e3d5ffd5b50505050848482818110610be157610be161243f565b9050602002013560025f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f858585818110610c3857610c3861243f565b9050602002013581526020019081526020015f205f828254610c5a919061255e565b90915550506001016109ee565b505b8673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc5184a241770af29d7459c80daa96e85e86fbc8c12e7b82cce60728a2b29c2e1888886868a8a604051610cd0969594939291906125c4565b60405180910390a3610ce0611ca6565b50505050505050565b610cf1611b7a565b610cf9611cd0565b565b610d03611b7a565b610cf95f611d4c565b610d14611b7a565b5f8167ffffffffffffffff811115610d2e57610d2e612100565b604051908082528060200260200182016040528015610d57578160200160208202803683370190505b5090505f805b83811015610e78578573ffffffffffffffffffffffffffffffffffffffff1662fdd58e30878785818110610d9357610d9361243f565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff90941660048501526020029190910135602483015250604401602060405180830381865afa158015610e08573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2c9190612409565b838281518110610e3e57610e3e61243f565b6020026020010181815250505f838281518110610e5d57610e5d61243f565b60200260200101511115610e7057600191505b600101610d5d565b5080610eb0576040517ffba5154e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16632eb2c2d630610eeb5f5473ffffffffffffffffffffffffffffffffffffffff1690565b8787876040518663ffffffff1660e01b8152600401610f0e95949392919061260c565b5f604051808303815f87803b158015610f25575f5ffd5b505af1158015610f37573d5f5f3e3d5ffd5b505050505050505050565b610f4a611b7a565b610cf9611dc0565b610f5a611b7a565b600480549082905560408051828152602081018490527ffae5331c56ab4b703b1c2589f46ab028047b78d85b768f73163900a1c5ece595910160405180910390a15050565b610fa7611bcc565b610faf611c52565b828114610fe8576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f839003611022576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8281101561105b5783838281811061103f5761103f61243f565b9050602002013582611051919061255e565b9150600101611025565b5080341015611096576040517f1101129400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b84811015611276575f8686838181106110b3576110b361243f565b90506020020160208101906110c89190611ef6565b73ffffffffffffffffffffffffffffffffffffffff1603611115576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8383828181106111275761112761243f565b905060200201355f03611166576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8686838181106111795761117961243f565b905060200201602081019061118e9190611ef6565b73ffffffffffffffffffffffffffffffffffffffff168585848181106111b6576111b661243f565b90506020020135600454906040515f60405180830381858888f193505050503d805f81146111ff576040519150601f19603f3d011682016040523d82523d5f602084013e611204565b606091505b505090508061123f576040517fb12d13eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8484838181106112515761125161243f565b9050602002013560035f828254611268919061255e565b909155505050600101611098565b505f61128282346126a2565b9050801561130b576040515f90339083908381818185875af1925050503d805f81146112c9576040519150601f19603f3d011682016040523d82523d5f602084013e6112ce565b606091505b5050905080611309576040517fb12d13eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b3373ffffffffffffffffffffffffffffffffffffffff167fba00c2df84b6aff886654a052347e9e06e6c7ab9fe2b0a14d205f28b3bf79ef28787878760405161135794939291906126b5565b60405180910390a25050611369611ca6565b50505050565b611377611b7a565b6040517efdd58e000000000000000000000000000000000000000000000000000000008152306004820152602481018290525f9073ffffffffffffffffffffffffffffffffffffffff84169062fdd58e90604401602060405180830381865afa1580156113e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140a9190612409565b9050805f03611445576040517ffba5154e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663f242432a306114805f5473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604481018590526064810184905260a060848201525f60a482015260c4015f604051808303815f87803b158015611505575f5ffd5b505af1158015610ce0573d5f5f3e3d5ffd5b61151f611bcc565b611527611c52565b828114611560576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f83900361159a576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85166115e7576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b82811015611620578383828181106116045761160461243f565b9050602002013582611616919061255e565b91506001016115ea565b505f5b8481101561185b575f86868381811061163e5761163e61243f565b90506020020160208101906116539190611ef6565b73ffffffffffffffffffffffffffffffffffffffff16036116a0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8383828181106116b2576116b261243f565b905060200201355f036116f1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff166323b872dd338888858181106117205761172061243f565b90506020020160208101906117359190611ef6565b8787868181106117475761174761243f565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff9586166004820152949093166024850152506020909102013560448201526064016020604051808303815f875af11580156117c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117e99190612420565b508383828181106117fc576117fc61243f565b9050602002013560015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461184e919061255e565b9091555050600101611623565b508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f38692dfb6a7f7ea9462f67ca0ea1284ccb9ffb48cd6e505a8ec1c9b3571e7ef1878787876040516118bf94939291906126b5565b60405180910390a36040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa158015611931573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119559190612409565b90508015611a27576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff88169063a9059cbb906044016020604051808303815f875af11580156119cd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119f19190612420565b611a27576040517f045c4b0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050611a31611ca6565b5050505050565b611a40611b7a565b73ffffffffffffffffffffffffffffffffffffffff8116611a94576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b611a9d81611d4c565b50565b611aa8611b7a565b475f819003611ae3576040517fcff858f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805460405173ffffffffffffffffffffffffffffffffffffffff9091169083908381818185875af1925050503d805f8114611b3a576040519150601f19603f3d011682016040523d82523d5f602084013e611b3f565b606091505b5050905080610701576040517fb12d13eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5473ffffffffffffffffffffffffffffffffffffffff163314610cf9576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401611a8b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c15611c25576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cf960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b90611e2e565b5f5474010000000000000000000000000000000000000000900460ff1615610cf9576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cf95f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00611c4c565b611cd8611e35565b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611dc8611c52565b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611d223390565b80825d5050565b5f5474010000000000000000000000000000000000000000900460ff16610cf9576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60208284031215611e98575f5ffd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611ec7575f5ffd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611ef1575f5ffd5b919050565b5f60208284031215611f06575f5ffd5b611ec782611ece565b5f5f83601f840112611f1f575f5ffd5b50813567ffffffffffffffff811115611f36575f5ffd5b6020830191508360208260051b8501011115611f50575f5ffd5b9250929050565b5f5f5f5f5f5f5f6080888a031215611f6d575f5ffd5b611f7688611ece565b9650602088013567ffffffffffffffff811115611f91575f5ffd5b611f9d8a828b01611f0f565b909750955050604088013567ffffffffffffffff811115611fbc575f5ffd5b611fc88a828b01611f0f565b909550935050606088013567ffffffffffffffff811115611fe7575f5ffd5b611ff38a828b01611f0f565b989b979a50959850939692959293505050565b5f5f5f60408486031215612018575f5ffd5b61202184611ece565b9250602084013567ffffffffffffffff81111561203c575f5ffd5b61204886828701611f0f565b9497909650939450505050565b5f60208284031215612065575f5ffd5b5035919050565b5f5f5f5f6040858703121561207f575f5ffd5b843567ffffffffffffffff811115612095575f5ffd5b6120a187828801611f0f565b909550935050602085013567ffffffffffffffff8111156120c0575f5ffd5b6120cc87828801611f0f565b95989497509550505050565b5f5f604083850312156120e9575f5ffd5b6120f283611ece565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561217457612174612100565b604052919050565b5f82601f83011261218b575f5ffd5b813567ffffffffffffffff8111156121a5576121a5612100565b8060051b6121b56020820161212d565b918252602081850181019290810190868411156121d0575f5ffd5b6020860192505b838310156121f25782358252602092830192909101906121d7565b9695505050505050565b5f82601f83011261220b575f5ffd5b813567ffffffffffffffff81111561222557612225612100565b61225660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161212d565b81815284602083860101111561226a575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f5f60a0868803121561229a575f5ffd5b6122a386611ece565b94506122b160208701611ece565b9350604086013567ffffffffffffffff8111156122cc575f5ffd5b6122d88882890161217c565b935050606086013567ffffffffffffffff8111156122f4575f5ffd5b6123008882890161217c565b925050608086013567ffffffffffffffff81111561231c575f5ffd5b612328888289016121fc565b9150509295509295909350565b5f5f5f5f5f60608688031215612349575f5ffd5b61235286611ece565b9450602086013567ffffffffffffffff81111561236d575f5ffd5b61237988828901611f0f565b909550935050604086013567ffffffffffffffff811115612398575f5ffd5b6123a488828901611f0f565b969995985093965092949392505050565b5f5f5f5f5f60a086880312156123c9575f5ffd5b6123d286611ece565b94506123e060208701611ece565b93506040860135925060608601359150608086013567ffffffffffffffff81111561231c575f5ffd5b5f60208284031215612419575f5ffd5b5051919050565b5f60208284031215612430575f5ffd5b81518015158114611ec7575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8183525f7f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561249c575f5ffd5b8260051b80836020870137939093016020019392505050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015260a060408201525f61250060a08301868861246c565b828103606084015261251381858761246c565b83810360809094019390935250505f81526020019695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561052757610527612531565b8183526020830192505f815f5b848110156125ba5773ffffffffffffffffffffffffffffffffffffffff6125a483611ece565b168652602095860195919091019060010161257e565b5093949350505050565b606081525f6125d760608301888a612571565b82810360208401526125ea81878961246c565b905082810360408401526125ff81858761246c565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015260a060408201525f61265760a08301858761246c565b8281036060840152835180825260208086019201905f5b8181101561268c57835183526020938401939092019160010161266e565b505083810360808501525f8152602081016125ff565b8181038181111561052757610527612531565b604081525f6126c8604083018688612571565b82810360208401526126db81858761246c565b97965050505050505056fea264697066735822122094962330e864a9db56133231fd17220a6e6bbedfb656da265c040d0087aa650c64736f6c634300081c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.