Source Code
Overview
S Balance
0 S
More Info
ContractCreator
Loading...
Loading
Contract Name:
FreeBulkSender
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity 0.8.20; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; /** * @title BulkSender MultiSender, support ETH and ERC20 Tokens, send ether or erc20 token to multiple addresses in batch * @dev To Use this Dapp: https://bulksender.app */ contract FreeBulkSender { event Bulksend(address[] _tos, uint256[] _values); event BulksendToken(IERC20 indexed token, address[] _tos, uint256[] _values); event BulksendTokens(IERC20[] tokens, address[] _tos, uint256[] _values); /* Send ether with the different value by a explicit call method */ function bulksend(address[] calldata _tos, uint[] calldata _values) payable external { require(_tos.length == _values.length, "Wrong lengths"); uint remainingValue = msg.value; for (uint256 i; i < _tos.length;) { remainingValue = remainingValue - _values[i]; (bool result, ) = _tos[i].call{value: _values[i]}(""); require(result, "Failed to send Ether"); unchecked { ++i; } } if (remainingValue > 0) { (bool result, ) = msg.sender.call{value: remainingValue}(""); require(result, "Failed to send Ether"); } emit Bulksend(_tos, _values); } /* Send coin with the different value by a explicit call method */ function bulksendToken( IERC20 _token, address[] calldata _tos, uint256[] calldata _values ) external { require(_tos.length == _values.length, "Wrong lengths"); for (uint256 i; i < _tos.length;) { SafeERC20.safeTransferFrom(_token, msg.sender, _tos[i], _values[i]); unchecked { ++i; } } emit BulksendToken(_token, _tos, _values); } function bulksendTokens( IERC20[] calldata _tokens, address[] calldata _tos, uint256[] calldata _values ) external { require(_tokens.length == _values.length, "Wrong lengths"); require(_tos.length == _values.length, "Wrong lengths"); for (uint256 i; i < _tos.length;) { SafeERC20.safeTransferFrom(_tokens[i], msg.sender, _tos[i], _values[i]); unchecked { ++i; } } emit BulksendTokens(_tokens, _tos, _values); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.2.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; import {IERC1363} from "../../../interfaces/IERC1363.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC-20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { /** * @dev An operation with an ERC-20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. * * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being * set here. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { safeTransfer(token, to, value); } else if (!token.transferAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferFromAndCallRelaxed( IERC1363 token, address from, address to, uint256 value, bytes memory data ) internal { if (to.code.length == 0) { safeTransferFrom(token, from, to, value); } else if (!token.transferFromAndCall(from, to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}. * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall} * once without retrying, and relies on the returned value to be true. * * Reverts if the returned value is other than `true`. */ function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { forceApprove(token, to, value); } else if (!token.approveAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements. */ function _callOptionalReturn(IERC20 token, bytes memory data) private { uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) // bubble errors if iszero(success) { let ptr := mload(0x40) returndatacopy(ptr, 0, returndatasize()) revert(ptr, returndatasize()) } returnSize := returndatasize() returnValue := mload(0) } if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { bool success; uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) returnSize := returndatasize() returnValue := mload(0) } return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1); } }
// 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) (interfaces/IERC1363.sol) pragma solidity ^0.8.20; import {IERC20} from "./IERC20.sol"; import {IERC165} from "./IERC165.sol"; /** * @title IERC1363 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363]. * * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction. */ interface IERC1363 is IERC20, IERC165 { /* * Note: the ERC-165 identifier for this interface is 0xb0202a11. * 0xb0202a11 === * bytes4(keccak256('transferAndCall(address,uint256)')) ^ * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ * bytes4(keccak256('approveAndCall(address,uint256)')) ^ * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) */ /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @param data Additional data with no specified format, sent in call to `spender`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol) pragma solidity ^0.8.20; import {IERC165} from "../utils/introspection/IERC165.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../token/ERC20/IERC20.sol";
// 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); }
{ "optimizer": { "enabled": true, "runs": 100000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "remappings": [] }
[{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"_tos","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"Bulksend","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address[]","name":"_tos","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"BulksendToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"_tos","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"BulksendTokens","type":"event"},{"inputs":[{"internalType":"address[]","name":"_tos","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"bulksend","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address[]","name":"_tos","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"bulksendToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20[]","name":"_tokens","type":"address[]"},{"internalType":"address[]","name":"_tos","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"bulksendTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561000f575f80fd5b50610af28061001d5f395ff3fe608060405260043610610033575f3560e01c80634a311f4d1461003757806355f6e87a14610058578063c020e4f71461006b575b5f80fd5b348015610042575f80fd5b50610056610051366004610764565b61008a565b005b6100566100663660046107e1565b6101b0565b348015610076575f80fd5b50610056610085366004610848565b610453565b8281146100f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f57726f6e67206c656e677468730000000000000000000000000000000000000060448201526064015b60405180910390fd5b5f5b838110156101545761014c8633878785818110610119576101196108db565b905060200201602081019061012e9190610908565b868686818110610140576101406108db565b905060200201356105be565b6001016100fa565b508473ffffffffffffffffffffffffffffffffffffffff167f314ad99613d753024dc66896979ce898ffea5e2c22af0026b6db7bd694729d9a858585856040516101a194939291906109c7565b60405180910390a25050505050565b828114610219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f57726f6e67206c656e677468730000000000000000000000000000000000000060448201526064016100ef565b345f5b8481101561035757838382818110610236576102366108db565b905060200201358261024891906109f8565b91505f86868381811061025d5761025d6108db565b90506020020160208101906102729190610908565b73ffffffffffffffffffffffffffffffffffffffff1685858481811061029a5761029a6108db565b905060200201356040515f6040518083038185875af1925050503d805f81146102de576040519150601f19603f3d011682016040523d82523d5f602084013e6102e3565b606091505b505090508061034e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4661696c656420746f2073656e6420457468657200000000000000000000000060448201526064016100ef565b5060010161021c565b50801561040f576040515f90339083908381818185875af1925050503d805f811461039d576040519150601f19603f3d011682016040523d82523d5f602084013e6103a2565b606091505b505090508061040d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4661696c656420746f2073656e6420457468657200000000000000000000000060448201526064016100ef565b505b7f364fdc7fc0bb76c174f0f1c38aba35ecf7fb4c64e01c8478d61c6a557878ff258585858560405161044494939291906109c7565b60405180910390a15050505050565b8481146104bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f57726f6e67206c656e677468730000000000000000000000000000000000000060448201526064016100ef565b828114610525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f57726f6e67206c656e677468730000000000000000000000000000000000000060448201526064016100ef565b5f5b838110156105745761056c878783818110610544576105446108db565b90506020020160208101906105599190610908565b33878785818110610119576101196108db565b600101610527565b507f96b4dc68f562056bebb78e80e7049442c9a1f13cb29e41fb46246552778406a58686868686866040516105ae96959493929190610a36565b60405180910390a1505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052610653908590610659565b50505050565b5f8060205f8451602086015f885af180610678576040513d5f823e3d81fd5b50505f513d9150811561068f5780600114156106a9565b73ffffffffffffffffffffffffffffffffffffffff84163b155b15610653576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016100ef565b73ffffffffffffffffffffffffffffffffffffffff81168114610719575f80fd5b50565b5f8083601f84011261072c575f80fd5b50813567ffffffffffffffff811115610743575f80fd5b6020830191508360208260051b850101111561075d575f80fd5b9250929050565b5f805f805f60608688031215610778575f80fd5b8535610783816106f8565b9450602086013567ffffffffffffffff8082111561079f575f80fd5b6107ab89838a0161071c565b909650945060408801359150808211156107c3575f80fd5b506107d08882890161071c565b969995985093965092949392505050565b5f805f80604085870312156107f4575f80fd5b843567ffffffffffffffff8082111561080b575f80fd5b6108178883890161071c565b9096509450602087013591508082111561082f575f80fd5b5061083c8782880161071c565b95989497509550505050565b5f805f805f806060878903121561085d575f80fd5b863567ffffffffffffffff80821115610874575f80fd5b6108808a838b0161071c565b90985096506020890135915080821115610898575f80fd5b6108a48a838b0161071c565b909650945060408901359150808211156108bc575f80fd5b506108c989828a0161071c565b979a9699509497509295939492505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215610918575f80fd5b8135610923816106f8565b9392505050565b8183525f60208085019450825f5b8581101561097357813561094b816106f8565b73ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101610938565b509495945050505050565b8183525f7f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156109ae575f80fd5b8260051b80836020870137939093016020019392505050565b604081525f6109da60408301868861092a565b82810360208401526109ed81858761097e565b979650505050505050565b81810381811115610a30577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b92915050565b606080825281018690525f8760808301825b89811015610a85578235610a5b816106f8565b73ffffffffffffffffffffffffffffffffffffffff16825260209283019290910190600101610a48565b508381036020850152610a9981888a61092a565b9150508281036040840152610aaf81858761097e565b999850505050505050505056fea2646970667358221220aeefdb083653911febb662719975bcf7395d53a0e9dd03c918f2d428b9673ec464736f6c63430008140033
Deployed Bytecode
0x608060405260043610610033575f3560e01c80634a311f4d1461003757806355f6e87a14610058578063c020e4f71461006b575b5f80fd5b348015610042575f80fd5b50610056610051366004610764565b61008a565b005b6100566100663660046107e1565b6101b0565b348015610076575f80fd5b50610056610085366004610848565b610453565b8281146100f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f57726f6e67206c656e677468730000000000000000000000000000000000000060448201526064015b60405180910390fd5b5f5b838110156101545761014c8633878785818110610119576101196108db565b905060200201602081019061012e9190610908565b868686818110610140576101406108db565b905060200201356105be565b6001016100fa565b508473ffffffffffffffffffffffffffffffffffffffff167f314ad99613d753024dc66896979ce898ffea5e2c22af0026b6db7bd694729d9a858585856040516101a194939291906109c7565b60405180910390a25050505050565b828114610219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f57726f6e67206c656e677468730000000000000000000000000000000000000060448201526064016100ef565b345f5b8481101561035757838382818110610236576102366108db565b905060200201358261024891906109f8565b91505f86868381811061025d5761025d6108db565b90506020020160208101906102729190610908565b73ffffffffffffffffffffffffffffffffffffffff1685858481811061029a5761029a6108db565b905060200201356040515f6040518083038185875af1925050503d805f81146102de576040519150601f19603f3d011682016040523d82523d5f602084013e6102e3565b606091505b505090508061034e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4661696c656420746f2073656e6420457468657200000000000000000000000060448201526064016100ef565b5060010161021c565b50801561040f576040515f90339083908381818185875af1925050503d805f811461039d576040519150601f19603f3d011682016040523d82523d5f602084013e6103a2565b606091505b505090508061040d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4661696c656420746f2073656e6420457468657200000000000000000000000060448201526064016100ef565b505b7f364fdc7fc0bb76c174f0f1c38aba35ecf7fb4c64e01c8478d61c6a557878ff258585858560405161044494939291906109c7565b60405180910390a15050505050565b8481146104bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f57726f6e67206c656e677468730000000000000000000000000000000000000060448201526064016100ef565b828114610525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f57726f6e67206c656e677468730000000000000000000000000000000000000060448201526064016100ef565b5f5b838110156105745761056c878783818110610544576105446108db565b90506020020160208101906105599190610908565b33878785818110610119576101196108db565b600101610527565b507f96b4dc68f562056bebb78e80e7049442c9a1f13cb29e41fb46246552778406a58686868686866040516105ae96959493929190610a36565b60405180910390a1505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052610653908590610659565b50505050565b5f8060205f8451602086015f885af180610678576040513d5f823e3d81fd5b50505f513d9150811561068f5780600114156106a9565b73ffffffffffffffffffffffffffffffffffffffff84163b155b15610653576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016100ef565b73ffffffffffffffffffffffffffffffffffffffff81168114610719575f80fd5b50565b5f8083601f84011261072c575f80fd5b50813567ffffffffffffffff811115610743575f80fd5b6020830191508360208260051b850101111561075d575f80fd5b9250929050565b5f805f805f60608688031215610778575f80fd5b8535610783816106f8565b9450602086013567ffffffffffffffff8082111561079f575f80fd5b6107ab89838a0161071c565b909650945060408801359150808211156107c3575f80fd5b506107d08882890161071c565b969995985093965092949392505050565b5f805f80604085870312156107f4575f80fd5b843567ffffffffffffffff8082111561080b575f80fd5b6108178883890161071c565b9096509450602087013591508082111561082f575f80fd5b5061083c8782880161071c565b95989497509550505050565b5f805f805f806060878903121561085d575f80fd5b863567ffffffffffffffff80821115610874575f80fd5b6108808a838b0161071c565b90985096506020890135915080821115610898575f80fd5b6108a48a838b0161071c565b909650945060408901359150808211156108bc575f80fd5b506108c989828a0161071c565b979a9699509497509295939492505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215610918575f80fd5b8135610923816106f8565b9392505050565b8183525f60208085019450825f5b8581101561097357813561094b816106f8565b73ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101610938565b509495945050505050565b8183525f7f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156109ae575f80fd5b8260051b80836020870137939093016020019392505050565b604081525f6109da60408301868861092a565b82810360208401526109ed81858761097e565b979650505050505050565b81810381811115610a30577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b92915050565b606080825281018690525f8760808301825b89811015610a85578235610a5b816106f8565b73ffffffffffffffffffffffffffffffffffffffff16825260209283019290910190600101610a48565b508381036020850152610a9981888a61092a565b9150508281036040840152610aaf81858761097e565b999850505050505050505056fea2646970667358221220aeefdb083653911febb662719975bcf7395d53a0e9dd03c918f2d428b9673ec464736f6c63430008140033
Deployed Bytecode Sourcemap
358:2118:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1481:450;;;;;;;;;;-1:-1:-1;1481:450:6;;;;;:::i;:::-;;:::i;:::-;;688:704;;;;;;:::i;:::-;;:::i;1937:537::-;;;;;;;;;;-1:-1:-1;1937:537:6;;;;;:::i;:::-;;:::i;1481:450::-;1629:29;;;1621:55;;;;;;;3575:2:7;1621:55:6;;;3557:21:7;3614:2;3594:18;;;3587:30;3653:15;3633:18;;;3626:43;3686:18;;1621:55:6;;;;;;;;;1692:9;1687:186;1703:15;;;1687:186;;;1735:67;1762:6;1770:10;1782:4;;1787:1;1782:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;1791;;1799:1;1791:10;;;;;;;:::i;:::-;;;;;;;1735:26;:67::i;:::-;1845:3;;1687:186;;;;1902:6;1888:36;;;1910:4;;1916:7;;1888:36;;;;;;;;;:::i;:::-;;;;;;;;1481:450;;;;;:::o;688:704::-;791:29;;;783:55;;;;;;;3575:2:7;783:55:6;;;3557:21:7;3614:2;3594:18;;;3587:30;3653:15;3633:18;;;3626:43;3686:18;;783:55:6;3373:337:7;783:55:6;871:9;849:19;891:284;907:15;;;891:284;;;973:7;;981:1;973:10;;;;;;;:::i;:::-;;;;;;;956:14;:27;;;;:::i;:::-;939:44;;999:11;1016:4;;1021:1;1016:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:12;;1036:7;;1044:1;1036:10;;;;;;;:::i;:::-;;;;;;;1016:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;998:53;;;1073:6;1065:39;;;;;;;6308:2:7;1065:39:6;;;6290:21:7;6347:2;6327:18;;;6320:30;6386:22;6366:18;;;6359:50;6426:18;;1065:39:6;6106:344:7;1065:39:6;-1:-1:-1;1147:3:6;;891:284;;;-1:-1:-1;1189:18:6;;1185:162;;1241:42;;1224:11;;1241:10;;1264:14;;1224:11;1241:42;1224:11;1241:42;1264:14;1241:10;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1223:60;;;1305:6;1297:39;;;;;;;6308:2:7;1297:39:6;;;6290:21:7;6347:2;6327:18;;;6320:30;6386:22;6366:18;;;6359:50;6426:18;;1297:39:6;6106:344:7;1297:39:6;1209:138;1185:162;1362:23;1371:4;;1377:7;;1362:23;;;;;;;;;:::i;:::-;;;;;;;;773:619;688:704;;;;:::o;1937:537::-;2098:32;;;2090:58;;;;;;;3575:2:7;2090:58:6;;;3557:21:7;3614:2;3594:18;;;3587:30;3653:15;3633:18;;;3626:43;3686:18;;2090:58:6;3373:337:7;2090:58:6;2166:29;;;2158:55;;;;;;;3575:2:7;2158:55:6;;;3557:21:7;3614:2;3594:18;;;3587:30;3653:15;3633:18;;;3626:43;3686:18;;2158:55:6;3373:337:7;2158:55:6;2229:9;2224:190;2240:15;;;2224:190;;;2272:71;2299:7;;2307:1;2299:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2311;2323:4;;2328:1;2323:7;;;;;;;:::i;2272:71::-;2386:3;;2224:190;;;;2429:38;2444:7;;2453:4;;2459:7;;2429:38;;;;;;;;;;;:::i;:::-;;;;;;;;1937:537;;;;;;:::o;1618:188:4:-;1745:53;;;1760:18;8204:15:7;;;1745:53:4;;;8186:34:7;8256:15;;8236:18;;;8229:43;8288:18;;;;8281:34;;;1745:53:4;;;;;;;;;;8098:18:7;;;;1745:53:4;;;;;;;;;;;;;;1718:81;;1738:5;;1718:19;:81::i;:::-;1618:188;;;;:::o;7686:720::-;7766:18;7794:19;7932:4;7929:1;7922:4;7916:11;7909:4;7903;7899:15;7896:1;7889:5;7882;7877:60;7989:7;7979:176;;8033:4;8027:11;8078:16;8075:1;8070:3;8055:40;8124:16;8119:3;8112:29;7979:176;-1:-1:-1;;8232:1:4;8226:8;8182:16;;-1:-1:-1;8258:15:4;;:68;;8310:11;8325:1;8310:16;;8258:68;;;8276:26;;;;:31;8258:68;8254:146;;;8349:40;;;;;8502:42:7;8490:55;;8349:40:4;;;8472:74:7;8445:18;;8349:40:4;8326:226:7;14:162;108:42;101:5;97:54;90:5;87:65;77:93;;166:1;163;156:12;77:93;14:162;:::o;181:367::-;244:8;254:6;308:3;301:4;293:6;289:17;285:27;275:55;;326:1;323;316:12;275:55;-1:-1:-1;349:20:7;;392:18;381:30;;378:50;;;424:1;421;414:12;378:50;461:4;453:6;449:17;437:29;;521:3;514:4;504:6;501:1;497:14;489:6;485:27;481:38;478:47;475:67;;;538:1;535;528:12;475:67;181:367;;;;;:::o;553:930::-;698:6;706;714;722;730;783:2;771:9;762:7;758:23;754:32;751:52;;;799:1;796;789:12;751:52;838:9;825:23;857:39;890:5;857:39;:::i;:::-;915:5;-1:-1:-1;971:2:7;956:18;;943:32;994:18;1024:14;;;1021:34;;;1051:1;1048;1041:12;1021:34;1090:70;1152:7;1143:6;1132:9;1128:22;1090:70;:::i;:::-;1179:8;;-1:-1:-1;1064:96:7;-1:-1:-1;1267:2:7;1252:18;;1239:32;;-1:-1:-1;1283:16:7;;;1280:36;;;1312:1;1309;1302:12;1280:36;;1351:72;1415:7;1404:8;1393:9;1389:24;1351:72;:::i;:::-;553:930;;;;-1:-1:-1;553:930:7;;-1:-1:-1;1442:8:7;;1325:98;553:930;-1:-1:-1;;;553:930:7:o;1488:773::-;1610:6;1618;1626;1634;1687:2;1675:9;1666:7;1662:23;1658:32;1655:52;;;1703:1;1700;1693:12;1655:52;1743:9;1730:23;1772:18;1813:2;1805:6;1802:14;1799:34;;;1829:1;1826;1819:12;1799:34;1868:70;1930:7;1921:6;1910:9;1906:22;1868:70;:::i;:::-;1957:8;;-1:-1:-1;1842:96:7;-1:-1:-1;2045:2:7;2030:18;;2017:32;;-1:-1:-1;2061:16:7;;;2058:36;;;2090:1;2087;2080:12;2058:36;;2129:72;2193:7;2182:8;2171:9;2167:24;2129:72;:::i;:::-;1488:773;;;;-1:-1:-1;2220:8:7;-1:-1:-1;;;;1488:773:7:o;2266:1102::-;2438:6;2446;2454;2462;2470;2478;2531:2;2519:9;2510:7;2506:23;2502:32;2499:52;;;2547:1;2544;2537:12;2499:52;2587:9;2574:23;2616:18;2657:2;2649:6;2646:14;2643:34;;;2673:1;2670;2663:12;2643:34;2712:70;2774:7;2765:6;2754:9;2750:22;2712:70;:::i;:::-;2801:8;;-1:-1:-1;2686:96:7;-1:-1:-1;2889:2:7;2874:18;;2861:32;;-1:-1:-1;2905:16:7;;;2902:36;;;2934:1;2931;2924:12;2902:36;2973:72;3037:7;3026:8;3015:9;3011:24;2973:72;:::i;:::-;3064:8;;-1:-1:-1;2947:98:7;-1:-1:-1;3152:2:7;3137:18;;3124:32;;-1:-1:-1;3168:16:7;;;3165:36;;;3197:1;3194;3187:12;3165:36;;3236:72;3300:7;3289:8;3278:9;3274:24;3236:72;:::i;:::-;2266:1102;;;;-1:-1:-1;2266:1102:7;;-1:-1:-1;2266:1102:7;;3327:8;;2266:1102;-1:-1:-1;;;2266:1102:7:o;3715:184::-;3767:77;3764:1;3757:88;3864:4;3861:1;3854:15;3888:4;3885:1;3878:15;3904:255;3963:6;4016:2;4004:9;3995:7;3991:23;3987:32;3984:52;;;4032:1;4029;4022:12;3984:52;4071:9;4058:23;4090:39;4123:5;4090:39;:::i;:::-;4148:5;3904:255;-1:-1:-1;;;3904:255:7:o;4164:553::-;4264:6;4259:3;4252:19;4234:3;4290:4;4319:2;4314:3;4310:12;4303:19;;4345:5;4368:1;4378:314;4392:6;4389:1;4386:13;4378:314;;;4469:6;4456:20;4489:41;4522:7;4489:41;:::i;:::-;4568:42;4555:56;4543:69;;4632:12;;;;4667:15;;;;4414:1;4407:9;4378:314;;;-1:-1:-1;4708:3:7;;4164:553;-1:-1:-1;;;;;4164:553:7:o;4722:358::-;4822:6;4817:3;4810:19;4792:3;4852:66;4844:6;4841:78;4838:98;;;4932:1;4929;4922:12;4838:98;4968:6;4965:1;4961:14;5020:8;5013:5;5006:4;5001:3;4997:14;4984:45;5049:18;;;;5069:4;5045:29;;4722:358;-1:-1:-1;;;4722:358:7:o;5085:519::-;5362:2;5351:9;5344:21;5325:4;5388:73;5457:2;5446:9;5442:18;5434:6;5426;5388:73;:::i;:::-;5509:9;5501:6;5497:22;5492:2;5481:9;5477:18;5470:50;5537:61;5591:6;5583;5575;5537:61;:::i;:::-;5529:69;5085:519;-1:-1:-1;;;;;;;5085:519:7:o;5609:282::-;5676:9;;;5697:11;;;5694:191;;;5741:77;5738:1;5731:88;5842:4;5839:1;5832:15;5870:4;5867:1;5860:15;5694:191;5609:282;;;;:::o;6729:1189::-;7119:2;7131:21;;;7104:18;;7187:22;;;7071:4;7267:6;7240:3;7225:19;;7071:4;7301:335;7315:6;7312:1;7309:13;7301:335;;;7390:6;7377:20;7410:39;7443:5;7410:39;:::i;:::-;7485:42;7474:54;7462:67;;7552:4;7611:15;;;;7576:12;;;;7337:1;7330:9;7301:335;;;7305:3;7683:9;7678:3;7674:19;7667:4;7656:9;7652:20;7645:49;7717:58;7771:3;7763:6;7755;7717:58;:::i;:::-;7703:72;;;7823:9;7815:6;7811:22;7806:2;7795:9;7791:18;7784:50;7851:61;7905:6;7897;7889;7851:61;:::i;:::-;7843:69;6729:1189;-1:-1:-1;;;;;;;;;6729:1189:7:o
Swarm Source
ipfs://aeefdb083653911febb662719975bcf7395d53a0e9dd03c918f2d428b9673ec4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.