Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 49 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Send Funds | 20537588 | 27 days ago | IN | 0 ETH | 0.0000732 | ||||
Unassign ETH | 20537585 | 27 days ago | IN | 0 ETH | 0.00006465 | ||||
Unassign ETH | 20537577 | 27 days ago | IN | 0 ETH | 0.00007043 | ||||
Unassign ETH | 20537566 | 27 days ago | IN | 0 ETH | 0.00011649 | ||||
Send Funds | 20537472 | 27 days ago | IN | 0 ETH | 0.00007916 | ||||
Emergency Withdr... | 20537404 | 27 days ago | IN | 0 ETH | 0.00006903 | ||||
Withdraw ETH | 19177931 | 217 days ago | IN | 0 ETH | 0.00212442 | ||||
Withdraw ETH | 19171933 | 218 days ago | IN | 0 ETH | 0.0009505 | ||||
Withdraw ETH | 19159867 | 220 days ago | IN | 0 ETH | 0.00036664 | ||||
Withdraw ETH | 19157334 | 220 days ago | IN | 0 ETH | 0.0005275 | ||||
Distribute | 19157240 | 220 days ago | IN | 3.75 ETH | 0.00213075 | ||||
Withdraw ETH | 18922869 | 253 days ago | IN | 0 ETH | 0.0005398 | ||||
Withdraw ETH | 18850064 | 263 days ago | IN | 0 ETH | 0.0007059 | ||||
Withdraw ETH | 18849507 | 264 days ago | IN | 0 ETH | 0.00096504 | ||||
Withdraw ETH | 18846939 | 264 days ago | IN | 0 ETH | 0.00076561 | ||||
Withdraw ETH | 18846879 | 264 days ago | IN | 0 ETH | 0.00076262 | ||||
Distribute | 18845453 | 264 days ago | IN | 3.72 ETH | 0.0031093 | ||||
Withdraw ETH | 18701761 | 284 days ago | IN | 0 ETH | 0.00110165 | ||||
Withdraw ETH | 18701716 | 284 days ago | IN | 0 ETH | 0.00251226 | ||||
Withdraw ETH | 18700739 | 284 days ago | IN | 0 ETH | 0.00222785 | ||||
Withdraw ETH | 18699213 | 285 days ago | IN | 0 ETH | 0.00094966 | ||||
Withdraw ETH | 18695423 | 285 days ago | IN | 0 ETH | 0.00110697 | ||||
Withdraw ETH | 18694985 | 285 days ago | IN | 0 ETH | 0.00104692 | ||||
Distribute | 18694831 | 285 days ago | IN | 3.935 ETH | 0.0042522 | ||||
Distribute | 18531227 | 308 days ago | IN | 0.12 ETH | 0.00166626 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
20537588 | 27 days ago | 0.71 ETH | ||||
20537472 | 27 days ago | 1.277025 ETH | ||||
19177931 | 217 days ago | 2.0075 ETH | ||||
19171933 | 218 days ago | 0.51075 ETH | ||||
19164609 | 219 days ago | 0.0355 ETH | ||||
19159867 | 220 days ago | 0.46 ETH | ||||
19157334 | 220 days ago | 0.455 ETH | ||||
18922869 | 253 days ago | 2.0075 ETH | ||||
18850064 | 263 days ago | 0.46 ETH | ||||
18849507 | 264 days ago | 0.455 ETH | ||||
18848395 | 264 days ago | 0.00775 ETH | ||||
18846939 | 264 days ago | 0.51074999 ETH | ||||
18846879 | 264 days ago | 0 ETH | ||||
18841769 | 265 days ago | 0.004375 ETH | ||||
18701761 | 284 days ago | 0.3775 ETH | ||||
18701716 | 284 days ago | 0.25 ETH | ||||
18700739 | 284 days ago | 1.5 ETH | ||||
18699213 | 285 days ago | 0.485 ETH | ||||
18695423 | 285 days ago | 0.48 ETH | ||||
18694985 | 285 days ago | 0.54575 ETH | ||||
18480979 | 315 days ago | 0.545 ETH | ||||
18480790 | 315 days ago | 0.01 ETH | ||||
18479815 | 315 days ago | 0.05259999 ETH | ||||
18479532 | 315 days ago | 0.17 ETH | ||||
18479158 | 315 days ago | 0.67 ETH |
Loading...
Loading
Contract Name:
PaymentSender
Compiler Version
v0.8.12+commit.f00d7308
Optimization Enabled:
Yes with 200 runs
Other Settings:
london EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0 // solhint-disable-next-line pragma solidity 0.8.12; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol"; import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; /// @notice Contract to receive and distribute payments on ETH or ERC20 tokens contract PaymentSender is ERC1155Holder, IERC721Receiver, Ownable, ReentrancyGuard { /// @notice ETH amount still not distributed uint256 public reserveBalance; /// @notice ETH amount for contributions (coming from taxes) uint256 public contributionsBalance; /// @notice Perc of taxes to take on deposits uint256 public taxesPerc; /// @notice Address of the wallet that signs messages address public secret; /// @notice Mapping of ETH balances for each wallet address mapping(address => uint256) public ethBalance; /// @notice Mapping of used signatures mapping(bytes => bool) public usedSignatures; /// @notice Mapping of allowed wallets mapping(address => bool) public isAllowed; /// @notice Event emitted when ETH is deposited to reserve balance event Deposit(uint256 amount, address operator); /// @notice Event emitted when ETH is deposited to contributions balance event Contribution(uint256 amount, address operator); /// @notice Event emitted when ETH is distributed event Distribute(uint256[] amounts, address[] recipients, address operator); /// @notice Event emitted ETH is sent event SendETH(uint256[] amounts, address[] recipients, address operator); /// @notice Event emitted when someone withdraws ETH event WithdrawETH(uint256 amount, address recipient, address operator); /// @notice Event emitted when someone withdraws ERC20 tokens event WithdrawERC20( address token, uint256 amount, address recipient, address operator ); /// @notice Event emitted when someone withdraws ERC721 or ERC1155 tokens event WithdrawNFT( address token, uint256 tokenId, uint256 amount, address recipient, address operator ); /// @notice Event emitted when a new signer is set event SetSigner(address signer); /// @notice Event emitted when a new allowed wallet is set event SetAllowed(address wallet, bool allowed); /// @notice Event emitted when a signature is marked as used without withdrawing anything event UseSignature(bytes signature); /// @notice Event emitted when ETH is unassigned from a recipient event UnassignETH(uint256 amount, address recipient); /// @notice Event emitted when taxes percentage is set event SetTaxesPerc(uint256 taxesPerc); constructor() {} /// @notice Fall back function to receive ETH receive() external payable { depositToReserve(msg.value, taxesPerc); } /// @notice modifier of wallets allowed to use restricted functions modifier onlyAllowed() { require( isAllowed[msg.sender] || msg.sender == owner(), "onlyAllowed: Not allowed" ); _; } /// @notice Function to deposit ETH and distribute it to recipients /// @param amounts Amounts of ETH to distribute /// @param recipients Addresses to distribute ETH to /// @dev Only assign the ETH to the recipients, doesn't send it, use sendFunds for that function distribute( uint256[] memory amounts, address[] memory recipients, uint256 taxToTake, bool fromContributions ) external payable onlyAllowed nonReentrant { _handleFunds(amounts, recipients, true, taxToTake, fromContributions); emit Distribute(amounts, recipients, msg.sender); } /// @notice Function to send ETH to recipients /// @param amounts Amounts of ETH to send /// @param recipients Addresses to send ETH to /// @dev Only send the ETH to the recipients, doesn't assign it, use distribute for that function sendFunds( uint256[] memory amounts, address[] memory recipients, uint256 taxToTake, bool fromContributions ) external payable onlyAllowed nonReentrant { _handleFunds(amounts, recipients, false, taxToTake, fromContributions); emit SendETH(amounts, recipients, msg.sender); } /// @notice Function to withdraw ETH /// @param amount Amount of ETH to withdraw /// @param recipient Address to withdraw ETH to /// @dev Withdraw from the ETH balance of the sender function withdrawETH(uint256 amount, address payable recipient) external { require(amount > 0, "withdraw: Amount must be greater than 0"); require( ethBalance[msg.sender] >= amount, "withdraw: Not enough ETH in your balance to withdraw" ); ethBalance[msg.sender] -= amount; recipient.transfer(amount); emit WithdrawETH(amount, recipient, msg.sender); } /// @notice use a signature to withdraw ETH without having any assigned /// @param amount Amount of ETH to withdraw /// @param recipient Address to withdraw ETH to /// @param checkId Id to check if the signature was used /// @param signature Signature to use function withdrawETHWithSignature( uint256 amount, address recipient, uint256 checkId, bytes memory signature ) external { require( amount <= reserveBalance, "withdrawETHWithSignature: Not enough ETH in reserve to withdraw" ); bytes32 hash = keccak256( abi.encode(recipient, amount, checkId, "withdrawETHWithSignature") ); _handleSignature(hash, signature); reserveBalance -= amount; payable(recipient).transfer(amount); emit WithdrawETH(amount, recipient, msg.sender); } /// @notice use a signature to withdraw ERC20 tokens /// @param token Address of the ERC20 token /// @param amount Amount of ERC20 tokens to withdraw /// @param recipient Address to withdraw ERC20 tokens to /// @param checkId Id to check if the signature was used /// @param signature Signature to use function withdrawERC20WithSignature( address token, uint256 amount, address recipient, uint256 checkId, bytes memory signature ) external { require( amount <= IERC20(token).balanceOf(address(this)), "withdrawERC20WithSignature: Not enough ERC20 tokens in reserve to withdraw" ); bytes32 hash = keccak256( abi.encode( token, recipient, amount, checkId, "withdrawERC20WithSignature" ) ); _handleSignature(hash, signature); IERC20(token).transfer(recipient, amount); emit WithdrawERC20(token, amount, recipient, msg.sender); } /// @notice use a signature to withdraw ERC721 or ERC1155 tokens /// @param token Address of the ERC721 or ERC1155 token /// @param tokenId Id of the ERC721 or ERC1155 token /// @param amount Amount of ERC1155 token to withdraw (ERC721 = 0, amount not required) /// @param recipient Address to withdraw ERC721 or ERC1155 tokens to /// @param checkId Id to check if the signature was used /// @param signature Signature to use function withdrawNFTWithSignature( address token, uint256 tokenId, uint256 amount, address recipient, uint256 checkId, bytes memory signature ) external { bytes32 hash = keccak256( abi.encode( token, tokenId, recipient, amount, checkId, "withdrawNFTWithSignature" ) ); _handleSignature(hash, signature); if (amount == 0) { require( IERC721(token).ownerOf(tokenId) == address(this), "withdrawNFTWithSignature: Not enough ERC721 tokens in reserve to withdraw" ); IERC721(token).safeTransferFrom(address(this), recipient, tokenId); } else { require( amount <= IERC1155(token).balanceOf(address(this), tokenId), "withdrawNFTWithSignature: Not enough ERC1155 tokens in reserve to withdraw" ); IERC1155(token).safeTransferFrom( address(this), recipient, tokenId, amount, "" ); } emit WithdrawNFT(token, tokenId, amount, recipient, msg.sender); } /// INTERNAL FUNCTIONS /// @notice Helper function to deposit ETH function depositToReserve(uint256 amount, uint256 taxToTake) internal { if (taxToTake > 0) { uint256 taxes = (amount * taxToTake) / 10000; contributionsBalance += taxes; amount -= taxes; emit Contribution(taxes, msg.sender); } reserveBalance += amount; emit Deposit(amount, msg.sender); } function _handleSignature(bytes32 hash, bytes memory signature) internal { require( _verifyHashSignature(hash, signature), "handleSignature: Invalid signature" ); require( !usedSignatures[signature], "handleSignature: Signature already used" ); usedSignatures[signature] = true; } /// @notice Function to deposit ETH and distribute it to recipients /// @param amounts Amounts of ETH to handle /// @param recipients Addresses to handle ETH for /// @param isDistribute Whether to distribute (true) or send (false) function _handleFunds( uint256[] memory amounts, address[] memory recipients, bool isDistribute, uint256 taxToTake, bool fromContributions ) internal { require( amounts.length == recipients.length, "handleFunds: Arrays must have the same length" ); if (msg.value > 0) { depositToReserve(msg.value, taxToTake); } uint256 totalAmount; for (uint256 i = 0; i < amounts.length; i++) { uint256 amount = amounts[i]; totalAmount += amount; if (isDistribute) { ethBalance[recipients[i]] += amount; } else { payable(recipients[i]).transfer(amount); } } if (fromContributions) { require( totalAmount <= contributionsBalance, "handleFunds: Not enough ETH in contributions balance" ); contributionsBalance -= totalAmount; } else { require( totalAmount <= reserveBalance, "handleFunds: Not enough ETH in reserve balance" ); reserveBalance -= totalAmount; } } /// OWNER FUNCTIONS /// @notice Function to set a new signer /// @param newSigner: Address of the new signer /// @dev Only the owner can set a new signer function setSigner(address newSigner) external onlyOwner { require(newSigner != address(0), "Invalid address"); secret = newSigner; emit SetSigner(newSigner); } /// @notice Function to set a new allowed wallet /// @param wallet: Address of the new allowed wallet /// @param allowed: Boolean to set if the wallet is allowed or not /// @dev Only the owner can set a new allowed wallet function setAllowed(address wallet, bool allowed) external onlyOwner { require(wallet != address(0), "Invalid address"); isAllowed[wallet] = allowed; emit SetAllowed(wallet, allowed); } /// @notice Function to set the taxes percentage /// @param _taxesPerc: New taxes percentage /// @dev Only the owner can set the taxes percentage function setTaxesPerc(uint256 _taxesPerc) external onlyOwner { require(_taxesPerc <= 10000, "setTaxesPerc: Taxes percentage too high"); taxesPerc = _taxesPerc; emit SetTaxesPerc(_taxesPerc); } /// @notice Mark a signature as used without withdrawing anything /// @param signature Signature to use function useSignature(bytes memory signature) external nonReentrant { require(!usedSignatures[signature], "useSignature: Signature already used"); usedSignatures[signature] = true; emit UseSignature(signature); } /// @notice Unassign ETH from a recipient /// @param amount Amount of ETH to unassign /// @param recipient Address to unassign ETH from function unassignETH(uint256 amount, address recipient) external onlyOwner { require( ethBalance[recipient] >= amount, "unassignETH: Not enough ETH in recipient balance" ); ethBalance[recipient] -= amount; reserveBalance += amount; emit UnassignETH(amount, recipient); } /// EMERGENCY FUNCTIONS /// @notice Emergency function to withdraw ETH function emergencyWithdrawETH() external onlyOwner { uint256 contractBalance = address(this).balance; payable(msg.sender).transfer(reserveBalance); emit WithdrawETH(contractBalance, msg.sender, msg.sender); } /// @notice Emergency function to withdraw ERC20 tokens /// @param token Address of the ERC20 token function emergencyWithdrawERC20(address token) external onlyOwner { uint256 contractBalance = IERC20(token).balanceOf(address(this)); require( contractBalance > 0, "emergencyWithdrawERC20: No tokens to withdraw" ); IERC20(token).transfer(msg.sender, contractBalance); emit WithdrawERC20(token, contractBalance, msg.sender, msg.sender); } /// @notice Emergency function to withdraw ERC721 or ERC1155 tokens /// @param token Address of the ERC721 or ERC1155 token /// @param tokenId Id of the ERC721 or ERC1155 token /// @param amount Amount of ERC1155 token to withdraw (ERC721 = 0, amount not required) function emergencyWithdrawNFT( address token, uint256 tokenId, uint256 amount ) external onlyOwner { if (amount == 0) { IERC721(token).safeTransferFrom(address(this), msg.sender, tokenId); } else { IERC1155(token).safeTransferFrom( address(this), msg.sender, tokenId, amount, "" ); } emit WithdrawNFT(token, tokenId, amount, msg.sender, msg.sender); } /// @notice Internal function to check if a signature is valid /// @param freshHash: Hash to check /// @param signature: Signature to check function _verifyHashSignature( bytes32 freshHash, bytes memory signature ) internal view returns (bool) { bytes32 hash = keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", freshHash) ); bytes32 r; bytes32 s; uint8 v; if (signature.length != 65) { return false; } assembly { r := mload(add(signature, 32)) s := mload(add(signature, 64)) v := byte(0, mload(add(signature, 96))) } if (v < 27) { v += 27; } address signer = address(0); if (v == 27 || v == 28) { // solium-disable-next-line arg-overflow signer = ecrecover(hash, v, r, s); } return secret == signer; } // TODO: if we want to support ERC721, we need to implement this function function onERC721Received( address, address, uint256, bytes memory ) external virtual override returns (bytes4) { return this.onERC721Received.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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 amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` 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 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol) pragma solidity ^0.8.0; import "../IERC1155Receiver.sol"; import "../../../utils/introspection/ERC165.sol"; /** * @dev _Available since v3.1._ */ abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol) pragma solidity ^0.8.0; import "./ERC1155Receiver.sol"; /** * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens. * * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be * stuck. * * @dev _Available since v3.1._ */ contract ERC1155Holder is ERC1155Receiver { function onERC1155Received( address, address, uint256, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] memory, uint256[] memory, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token 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 amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ 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 caller. */ 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 `amount` tokens of token type `id` from `from` to `to`. * * 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 `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 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` 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 amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @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 require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @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 _status == _ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../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. * * By default, the owner account will be the one that deploys the contract. 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; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @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 { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); _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); } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "london", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"Contribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"address[]","name":"recipients","type":"address[]"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"Distribute","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":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"address[]","name":"recipients","type":"address[]"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"SendETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"SetAllowed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"SetSigner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"taxesPerc","type":"uint256"}],"name":"SetTaxesPerc","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"UnassignETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"signature","type":"bytes"}],"name":"UseSignature","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"WithdrawERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"WithdrawETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"WithdrawNFT","type":"event"},{"inputs":[],"name":"contributionsBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256","name":"taxToTake","type":"uint256"},{"internalType":"bool","name":"fromContributions","type":"bool"}],"name":"distribute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"emergencyWithdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyWithdrawNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ethBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secret","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256","name":"taxToTake","type":"uint256"},{"internalType":"bool","name":"fromContributions","type":"bool"}],"name":"sendFunds","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigner","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxesPerc","type":"uint256"}],"name":"setTaxesPerc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxesPerc","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":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"unassignETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"useSignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"usedSignatures","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"checkId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"withdrawERC20WithSignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"recipient","type":"address"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"checkId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"withdrawETHWithSignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"checkId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"withdrawNFTWithSignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b5061001a33610023565b60018055610073565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6127ae806100826000396000f3fe6080604052600436106101bb5760003560e01c806393d88b54116100ec578063d1efd30d1161008a578063f11520c811610064578063f11520c814610517578063f23a6e6114610537578063f2fde38b14610563578063f570f96a1461058357600080fd5b8063d1efd30d1461048f578063d8f3790f146104af578063e949580e146104dc57600080fd5b8063b6769ef1116100c6578063b6769ef1146103fd578063babcc53914610413578063bc197c8114610443578063d12c92b91461046f57600080fd5b806393d88b54146103b45780639afd09cc146103c7578063a10954fe146103e757600080fd5b8063621c8a1c11610159578063715018a611610133578063715018a614610338578063773c3fff1461034d578063845360171461036d5780638da5cb5b1461038257600080fd5b8063621c8a1c146102e15780636c19e783146103055780636ecaf65a1461032557600080fd5b806336118b521161019557806336118b521461026157806340c442de146102815780634697f05d146102a15780634f416c90146102c157600080fd5b806301ffc9a7146101d3578063150b7a021461020857806335b78f911461024157600080fd5b366101ce576101cc346004546105a3565b005b600080fd5b3480156101df57600080fd5b506101f36101ee366004611ef9565b610677565b60405190151581526020015b60405180910390f35b34801561021457600080fd5b50610228610223366004611ff6565b6106ae565b6040516001600160e01b031990911681526020016101ff565b34801561024d57600080fd5b506101cc61025c366004612062565b6106bf565b34801561026d57600080fd5b506101cc61027c3660046120e0565b610a76565b34801561028d57600080fd5b506101cc61029c366004612110565b610bf5565b3480156102ad57600080fd5b506101cc6102bc36600461214b565b610d92565b3480156102cd57600080fd5b506101cc6102dc366004612179565b610e3e565b3480156102ed57600080fd5b506102f760045481565b6040519081526020016101ff565b34801561031157600080fd5b506101cc610320366004612110565b610fcd565b6101cc610333366004612230565b611072565b34801561034457600080fd5b506101cc611141565b34801561035957600080fd5b506101cc61036836600461230d565b611155565b34801561037957600080fd5b506101cc61124d565b34801561038e57600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016101ff565b6101cc6103c2366004612230565b6112c7565b3480156103d357600080fd5b506101cc6103e2366004612342565b61137f565b3480156103f357600080fd5b506102f760025481565b34801561040957600080fd5b506102f760035481565b34801561041f57600080fd5b506101f361042e366004612110565b60086020526000908152604090205460ff1681565b34801561044f57600080fd5b5061022861045e3660046123b8565b63bc197c8160e01b95945050505050565b34801561047b57600080fd5b506101cc61048a366004612459565b6115c2565b34801561049b57600080fd5b5060055461039c906001600160a01b031681565b3480156104bb57600080fd5b506102f76104ca366004612110565b60066020526000908152604090205481565b3480156104e857600080fd5b506101f36104f736600461230d565b805160208183018101805160078252928201919093012091525460ff1681565b34801561052357600080fd5b506101cc6105323660046120e0565b611661565b34801561054357600080fd5b50610228610552366004612472565b63f23a6e6160e01b95945050505050565b34801561056f57600080fd5b506101cc61057e366004612110565b61176e565b34801561058f57600080fd5b506101cc61059e3660046124cf565b6117e4565b80156106235760006127106105b8838561251a565b6105c29190612539565b905080600360008282546105d6919061255b565b909155506105e690508184612573565b604080518381523360208201529194507f04e75fda068b8e114d7658bdff74280a0fd65586b7e026a034eae29dd5a9e68b910160405180910390a1505b8160026000828254610635919061255b565b9091555050604080518381523360208201527f4bcc17093cdf51079c755de089be5a85e70fa374ec656c194480fbdcda224a5391015b60405180910390a15050565b60006001600160e01b03198216630271189760e51b14806106a857506301ffc9a760e01b6001600160e01b03198316145b92915050565b630a85bd0160e11b5b949350505050565b604080516001600160a01b03808916602083015291810187905290841660608201526080810185905260a0810183905260c080820152601860e08201527f77697468647261774e4654576974685369676e617475726500000000000000006101008201526000906101200160405160208183030381529060405280519060200120905061074c818361191d565b846108bc576040516331a9108f60e11b81526004810187905230906001600160a01b03891690636352211e90602401602060405180830381865afa158015610798573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107bc919061258a565b6001600160a01b03161461084f5760405162461bcd60e51b815260206004820152604960248201527f77697468647261774e4654576974685369676e61747572653a204e6f7420656e60448201527f6f7567682045524337323120746f6b656e7320696e207265736572766520746f60648201526820776974686472617760b81b608482015260a4015b60405180910390fd5b604051632142170760e11b81523060048201526001600160a01b038581166024830152604482018890528816906342842e0e90606401600060405180830381600087803b15801561089f57600080fd5b505af11580156108b3573d6000803e3d6000fd5b50505050610a16565b604051627eeac760e11b8152306004820152602481018790526001600160a01b0388169062fdd58e90604401602060405180830381865afa158015610905573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092991906125a7565b8511156109b15760405162461bcd60e51b815260206004820152604a60248201527f77697468647261774e4654576974685369676e61747572653a204e6f7420656e60448201527f6f756768204552433131353520746f6b656e7320696e207265736572766520746064820152696f20776974686472617760b01b608482015260a401610846565b604051637921219560e11b81526001600160a01b0388169063f242432a906109e390309088908b908b906004016125c0565b600060405180830381600087803b1580156109fd57600080fd5b505af1158015610a11573d6000803e3d6000fd5b505050505b604080516001600160a01b038981168252602082018990528183018890528616606082015233608082015290517f1b3bfe851162f1adc68158faaa779a53b6b2c5cf1fd0d482ab8439b10465d3299181900360a00190a150505050505050565b60008211610ad65760405162461bcd60e51b815260206004820152602760248201527f77697468647261773a20416d6f756e74206d75737420626520677265617465726044820152660207468616e20360cc1b6064820152608401610846565b33600090815260066020526040902054821115610b525760405162461bcd60e51b815260206004820152603460248201527f77697468647261773a204e6f7420656e6f7567682045544820696e20796f75726044820152732062616c616e636520746f20776974686472617760601b6064820152608401610846565b3360009081526006602052604081208054849290610b71908490612573565b90915550506040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610bac573d6000803e3d6000fd5b50604080518381526001600160a01b038316602082015233918101919091527f4c46bd413bdc12128078ae2ee4625145577bcb84a29696605d14ef279ae72c609060600161066b565b610bfd611a34565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6891906125a7565b905060008111610cd05760405162461bcd60e51b815260206004820152602d60248201527f656d657267656e6379576974686472617745524332303a204e6f20746f6b656e60448201526c7320746f20776974686472617760981b6064820152608401610846565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015610d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4191906125f8565b50604080516001600160a01b0384168152602081018390523391810182905260608101919091527f76258fe94fcafc5366d7fd71cfe770504f5471904cfd3bfaa98a6dab60f96bc59060800161066b565b610d9a611a34565b6001600160a01b038216610de25760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610846565b6001600160a01b038216600081815260086020908152604091829020805460ff19168515159081179091558251938452908301527f91d426a6b868d3a9f12f044bfd4dfb1df6e3e050a71a34b090d8ce43a5023c29910161066b565b600254841115610eb65760405162461bcd60e51b815260206004820152603f60248201527f7769746864726177455448576974685369676e61747572653a204e6f7420656e60448201527f6f7567682045544820696e207265736572766520746f207769746864726177006064820152608401610846565b604080516001600160a01b038516602082015290810185905260608101839052608080820152601860a08201527f7769746864726177455448576974685369676e6174757265000000000000000060c082015260009060e001604051602081830303815290604052805190602001209050610f31818361191d565b8460026000828254610f439190612573565b90915550506040516001600160a01b0385169086156108fc029087906000818181858888f19350505050158015610f7e573d6000803e3d6000fd5b50604080518681526001600160a01b0386166020820152338183015290517f4c46bd413bdc12128078ae2ee4625145577bcb84a29696605d14ef279ae72c609181900360600190a15050505050565b610fd5611a34565b6001600160a01b03811661101d5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610846565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fbb10aee7ef5a307b8097c6a7f2892b909ff1736fd24a6a5260640c185f7153b6906020015b60405180910390a150565b3360009081526008602052604090205460ff168061109a57506000546001600160a01b031633145b6110e15760405162461bcd60e51b81526020600482015260186024820152771bdb9b1e505b1b1bddd9590e88139bdd08185b1b1bddd95960421b6044820152606401610846565b6110e9611a8e565b6110f7848460018585611ae8565b7f13739d78c645cdf434d15d67374bbdb8d05882732ecb1a5c64e810be4ce2d91884843360405161112a93929190612615565b60405180910390a161113b60018055565b50505050565b611149611a34565b6111536000611d7a565b565b61115d611a8e565b60078160405161116d91906126d3565b9081526040519081900360200190205460ff16156111d95760405162461bcd60e51b8152602060048201526024808201527f7573655369676e61747572653a205369676e617475726520616c7265616479206044820152631d5cd95960e21b6064820152608401610846565b60016007826040516111eb91906126d3565b908152604051908190036020018120805492151560ff19909316929092179091557ff3b0ff011bd03c6c8253444351e04476ed43d26206e4fb68ce94f04d10c0429c906112399083906126ef565b60405180910390a161124a60018055565b50565b611255611a34565b6002546040514791339181156108fc0291906000818181858888f19350505050158015611286573d6000803e3d6000fd5b50604080518281523360208201819052918101919091527f4c46bd413bdc12128078ae2ee4625145577bcb84a29696605d14ef279ae72c6090606001611067565b3360009081526008602052604090205460ff16806112ef57506000546001600160a01b031633145b6113365760405162461bcd60e51b81526020600482015260186024820152771bdb9b1e505b1b1bddd9590e88139bdd08185b1b1bddd95960421b6044820152606401610846565b61133e611a8e565b61134c848460008585611ae8565b7f1a18c103bfdc6319356417f8876c8d7aba847786a39ecc37b18d0146ae5f3a0484843360405161112a93929190612615565b6040516370a0823160e01b81523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa1580156113c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e791906125a7565b84111561146f5760405162461bcd60e51b815260206004820152604a60248201527f77697468647261774552433230576974685369676e61747572653a204e6f742060448201527f656e6f75676820455243323020746f6b656e7320696e207265736572766520746064820152696f20776974686472617760b01b608482015260a401610846565b604080516001600160a01b038088166020830152851691810191909152606081018590526080810183905260a080820152601a60c08201527f77697468647261774552433230576974685369676e617475726500000000000060e0820152600090610100016040516020818303038152906040528051906020012090506114f6818361191d565b60405163a9059cbb60e01b81526001600160a01b0385811660048301526024820187905287169063a9059cbb906044016020604051808303816000875af1158015611545573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156991906125f8565b50604080516001600160a01b0388811682526020820188905286168183015233606082015290517f76258fe94fcafc5366d7fd71cfe770504f5471904cfd3bfaa98a6dab60f96bc59181900360800190a1505050505050565b6115ca611a34565b61271081111561162c5760405162461bcd60e51b815260206004820152602760248201527f7365745461786573506572633a2054617865732070657263656e7461676520746044820152660dede40d0d2ced60cb1b6064820152608401610846565b60048190556040518181527ffa31d84b18d5a7dc0fa1fb5cec80c9de2fe172007e56c5b391b432a3c0d7445290602001611067565b611669611a34565b6001600160a01b0381166000908152600660205260409020548211156116ea5760405162461bcd60e51b815260206004820152603060248201527f756e61737369676e4554483a204e6f7420656e6f7567682045544820696e207260448201526f6563697069656e742062616c616e636560801b6064820152608401610846565b6001600160a01b03811660009081526006602052604081208054849290611712908490612573565b92505081905550816002600082825461172b919061255b565b9091555050604080518381526001600160a01b03831660208201527f9788f7bdf4e507017109074dc7e2d9ba5b73f7592e073ebc7959222d351169d9910161066b565b611776611a34565b6001600160a01b0381166117db5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610846565b61124a81611d7a565b6117ec611a34565b8061185c57604051632142170760e11b8152306004820152336024820152604481018390526001600160a01b038416906342842e0e90606401600060405180830381600087803b15801561183f57600080fd5b505af1158015611853573d6000803e3d6000fd5b505050506118c1565b604051637921219560e11b81526001600160a01b0384169063f242432a9061188e9030903390879087906004016125c0565b600060405180830381600087803b1580156118a857600080fd5b505af11580156118bc573d6000803e3d6000fd5b505050505b604080516001600160a01b038516815260208101849052908101829052336060820181905260808201527f1b3bfe851162f1adc68158faaa779a53b6b2c5cf1fd0d482ab8439b10465d3299060a00160405180910390a1505050565b6119278282611dca565b61197e5760405162461bcd60e51b815260206004820152602260248201527f68616e646c655369676e61747572653a20496e76616c6964207369676e617475604482015261726560f01b6064820152608401610846565b60078160405161198e91906126d3565b9081526040519081900360200190205460ff16156119fe5760405162461bcd60e51b815260206004820152602760248201527f68616e646c655369676e61747572653a205369676e617475726520616c726561604482015266191e481d5cd95960ca1b6064820152608401610846565b6001600782604051611a1091906126d3565b908152604051908190036020019020805491151560ff199092169190911790555050565b6000546001600160a01b031633146111535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610846565b60026001541415611ae15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610846565b6002600155565b8351855114611b4f5760405162461bcd60e51b815260206004820152602d60248201527f68616e646c6546756e64733a20417272617973206d757374206861766520746860448201526c0ca40e6c2daca40d8cadccee8d609b1b6064820152608401610846565b3415611b5f57611b5f34836105a3565b6000805b8651811015611c5e576000878281518110611b8057611b80612722565b602002602001015190508083611b96919061255b565b92508515611bf7578060066000898581518110611bb557611bb5612722565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000828254611bec919061255b565b90915550611c4b9050565b868281518110611c0957611c09612722565b60200260200101516001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015611c49573d6000803e3d6000fd5b505b5080611c5681612738565b915050611b63565b508115611cf157600354811115611cd45760405162461bcd60e51b815260206004820152603460248201527f68616e646c6546756e64733a204e6f7420656e6f7567682045544820696e20636044820152736f6e747269627574696f6e732062616c616e636560601b6064820152608401610846565b8060036000828254611ce69190612573565b90915550611d729050565b600254811115611d5a5760405162461bcd60e51b815260206004820152602e60248201527f68616e646c6546756e64733a204e6f7420656e6f7567682045544820696e207260448201526d6573657276652062616c616e636560901b6064820152608401610846565b8060026000828254611d6c9190612573565b90915550505b505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018390526000908190605c0160405160208183030381529060405280519060200120905060008060008551604114611e355760009450505050506106a8565b50505060208301516040840151606085015160001a601b811015611e6157611e5e601b82612753565b90505b60008160ff16601b1480611e7857508160ff16601c145b15611edd5760408051600081526020810180835287905260ff841691810191909152606081018590526080810184905260019060a0016020604051602081039080840390855afa158015611ed0573d6000803e3d6000fd5b5050506020604051035190505b6005546001600160a01b03918216911614979650505050505050565b600060208284031215611f0b57600080fd5b81356001600160e01b031981168114611f2357600080fd5b9392505050565b6001600160a01b038116811461124a57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611f7e57611f7e611f3f565b604052919050565b600082601f830112611f9757600080fd5b813567ffffffffffffffff811115611fb157611fb1611f3f565b611fc4601f8201601f1916602001611f55565b818152846020838601011115611fd957600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561200c57600080fd5b843561201781611f2a565b9350602085013561202781611f2a565b925060408501359150606085013567ffffffffffffffff81111561204a57600080fd5b61205687828801611f86565b91505092959194509250565b60008060008060008060c0878903121561207b57600080fd5b863561208681611f2a565b9550602087013594506040870135935060608701356120a481611f2a565b92506080870135915060a087013567ffffffffffffffff8111156120c757600080fd5b6120d389828a01611f86565b9150509295509295509295565b600080604083850312156120f357600080fd5b82359150602083013561210581611f2a565b809150509250929050565b60006020828403121561212257600080fd5b8135611f2381611f2a565b801515811461124a57600080fd5b80356121468161212d565b919050565b6000806040838503121561215e57600080fd5b823561216981611f2a565b915060208301356121058161212d565b6000806000806080858703121561218f57600080fd5b84359350602085013561202781611f2a565b600067ffffffffffffffff8211156121bb576121bb611f3f565b5060051b60200190565b600082601f8301126121d657600080fd5b813560206121eb6121e6836121a1565b611f55565b82815260059290921b8401810191818101908684111561220a57600080fd5b8286015b84811015612225578035835291830191830161220e565b509695505050505050565b6000806000806080858703121561224657600080fd5b843567ffffffffffffffff8082111561225e57600080fd5b61226a888389016121c5565b955060209150818701358181111561228157600080fd5b87019050601f8101881361229457600080fd5b80356122a26121e6826121a1565b81815260059190911b8201830190838101908a8311156122c157600080fd5b928401925b828410156122e85783356122d981611f2a565b825292840192908401906122c6565b96505050506040860135925061230290506060860161213b565b905092959194509250565b60006020828403121561231f57600080fd5b813567ffffffffffffffff81111561233657600080fd5b6106b784828501611f86565b600080600080600060a0868803121561235a57600080fd5b853561236581611f2a565b945060208601359350604086013561237c81611f2a565b925060608601359150608086013567ffffffffffffffff81111561239f57600080fd5b6123ab88828901611f86565b9150509295509295909350565b600080600080600060a086880312156123d057600080fd5b85356123db81611f2a565b945060208601356123eb81611f2a565b9350604086013567ffffffffffffffff8082111561240857600080fd5b61241489838a016121c5565b9450606088013591508082111561242a57600080fd5b61243689838a016121c5565b9350608088013591508082111561244c57600080fd5b506123ab88828901611f86565b60006020828403121561246b57600080fd5b5035919050565b600080600080600060a0868803121561248a57600080fd5b853561249581611f2a565b945060208601356124a581611f2a565b93506040860135925060608601359150608086013567ffffffffffffffff81111561239f57600080fd5b6000806000606084860312156124e457600080fd5b83356124ef81611f2a565b95602085013595506040909401359392505050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561253457612534612504565b500290565b60008261255657634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561256e5761256e612504565b500190565b60008282101561258557612585612504565b500390565b60006020828403121561259c57600080fd5b8151611f2381611f2a565b6000602082840312156125b957600080fd5b5051919050565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b60006020828403121561260a57600080fd5b8151611f238161212d565b606080825284519082018190526000906020906080840190828801845b8281101561264e57815184529284019290840190600101612632565b5050508381038285015285518082528683019183019060005b8181101561268c5783516001600160a01b031683529284019291840191600101612667565b50506001600160a01b038616604086015292506106b7915050565b60005b838110156126c25781810151838201526020016126aa565b8381111561113b5750506000910152565b600082516126e58184602087016126a7565b9190910192915050565b602081526000825180602084015261270e8160408501602087016126a7565b601f01601f19169190910160400192915050565b634e487b7160e01b600052603260045260246000fd5b600060001982141561274c5761274c612504565b5060010190565b600060ff821660ff84168060ff0382111561277057612770612504565b01939250505056fea2646970667358221220c0206aadf96b156287199b819c0453798bf2974fd66f8e42d2ce08e6dda9785c64736f6c634300080c0033
Deployed Bytecode
0x6080604052600436106101bb5760003560e01c806393d88b54116100ec578063d1efd30d1161008a578063f11520c811610064578063f11520c814610517578063f23a6e6114610537578063f2fde38b14610563578063f570f96a1461058357600080fd5b8063d1efd30d1461048f578063d8f3790f146104af578063e949580e146104dc57600080fd5b8063b6769ef1116100c6578063b6769ef1146103fd578063babcc53914610413578063bc197c8114610443578063d12c92b91461046f57600080fd5b806393d88b54146103b45780639afd09cc146103c7578063a10954fe146103e757600080fd5b8063621c8a1c11610159578063715018a611610133578063715018a614610338578063773c3fff1461034d578063845360171461036d5780638da5cb5b1461038257600080fd5b8063621c8a1c146102e15780636c19e783146103055780636ecaf65a1461032557600080fd5b806336118b521161019557806336118b521461026157806340c442de146102815780634697f05d146102a15780634f416c90146102c157600080fd5b806301ffc9a7146101d3578063150b7a021461020857806335b78f911461024157600080fd5b366101ce576101cc346004546105a3565b005b600080fd5b3480156101df57600080fd5b506101f36101ee366004611ef9565b610677565b60405190151581526020015b60405180910390f35b34801561021457600080fd5b50610228610223366004611ff6565b6106ae565b6040516001600160e01b031990911681526020016101ff565b34801561024d57600080fd5b506101cc61025c366004612062565b6106bf565b34801561026d57600080fd5b506101cc61027c3660046120e0565b610a76565b34801561028d57600080fd5b506101cc61029c366004612110565b610bf5565b3480156102ad57600080fd5b506101cc6102bc36600461214b565b610d92565b3480156102cd57600080fd5b506101cc6102dc366004612179565b610e3e565b3480156102ed57600080fd5b506102f760045481565b6040519081526020016101ff565b34801561031157600080fd5b506101cc610320366004612110565b610fcd565b6101cc610333366004612230565b611072565b34801561034457600080fd5b506101cc611141565b34801561035957600080fd5b506101cc61036836600461230d565b611155565b34801561037957600080fd5b506101cc61124d565b34801561038e57600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016101ff565b6101cc6103c2366004612230565b6112c7565b3480156103d357600080fd5b506101cc6103e2366004612342565b61137f565b3480156103f357600080fd5b506102f760025481565b34801561040957600080fd5b506102f760035481565b34801561041f57600080fd5b506101f361042e366004612110565b60086020526000908152604090205460ff1681565b34801561044f57600080fd5b5061022861045e3660046123b8565b63bc197c8160e01b95945050505050565b34801561047b57600080fd5b506101cc61048a366004612459565b6115c2565b34801561049b57600080fd5b5060055461039c906001600160a01b031681565b3480156104bb57600080fd5b506102f76104ca366004612110565b60066020526000908152604090205481565b3480156104e857600080fd5b506101f36104f736600461230d565b805160208183018101805160078252928201919093012091525460ff1681565b34801561052357600080fd5b506101cc6105323660046120e0565b611661565b34801561054357600080fd5b50610228610552366004612472565b63f23a6e6160e01b95945050505050565b34801561056f57600080fd5b506101cc61057e366004612110565b61176e565b34801561058f57600080fd5b506101cc61059e3660046124cf565b6117e4565b80156106235760006127106105b8838561251a565b6105c29190612539565b905080600360008282546105d6919061255b565b909155506105e690508184612573565b604080518381523360208201529194507f04e75fda068b8e114d7658bdff74280a0fd65586b7e026a034eae29dd5a9e68b910160405180910390a1505b8160026000828254610635919061255b565b9091555050604080518381523360208201527f4bcc17093cdf51079c755de089be5a85e70fa374ec656c194480fbdcda224a5391015b60405180910390a15050565b60006001600160e01b03198216630271189760e51b14806106a857506301ffc9a760e01b6001600160e01b03198316145b92915050565b630a85bd0160e11b5b949350505050565b604080516001600160a01b03808916602083015291810187905290841660608201526080810185905260a0810183905260c080820152601860e08201527f77697468647261774e4654576974685369676e617475726500000000000000006101008201526000906101200160405160208183030381529060405280519060200120905061074c818361191d565b846108bc576040516331a9108f60e11b81526004810187905230906001600160a01b03891690636352211e90602401602060405180830381865afa158015610798573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107bc919061258a565b6001600160a01b03161461084f5760405162461bcd60e51b815260206004820152604960248201527f77697468647261774e4654576974685369676e61747572653a204e6f7420656e60448201527f6f7567682045524337323120746f6b656e7320696e207265736572766520746f60648201526820776974686472617760b81b608482015260a4015b60405180910390fd5b604051632142170760e11b81523060048201526001600160a01b038581166024830152604482018890528816906342842e0e90606401600060405180830381600087803b15801561089f57600080fd5b505af11580156108b3573d6000803e3d6000fd5b50505050610a16565b604051627eeac760e11b8152306004820152602481018790526001600160a01b0388169062fdd58e90604401602060405180830381865afa158015610905573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092991906125a7565b8511156109b15760405162461bcd60e51b815260206004820152604a60248201527f77697468647261774e4654576974685369676e61747572653a204e6f7420656e60448201527f6f756768204552433131353520746f6b656e7320696e207265736572766520746064820152696f20776974686472617760b01b608482015260a401610846565b604051637921219560e11b81526001600160a01b0388169063f242432a906109e390309088908b908b906004016125c0565b600060405180830381600087803b1580156109fd57600080fd5b505af1158015610a11573d6000803e3d6000fd5b505050505b604080516001600160a01b038981168252602082018990528183018890528616606082015233608082015290517f1b3bfe851162f1adc68158faaa779a53b6b2c5cf1fd0d482ab8439b10465d3299181900360a00190a150505050505050565b60008211610ad65760405162461bcd60e51b815260206004820152602760248201527f77697468647261773a20416d6f756e74206d75737420626520677265617465726044820152660207468616e20360cc1b6064820152608401610846565b33600090815260066020526040902054821115610b525760405162461bcd60e51b815260206004820152603460248201527f77697468647261773a204e6f7420656e6f7567682045544820696e20796f75726044820152732062616c616e636520746f20776974686472617760601b6064820152608401610846565b3360009081526006602052604081208054849290610b71908490612573565b90915550506040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610bac573d6000803e3d6000fd5b50604080518381526001600160a01b038316602082015233918101919091527f4c46bd413bdc12128078ae2ee4625145577bcb84a29696605d14ef279ae72c609060600161066b565b610bfd611a34565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6891906125a7565b905060008111610cd05760405162461bcd60e51b815260206004820152602d60248201527f656d657267656e6379576974686472617745524332303a204e6f20746f6b656e60448201526c7320746f20776974686472617760981b6064820152608401610846565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015610d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4191906125f8565b50604080516001600160a01b0384168152602081018390523391810182905260608101919091527f76258fe94fcafc5366d7fd71cfe770504f5471904cfd3bfaa98a6dab60f96bc59060800161066b565b610d9a611a34565b6001600160a01b038216610de25760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610846565b6001600160a01b038216600081815260086020908152604091829020805460ff19168515159081179091558251938452908301527f91d426a6b868d3a9f12f044bfd4dfb1df6e3e050a71a34b090d8ce43a5023c29910161066b565b600254841115610eb65760405162461bcd60e51b815260206004820152603f60248201527f7769746864726177455448576974685369676e61747572653a204e6f7420656e60448201527f6f7567682045544820696e207265736572766520746f207769746864726177006064820152608401610846565b604080516001600160a01b038516602082015290810185905260608101839052608080820152601860a08201527f7769746864726177455448576974685369676e6174757265000000000000000060c082015260009060e001604051602081830303815290604052805190602001209050610f31818361191d565b8460026000828254610f439190612573565b90915550506040516001600160a01b0385169086156108fc029087906000818181858888f19350505050158015610f7e573d6000803e3d6000fd5b50604080518681526001600160a01b0386166020820152338183015290517f4c46bd413bdc12128078ae2ee4625145577bcb84a29696605d14ef279ae72c609181900360600190a15050505050565b610fd5611a34565b6001600160a01b03811661101d5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610846565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fbb10aee7ef5a307b8097c6a7f2892b909ff1736fd24a6a5260640c185f7153b6906020015b60405180910390a150565b3360009081526008602052604090205460ff168061109a57506000546001600160a01b031633145b6110e15760405162461bcd60e51b81526020600482015260186024820152771bdb9b1e505b1b1bddd9590e88139bdd08185b1b1bddd95960421b6044820152606401610846565b6110e9611a8e565b6110f7848460018585611ae8565b7f13739d78c645cdf434d15d67374bbdb8d05882732ecb1a5c64e810be4ce2d91884843360405161112a93929190612615565b60405180910390a161113b60018055565b50505050565b611149611a34565b6111536000611d7a565b565b61115d611a8e565b60078160405161116d91906126d3565b9081526040519081900360200190205460ff16156111d95760405162461bcd60e51b8152602060048201526024808201527f7573655369676e61747572653a205369676e617475726520616c7265616479206044820152631d5cd95960e21b6064820152608401610846565b60016007826040516111eb91906126d3565b908152604051908190036020018120805492151560ff19909316929092179091557ff3b0ff011bd03c6c8253444351e04476ed43d26206e4fb68ce94f04d10c0429c906112399083906126ef565b60405180910390a161124a60018055565b50565b611255611a34565b6002546040514791339181156108fc0291906000818181858888f19350505050158015611286573d6000803e3d6000fd5b50604080518281523360208201819052918101919091527f4c46bd413bdc12128078ae2ee4625145577bcb84a29696605d14ef279ae72c6090606001611067565b3360009081526008602052604090205460ff16806112ef57506000546001600160a01b031633145b6113365760405162461bcd60e51b81526020600482015260186024820152771bdb9b1e505b1b1bddd9590e88139bdd08185b1b1bddd95960421b6044820152606401610846565b61133e611a8e565b61134c848460008585611ae8565b7f1a18c103bfdc6319356417f8876c8d7aba847786a39ecc37b18d0146ae5f3a0484843360405161112a93929190612615565b6040516370a0823160e01b81523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa1580156113c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e791906125a7565b84111561146f5760405162461bcd60e51b815260206004820152604a60248201527f77697468647261774552433230576974685369676e61747572653a204e6f742060448201527f656e6f75676820455243323020746f6b656e7320696e207265736572766520746064820152696f20776974686472617760b01b608482015260a401610846565b604080516001600160a01b038088166020830152851691810191909152606081018590526080810183905260a080820152601a60c08201527f77697468647261774552433230576974685369676e617475726500000000000060e0820152600090610100016040516020818303038152906040528051906020012090506114f6818361191d565b60405163a9059cbb60e01b81526001600160a01b0385811660048301526024820187905287169063a9059cbb906044016020604051808303816000875af1158015611545573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156991906125f8565b50604080516001600160a01b0388811682526020820188905286168183015233606082015290517f76258fe94fcafc5366d7fd71cfe770504f5471904cfd3bfaa98a6dab60f96bc59181900360800190a1505050505050565b6115ca611a34565b61271081111561162c5760405162461bcd60e51b815260206004820152602760248201527f7365745461786573506572633a2054617865732070657263656e7461676520746044820152660dede40d0d2ced60cb1b6064820152608401610846565b60048190556040518181527ffa31d84b18d5a7dc0fa1fb5cec80c9de2fe172007e56c5b391b432a3c0d7445290602001611067565b611669611a34565b6001600160a01b0381166000908152600660205260409020548211156116ea5760405162461bcd60e51b815260206004820152603060248201527f756e61737369676e4554483a204e6f7420656e6f7567682045544820696e207260448201526f6563697069656e742062616c616e636560801b6064820152608401610846565b6001600160a01b03811660009081526006602052604081208054849290611712908490612573565b92505081905550816002600082825461172b919061255b565b9091555050604080518381526001600160a01b03831660208201527f9788f7bdf4e507017109074dc7e2d9ba5b73f7592e073ebc7959222d351169d9910161066b565b611776611a34565b6001600160a01b0381166117db5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610846565b61124a81611d7a565b6117ec611a34565b8061185c57604051632142170760e11b8152306004820152336024820152604481018390526001600160a01b038416906342842e0e90606401600060405180830381600087803b15801561183f57600080fd5b505af1158015611853573d6000803e3d6000fd5b505050506118c1565b604051637921219560e11b81526001600160a01b0384169063f242432a9061188e9030903390879087906004016125c0565b600060405180830381600087803b1580156118a857600080fd5b505af11580156118bc573d6000803e3d6000fd5b505050505b604080516001600160a01b038516815260208101849052908101829052336060820181905260808201527f1b3bfe851162f1adc68158faaa779a53b6b2c5cf1fd0d482ab8439b10465d3299060a00160405180910390a1505050565b6119278282611dca565b61197e5760405162461bcd60e51b815260206004820152602260248201527f68616e646c655369676e61747572653a20496e76616c6964207369676e617475604482015261726560f01b6064820152608401610846565b60078160405161198e91906126d3565b9081526040519081900360200190205460ff16156119fe5760405162461bcd60e51b815260206004820152602760248201527f68616e646c655369676e61747572653a205369676e617475726520616c726561604482015266191e481d5cd95960ca1b6064820152608401610846565b6001600782604051611a1091906126d3565b908152604051908190036020019020805491151560ff199092169190911790555050565b6000546001600160a01b031633146111535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610846565b60026001541415611ae15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610846565b6002600155565b8351855114611b4f5760405162461bcd60e51b815260206004820152602d60248201527f68616e646c6546756e64733a20417272617973206d757374206861766520746860448201526c0ca40e6c2daca40d8cadccee8d609b1b6064820152608401610846565b3415611b5f57611b5f34836105a3565b6000805b8651811015611c5e576000878281518110611b8057611b80612722565b602002602001015190508083611b96919061255b565b92508515611bf7578060066000898581518110611bb557611bb5612722565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000828254611bec919061255b565b90915550611c4b9050565b868281518110611c0957611c09612722565b60200260200101516001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015611c49573d6000803e3d6000fd5b505b5080611c5681612738565b915050611b63565b508115611cf157600354811115611cd45760405162461bcd60e51b815260206004820152603460248201527f68616e646c6546756e64733a204e6f7420656e6f7567682045544820696e20636044820152736f6e747269627574696f6e732062616c616e636560601b6064820152608401610846565b8060036000828254611ce69190612573565b90915550611d729050565b600254811115611d5a5760405162461bcd60e51b815260206004820152602e60248201527f68616e646c6546756e64733a204e6f7420656e6f7567682045544820696e207260448201526d6573657276652062616c616e636560901b6064820152608401610846565b8060026000828254611d6c9190612573565b90915550505b505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018390526000908190605c0160405160208183030381529060405280519060200120905060008060008551604114611e355760009450505050506106a8565b50505060208301516040840151606085015160001a601b811015611e6157611e5e601b82612753565b90505b60008160ff16601b1480611e7857508160ff16601c145b15611edd5760408051600081526020810180835287905260ff841691810191909152606081018590526080810184905260019060a0016020604051602081039080840390855afa158015611ed0573d6000803e3d6000fd5b5050506020604051035190505b6005546001600160a01b03918216911614979650505050505050565b600060208284031215611f0b57600080fd5b81356001600160e01b031981168114611f2357600080fd5b9392505050565b6001600160a01b038116811461124a57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611f7e57611f7e611f3f565b604052919050565b600082601f830112611f9757600080fd5b813567ffffffffffffffff811115611fb157611fb1611f3f565b611fc4601f8201601f1916602001611f55565b818152846020838601011115611fd957600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561200c57600080fd5b843561201781611f2a565b9350602085013561202781611f2a565b925060408501359150606085013567ffffffffffffffff81111561204a57600080fd5b61205687828801611f86565b91505092959194509250565b60008060008060008060c0878903121561207b57600080fd5b863561208681611f2a565b9550602087013594506040870135935060608701356120a481611f2a565b92506080870135915060a087013567ffffffffffffffff8111156120c757600080fd5b6120d389828a01611f86565b9150509295509295509295565b600080604083850312156120f357600080fd5b82359150602083013561210581611f2a565b809150509250929050565b60006020828403121561212257600080fd5b8135611f2381611f2a565b801515811461124a57600080fd5b80356121468161212d565b919050565b6000806040838503121561215e57600080fd5b823561216981611f2a565b915060208301356121058161212d565b6000806000806080858703121561218f57600080fd5b84359350602085013561202781611f2a565b600067ffffffffffffffff8211156121bb576121bb611f3f565b5060051b60200190565b600082601f8301126121d657600080fd5b813560206121eb6121e6836121a1565b611f55565b82815260059290921b8401810191818101908684111561220a57600080fd5b8286015b84811015612225578035835291830191830161220e565b509695505050505050565b6000806000806080858703121561224657600080fd5b843567ffffffffffffffff8082111561225e57600080fd5b61226a888389016121c5565b955060209150818701358181111561228157600080fd5b87019050601f8101881361229457600080fd5b80356122a26121e6826121a1565b81815260059190911b8201830190838101908a8311156122c157600080fd5b928401925b828410156122e85783356122d981611f2a565b825292840192908401906122c6565b96505050506040860135925061230290506060860161213b565b905092959194509250565b60006020828403121561231f57600080fd5b813567ffffffffffffffff81111561233657600080fd5b6106b784828501611f86565b600080600080600060a0868803121561235a57600080fd5b853561236581611f2a565b945060208601359350604086013561237c81611f2a565b925060608601359150608086013567ffffffffffffffff81111561239f57600080fd5b6123ab88828901611f86565b9150509295509295909350565b600080600080600060a086880312156123d057600080fd5b85356123db81611f2a565b945060208601356123eb81611f2a565b9350604086013567ffffffffffffffff8082111561240857600080fd5b61241489838a016121c5565b9450606088013591508082111561242a57600080fd5b61243689838a016121c5565b9350608088013591508082111561244c57600080fd5b506123ab88828901611f86565b60006020828403121561246b57600080fd5b5035919050565b600080600080600060a0868803121561248a57600080fd5b853561249581611f2a565b945060208601356124a581611f2a565b93506040860135925060608601359150608086013567ffffffffffffffff81111561239f57600080fd5b6000806000606084860312156124e457600080fd5b83356124ef81611f2a565b95602085013595506040909401359392505050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561253457612534612504565b500290565b60008261255657634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561256e5761256e612504565b500190565b60008282101561258557612585612504565b500390565b60006020828403121561259c57600080fd5b8151611f2381611f2a565b6000602082840312156125b957600080fd5b5051919050565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b60006020828403121561260a57600080fd5b8151611f238161212d565b606080825284519082018190526000906020906080840190828801845b8281101561264e57815184529284019290840190600101612632565b5050508381038285015285518082528683019183019060005b8181101561268c5783516001600160a01b031683529284019291840191600101612667565b50506001600160a01b038616604086015292506106b7915050565b60005b838110156126c25781810151838201526020016126aa565b8381111561113b5750506000910152565b600082516126e58184602087016126a7565b9190910192915050565b602081526000825180602084015261270e8160408501602087016126a7565b601f01601f19169190910160400192915050565b634e487b7160e01b600052603260045260246000fd5b600060001982141561274c5761274c612504565b5060010190565b600060ff821660ff84168060ff0382111561277057612770612504565b01939250505056fea2646970667358221220c0206aadf96b156287199b819c0453798bf2974fd66f8e42d2ce08e6dda9785c64736f6c634300080c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.999291 | 6,000 | $5,995.75 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.