More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 27,381 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0xfd453a85 | 28945320 | 648 days ago | IN | 0.51 xDAI | 0.00037953 | ||||
0xfd453a85 | 28882892 | 652 days ago | IN | 0.000102 xDAI | 0.00023704 | ||||
0xfd453a85 | 28746541 | 660 days ago | IN | 0.000102 xDAI | 0.00023487 | ||||
0xfd453a85 | 28746512 | 660 days ago | IN | 0.000102 xDAI | 0.00023704 | ||||
0xfd453a85 | 28745655 | 661 days ago | IN | 0.000102 xDAI | 0.00028803 | ||||
0xfd453a85 | 28705848 | 663 days ago | IN | 0.000102 xDAI | 0.00101728 | ||||
0xfd453a85 | 28683037 | 664 days ago | IN | 0.000102 xDAI | 0.00033222 | ||||
0xfd453a85 | 28683019 | 664 days ago | IN | 0.000102 xDAI | 0.00036436 | ||||
0xfd453a85 | 28667405 | 665 days ago | IN | 0.000408 xDAI | 0.00035204 | ||||
0xfd453a85 | 28667389 | 665 days ago | IN | 0.000102 xDAI | 0.0003318 | ||||
0xfd453a85 | 28667382 | 665 days ago | IN | 0.000102 xDAI | 0.00035647 | ||||
0xfd453a85 | 28666824 | 665 days ago | IN | 0.00102 xDAI | 0.00023425 | ||||
0xfd453a85 | 28648606 | 666 days ago | IN | 0.000102 xDAI | 0.00032813 | ||||
0xfd453a85 | 28646523 | 667 days ago | IN | 0.51 xDAI | 0.00025844 | ||||
0xfd453a85 | 28645395 | 667 days ago | IN | 0.000102 xDAI | 0.00031685 | ||||
0xfd453a85 | 28645392 | 667 days ago | IN | 0.000102 xDAI | 0.00029784 | ||||
0xfd453a85 | 28645389 | 667 days ago | IN | 0.000102 xDAI | 0.00031682 | ||||
0xfd453a85 | 28645387 | 667 days ago | IN | 0.000102 xDAI | 0.00032 | ||||
0xfd453a85 | 28645385 | 667 days ago | IN | 0.000102 xDAI | 0.00031686 | ||||
0xfd453a85 | 28630810 | 667 days ago | IN | 0.000102 xDAI | 0.00024002 | ||||
0xfd453a85 | 28605858 | 669 days ago | IN | 0.000102 xDAI | 0.00023469 | ||||
0xfd453a85 | 28536066 | 673 days ago | IN | 0.000408 xDAI | 0.00026074 | ||||
0xfd453a85 | 28524487 | 674 days ago | IN | 0.000102 xDAI | 0.00022359 | ||||
0xfd453a85 | 28487586 | 676 days ago | IN | 0.000102 xDAI | 0.00035647 | ||||
0xfd453a85 | 28487554 | 676 days ago | IN | 0.000102 xDAI | 0.00035647 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
28945320 | 648 days ago | 0.45 xDAI | ||||
28945320 | 648 days ago | 0.05 xDAI | ||||
28945320 | 648 days ago | 0.01 xDAI | ||||
28882892 | 652 days ago | 0.00009 xDAI | ||||
28882892 | 652 days ago | 0.00001 xDAI | ||||
28882892 | 652 days ago | 0.000002 xDAI | ||||
28746541 | 660 days ago | 0.00009 xDAI | ||||
28746541 | 660 days ago | 0.00001 xDAI | ||||
28746541 | 660 days ago | 0.000002 xDAI | ||||
28746512 | 660 days ago | 0.00009 xDAI | ||||
28746512 | 660 days ago | 0.00001 xDAI | ||||
28746512 | 660 days ago | 0.000002 xDAI | ||||
28745655 | 661 days ago | 0.00009 xDAI | ||||
28745655 | 661 days ago | 0.00001 xDAI | ||||
28745655 | 661 days ago | 0.000002 xDAI | ||||
28705848 | 663 days ago | 0.0001 xDAI | ||||
28705848 | 663 days ago | 0.000002 xDAI | ||||
28683037 | 664 days ago | 0.00009 xDAI | ||||
28683037 | 664 days ago | 0.00001 xDAI | ||||
28683037 | 664 days ago | 0.000002 xDAI | ||||
28683019 | 664 days ago | 0.00009 xDAI | ||||
28683019 | 664 days ago | 0.00001 xDAI | ||||
28683019 | 664 days ago | 0.000002 xDAI | ||||
28667405 | 665 days ago | 0.00036 xDAI | ||||
28667405 | 665 days ago | 0.00004 xDAI |
Loading...
Loading
Contract Name:
ERC1155Sale
Compiler Version
v0.5.16+commit.9c3226ce
Optimization Enabled:
Yes with 200 runs
Other Settings:
istanbul EvmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at gnosisscan.io on 2022-08-04 */ pragma solidity ^0.5.0; pragma experimental ABIEncoderV2; /** * @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); } /** @title ERC-1155 Multi Token Standard @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md Note: The ERC-165 identifier for this interface is 0xd9b67a26. */ contract IERC1155 is IERC165 { /** @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). The `_operator` argument MUST be msg.sender. The `_from` argument MUST be the address of the holder whose balance is decreased. The `_to` argument MUST be the address of the recipient whose balance is increased. The `_id` argument MUST be the token type being transferred. The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by. When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). */ event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value); /** @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). The `_operator` argument MUST be msg.sender. The `_from` argument MUST be the address of the holder whose balance is decreased. The `_to` argument MUST be the address of the recipient whose balance is increased. The `_ids` argument MUST be the list of tokens being transferred. The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by. When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). */ event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values); /** @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absense of an event assumes disabled). */ event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /** @dev MUST emit when the URI is updated for a token ID. URIs are defined in RFC 3986. The URI MUST point a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema". */ event URI(string _value, uint256 indexed _id); /** @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call). @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). MUST revert if `_to` is the zero address. MUST revert if balance of holder for token `_id` is lower than the `_value` sent. MUST revert on any other error. MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard). After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). @param _from Source address @param _to Target address @param _id ID of the token type @param _value Transfer amount @param _data Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to` */ function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external; /** @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call). @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). MUST revert if `_to` is the zero address. MUST revert if length of `_ids` is not the same as length of `_values`. MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient. MUST revert on any other error. MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard). Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc). After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). @param _from Source address @param _to Target address @param _ids IDs of each token type (order and length must match _values array) @param _values Transfer amounts per token type (order and length must match _ids array) @param _data Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to` */ function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data) external; /** @notice Get the balance of an account's Tokens. @param _owner The address of the token holder @param _id ID of the Token @return The _owner's balance of the Token type requested */ function balanceOf(address _owner, uint256 _id) external view returns (uint256); /** @notice Get the balance of multiple account/token pairs @param _owners The addresses of the token holders @param _ids ID of the Tokens @return The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair) */ function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view returns (uint256[] memory); /** @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens. @dev MUST emit the ApprovalForAll event on success. @param _operator Address to add to the set of authorized operators @param _approved True if the operator is approved, false to revoke approval */ function setApprovalForAll(address _operator, bool _approved) external; /** @notice Queries the approval status of an operator for a given owner. @param _owner The owner of the Tokens @param _operator Address of authorized operator @return True if the operator is approved, false if not */ function isApprovedForAll(address _owner, address _operator) external view returns (bool); } library UintLibrary { function toString(uint256 _i) internal pure returns (string memory) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len - 1; while (_i != 0) { bstr[k--] = byte(uint8(48 + _i % 10)); _i /= 10; } return string(bstr); } } library StringLibrary { using UintLibrary for uint256; function append(string memory _a, string memory _b) internal pure returns (string memory) { bytes memory _ba = bytes(_a); bytes memory _bb = bytes(_b); bytes memory bab = new bytes(_ba.length + _bb.length); uint k = 0; for (uint i = 0; i < _ba.length; i++) bab[k++] = _ba[i]; for (uint i = 0; i < _bb.length; i++) bab[k++] = _bb[i]; return string(bab); } function append(string memory _a, string memory _b, string memory _c) internal pure returns (string memory) { bytes memory _ba = bytes(_a); bytes memory _bb = bytes(_b); bytes memory _bc = bytes(_c); bytes memory bbb = new bytes(_ba.length + _bb.length + _bc.length); uint k = 0; for (uint i = 0; i < _ba.length; i++) bbb[k++] = _ba[i]; for (uint i = 0; i < _bb.length; i++) bbb[k++] = _bb[i]; for (uint i = 0; i < _bc.length; i++) bbb[k++] = _bc[i]; return string(bbb); } function recover(string memory message, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { bytes memory msgBytes = bytes(message); bytes memory fullMessage = concat( bytes("\x19Ethereum Signed Message:\n"), bytes(msgBytes.length.toString()), msgBytes, new bytes(0), new bytes(0), new bytes(0), new bytes(0) ); return ecrecover(keccak256(fullMessage), v, r, s); } function concat(bytes memory _ba, bytes memory _bb, bytes memory _bc, bytes memory _bd, bytes memory _be, bytes memory _bf, bytes memory _bg) internal pure returns (bytes memory) { bytes memory resultBytes = new bytes(_ba.length + _bb.length + _bc.length + _bd.length + _be.length + _bf.length + _bg.length); uint k = 0; for (uint i = 0; i < _ba.length; i++) resultBytes[k++] = _ba[i]; for (uint i = 0; i < _bb.length; i++) resultBytes[k++] = _bb[i]; for (uint i = 0; i < _bc.length; i++) resultBytes[k++] = _bc[i]; for (uint i = 0; i < _bd.length; i++) resultBytes[k++] = _bd[i]; for (uint i = 0; i < _be.length; i++) resultBytes[k++] = _be[i]; for (uint i = 0; i < _bf.length; i++) resultBytes[k++] = _bf[i]; for (uint i = 0; i < _bg.length; i++) resultBytes[k++] = _bg[i]; return resultBytes; } } library AddressLibrary { function toString(address _addr) internal pure returns (string memory) { bytes32 value = bytes32(uint256(_addr)); bytes memory alphabet = "0123456789abcdef"; bytes memory str = new bytes(42); str[0] = '0'; str[1] = 'x'; for (uint256 i = 0; i < 20; i++) { str[2+i*2] = alphabet[uint8(value[i + 12] >> 4)]; str[3+i*2] = alphabet[uint8(value[i + 12] & 0x0f)]; } return string(str); } } /* * @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 GSN 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. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @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. * * 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. */ 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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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 onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } contract HasSecondarySaleFees is ERC165 { event SecondarySaleFees(uint256 tokenId, address[] recipients, uint[] bps); /* * bytes4(keccak256('getFeeBps(uint256)')) == 0x0ebd4c7f * bytes4(keccak256('getFeeRecipients(uint256)')) == 0xb9c4d9fb * * => 0x0ebd4c7f ^ 0xb9c4d9fb == 0xb7799584 */ bytes4 private constant _INTERFACE_ID_FEES = 0xb7799584; constructor() public { _registerInterface(_INTERFACE_ID_FEES); } function getFeeRecipients(uint256 id) public view returns (address payable[] memory); function getFeeBps(uint256 id) public view returns (uint[] memory); } contract AbstractSale is Ownable { using UintLibrary for uint256; using AddressLibrary for address; using StringLibrary for string; using SafeMath for uint256; bytes4 private constant _INTERFACE_ID_FEES = 0xb7799584; uint private constant maxBuyerFeePercentage = 10000; uint public buyerFee = 0; address payable public beneficiary; /* An ECDSA signature. */ struct Sig { /* v parameter */ uint8 v; /* r parameter */ bytes32 r; /* s parameter */ bytes32 s; } constructor(address payable _beneficiary) public { beneficiary = _beneficiary; } function setBuyerFee(uint256 _buyerFee) public onlyOwner { require(_buyerFee <= maxBuyerFeePercentage, "max buyer percentage can't be more than 10000"); buyerFee = _buyerFee; } function setBeneficiary(address payable _beneficiary) public onlyOwner { beneficiary = _beneficiary; } function prepareMessage(address token, uint256 tokenId, uint256 price, uint256 fee, uint256 nonce) internal pure returns (string memory) { string memory result = string(strConcat( bytes(token.toString()), bytes(". tokenId: "), bytes(tokenId.toString()), bytes(". price: "), bytes(price.toString()), bytes(". nonce: "), bytes(nonce.toString()) )); if (fee != 0) { return result.append(". fee: ", fee.toString()); } else { return result; } } function strConcat(bytes memory _ba, bytes memory _bb, bytes memory _bc, bytes memory _bd, bytes memory _be, bytes memory _bf, bytes memory _bg) internal pure returns (bytes memory) { bytes memory resultBytes = new bytes(_ba.length + _bb.length + _bc.length + _bd.length + _be.length + _bf.length + _bg.length); uint k = 0; for (uint i = 0; i < _ba.length; i++) resultBytes[k++] = _ba[i]; for (uint i = 0; i < _bb.length; i++) resultBytes[k++] = _bb[i]; for (uint i = 0; i < _bc.length; i++) resultBytes[k++] = _bc[i]; for (uint i = 0; i < _bd.length; i++) resultBytes[k++] = _bd[i]; for (uint i = 0; i < _be.length; i++) resultBytes[k++] = _be[i]; for (uint i = 0; i < _bf.length; i++) resultBytes[k++] = _bf[i]; for (uint i = 0; i < _bg.length; i++) resultBytes[k++] = _bg[i]; return resultBytes; } function transferEther(IERC165 token, uint256 tokenId, address payable owner, uint256 total, uint256 sellerFee) internal { uint value = transferFeeToBeneficiary(total, sellerFee); if (token.supportsInterface(_INTERFACE_ID_FEES)) { HasSecondarySaleFees withFees = HasSecondarySaleFees(address(token)); address payable[] memory recipients = withFees.getFeeRecipients(tokenId); uint[] memory fees = withFees.getFeeBps(tokenId); require(fees.length == recipients.length); for (uint256 i = 0; i < fees.length; i++) { (uint newValue, uint current) = subFee(value, total.mul(fees[i]).div(maxBuyerFeePercentage)); value = newValue; recipients[i].transfer(current); } } owner.transfer(value); } function transferFeeToBeneficiary(uint total, uint sellerFee) internal returns (uint) { (uint value, uint sellerFeeValue) = subFee(total, total.mul(sellerFee).div(maxBuyerFeePercentage)); uint buyerFeeValue = total.mul(buyerFee).div(maxBuyerFeePercentage); uint beneficiaryFee = buyerFeeValue.add(sellerFeeValue); if (beneficiaryFee > 0) { beneficiary.transfer(beneficiaryFee); } return value; } function subFee(uint value, uint fee) internal pure returns (uint newValue, uint realFee) { if (value > fee) { newValue = value - fee; realFee = fee; } else { newValue = 0; realFee = value; } } } /** * @dev Required interface of an ERC721 compliant contract. */ contract IERC721 is IERC165 { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of NFTs in `owner`'s account. */ function balanceOf(address owner) public view returns (uint256 balance); /** * @dev Returns the owner of the NFT specified by `tokenId`. */ function ownerOf(uint256 tokenId) public view returns (address owner); /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * * * Requirements: * - `from`, `to` cannot be zero. * - `tokenId` must be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this * NFT by either {approve} or {setApprovalForAll}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public; /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * Requirements: * - If the caller is not `from`, it must be approved to move this NFT by * either {approve} or {setApprovalForAll}. */ function transferFrom(address from, address to, uint256 tokenId) public; function approve(address to, uint256 tokenId) public; function getApproved(uint256 tokenId) public view returns (address operator); function setApprovalForAll(address operator, bool _approved) public; function isApprovedForAll(address owner, address operator) public view returns (bool); function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public; } /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } contract OperatorRole is Context { using Roles for Roles.Role; event OperatorAdded(address indexed account); event OperatorRemoved(address indexed account); Roles.Role private _operators; constructor () internal { } modifier onlyOperator() { require(isOperator(_msgSender()), "OperatorRole: caller does not have the Operator role"); _; } function isOperator(address account) public view returns (bool) { return _operators.has(account); } function _addOperator(address account) internal { _operators.add(account); emit OperatorAdded(account); } function _removeOperator(address account) internal { _operators.remove(account); emit OperatorRemoved(account); } } contract OwnableOperatorRole is Ownable, OperatorRole { function addOperator(address account) public onlyOwner { _addOperator(account); } function removeOperator(address account) public onlyOwner { _removeOperator(account); } } contract TransferProxy is OwnableOperatorRole { function erc721safeTransferFrom(IERC721 token, address from, address to, uint256 tokenId) external onlyOperator { token.safeTransferFrom(from, to, tokenId); } function erc1155safeTransferFrom(IERC1155 token, address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external onlyOperator { token.safeTransferFrom(_from, _to, _id, _value, _data); } } contract ERC1155SaleNonceHolder is OwnableOperatorRole { // keccak256(token, owner, tokenId) => nonce mapping(bytes32 => uint256) public nonces; // keccak256(token, owner, tokenId, nonce) => completed amount mapping(bytes32 => uint256) public completed; function getNonce(address token, uint256 tokenId, address owner) view public returns (uint256) { return nonces[getNonceKey(token, tokenId, owner)]; } function setNonce(address token, uint256 tokenId, address owner, uint256 nonce) public onlyOperator { nonces[getNonceKey(token, tokenId, owner)] = nonce; } function getNonceKey(address token, uint256 tokenId, address owner) pure public returns (bytes32) { return keccak256(abi.encodePacked(token, tokenId, owner)); } function getCompleted(address token, uint256 tokenId, address owner, uint256 nonce) view public returns (uint256) { return completed[getCompletedKey(token, tokenId, owner, nonce)]; } function setCompleted(address token, uint256 tokenId, address owner, uint256 nonce, uint256 _completed) public onlyOperator { completed[getCompletedKey(token, tokenId, owner, nonce)] = _completed; } function getCompletedKey(address token, uint256 tokenId, address owner, uint256 nonce) pure public returns (bytes32) { return keccak256(abi.encodePacked(token, tokenId, owner, nonce)); } } contract ERC1155Sale is Ownable, AbstractSale { using StringLibrary for string; event CloseOrder(address indexed token, uint256 indexed tokenId, address owner, uint256 nonce); event Buy(address indexed token, uint256 indexed tokenId, address owner, uint256 price, address buyer, uint256 value); uint private constant maxBuyerFeePercentage = 10000; bytes constant EMPTY = ""; TransferProxy public transferProxy; ERC1155SaleNonceHolder public nonceHolder; constructor(TransferProxy _transferProxy, ERC1155SaleNonceHolder _nonceHolder, address payable beneficiary) AbstractSale(beneficiary) public { transferProxy = _transferProxy; nonceHolder = _nonceHolder; } function buy(IERC1155 token, uint256 tokenId, address payable owner, uint256 selling, uint256 buying, uint256 price, uint256 sellerFee, Sig memory signature) public payable { uint256 nonce = verifySignature(address(token), tokenId, owner, selling, price, sellerFee, signature); uint256 total = price.mul(buying); uint256 buyerFeeValue = total.mul(buyerFee).div(maxBuyerFeePercentage); require(total.add(buyerFeeValue) == msg.value, "msg.value is incorrect" ); bool closed = verifyOpenAndModifyState(address(token), tokenId, owner, nonce, selling, buying); transferProxy.erc1155safeTransferFrom(token, owner, msg.sender, tokenId, buying, EMPTY); transferEther(token, tokenId, owner, total, sellerFee); emit Buy(address(token), tokenId, owner, price, msg.sender, buying); if (closed) { emit CloseOrder(address(token), tokenId, owner, nonce + 1); } } function cancel(address token, uint256 tokenId) public payable { uint nonce = nonceHolder.getNonce(token, tokenId, msg.sender); nonceHolder.setNonce(token, tokenId, msg.sender, nonce + 1); emit CloseOrder(token, tokenId, msg.sender, nonce + 1); } function verifySignature(address token, uint256 tokenId, address payable owner, uint256 selling, uint256 price, uint256 sellerFee, Sig memory signature) view internal returns (uint256 nonce) { nonce = nonceHolder.getNonce(token, tokenId, owner); require(prepareMessage(token, tokenId, price, selling, sellerFee, nonce).recover(signature.v, signature.r, signature.s) == owner, "incorrect signature"); } function verifyOpenAndModifyState(address token, uint256 tokenId, address payable owner, uint256 nonce, uint256 selling, uint256 buying) internal returns (bool) { uint comp = nonceHolder.getCompleted(token, tokenId, owner, nonce).add(buying); require(comp <= selling); nonceHolder.setCompleted(token, tokenId, owner, nonce, comp); if (comp == selling) { nonceHolder.setNonce(token, tokenId, owner, nonce + 1); return true; } return false; } function prepareMessage(address token, uint256 tokenId, uint256 price, uint256 value, uint256 fee, uint256 nonce) internal pure returns (string memory) { return prepareMessage(token, tokenId, price, fee, nonce).append(". value: ", value.toString()); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract TransferProxy","name":"_transferProxy","type":"address"},{"internalType":"contract ERC1155SaleNonceHolder","name":"_nonceHolder","type":"address"},{"internalType":"address payable","name":"beneficiary","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"CloseOrder","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"},{"constant":true,"inputs":[],"name":"beneficiary","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC1155","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address payable","name":"owner","type":"address"},{"internalType":"uint256","name":"selling","type":"uint256"},{"internalType":"uint256","name":"buying","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerFee","type":"uint256"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct AbstractSale.Sig","name":"signature","type":"tuple"}],"name":"buy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"buyerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"cancel","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nonceHolder","outputs":[{"internalType":"contract ERC1155SaleNonceHolder","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_beneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_buyerFee","type":"uint256"}],"name":"setBuyerFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"transferProxy","outputs":[{"internalType":"contract TransferProxy","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405260006001553480156200001657600080fd5b506040516200239038038062002390833981016040819052620000399162000103565b8060006200004f6001600160e01b03620000df16565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600280546001600160a01b03199081166001600160a01b0393841617909155600380548216958316959095179094556004805490941692169190911790915550620001a2565b3390565b8051620000f0816200017d565b92915050565b8051620000f08162000197565b6000806000606084860312156200011957600080fd5b6000620001278686620000f6565b93505060206200013a86828701620000f6565b92505060406200014d86828701620000e3565b9150509250925092565b6000620000f08262000171565b6000620000f08262000157565b6001600160a01b031690565b620001888162000157565b81146200019457600080fd5b50565b620001888162000164565b6121de80620001b26000396000f3fe6080604052600436106100a75760003560e01c80638da5cb5b116100645780638da5cb5b146101675780638f32d59b1461017c57806398590ef91461019e578063f2fde38b146101b1578063fa7da19d146101d1578063fd453a85146101f1576100a7565b80631c31f710146100ac57806338af3eed146100ce57806341a259a6146100f95780635de6c42f1461011b5780636e667db31461013d578063715018a614610152575b600080fd5b3480156100b857600080fd5b506100cc6100c7366004611a7f565b610204565b005b3480156100da57600080fd5b506100e3610253565b6040516100f09190611e75565b60405180910390f35b34801561010557600080fd5b5061010e610262565b6040516100f09190611f8f565b34801561012757600080fd5b50610130610271565b6040516100f0919061207e565b34801561014957600080fd5b5061010e610277565b34801561015e57600080fd5b506100cc610286565b34801561017357600080fd5b506100e36102f4565b34801561018857600080fd5b50610191610303565b6040516100f09190611f4b565b6100cc6101ac366004611a9d565b610327565b3480156101bd57600080fd5b506100cc6101cc366004611a7f565b610464565b3480156101dd57600080fd5b506100cc6101ec366004611c0f565b610494565b6100cc6101ff366004611b5f565b6104df565b61020c610303565b6102315760405162461bcd60e51b81526004016102289061205e565b60405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6004546001600160a01b031681565b60015481565b6003546001600160a01b031681565b61028e610303565b6102aa5760405162461bcd60e51b81526004016102289061205e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b600080546001600160a01b03166103186106ae565b6001600160a01b031614905090565b6004805460405163250adb3160e11b81526000926001600160a01b0390921691634a15b6629161035d9187918791339101611ed3565b60206040518083038186803b15801561037557600080fd5b505afa158015610389573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103ad9190810190611c2d565b600480546040516308345fbf60e01b81529293506001600160a01b0316916308345fbf916103e691879187913391600189019101611efb565b600060405180830381600087803b15801561040057600080fd5b505af1158015610414573d6000803e3d6000fd5b5050505081836001600160a01b03167f1910cc041d39d8d4ddb31ea5990a0b170e2b585057bfac4853f3c2929b276ee23384600101604051610457929190611e83565b60405180910390a3505050565b61046c610303565b6104885760405162461bcd60e51b81526004016102289061205e565b610491816106b2565b50565b61049c610303565b6104b85760405162461bcd60e51b81526004016102289061205e565b6127108111156104da5760405162461bcd60e51b81526004016102289061200e565b600155565b60006104f089898989888888610733565b90506000610504858763ffffffff61082416565b9050600061052f6127106105236001548561082490919063ffffffff16565b9063ffffffff61086716565b905034610542838363ffffffff6108a916565b1461055f5760405162461bcd60e51b81526004016102289061206e565b600061056f8c8c8c878d8d6108ce565b9050600360009054906101000a90046001600160a01b03166001600160a01b0316639c1c2ee98d8c338f8d604051806020016040528060008152506040518763ffffffff1660e01b81526004016105cb96959493929190611f9d565b600060405180830381600087803b1580156105e557600080fd5b505af11580156105f9573d6000803e3d6000fd5b5050505061060a8c8c8c868a610a6e565b8a8c6001600160a01b03167f710791c544fdcb0c8c5b17f5bfa5b6721dfff68224047778e2d64e426ded61c68c8a338d60405161064a9493929190611e9e565b60405180910390a380156106a0578a8c6001600160a01b03167f1910cc041d39d8d4ddb31ea5990a0b170e2b585057bfac4853f3c2929b276ee28c87600101604051610697929190611e83565b60405180910390a35b505050505050505050505050565b3390565b6001600160a01b0381166106d85760405162461bcd60e51b81526004016102289061201e565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6004805460405163250adb3160e11b81526000926001600160a01b0390921691634a15b66291610769918c918c918c9101611ed3565b60206040518083038186803b15801561078157600080fd5b505afa158015610795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107b99190810190611c2d565b9050856001600160a01b03166107f38360000151846020015185604001516107e58d8d8b8d8c8b610d04565b92919063ffffffff610d4e16565b6001600160a01b0316146108195760405162461bcd60e51b81526004016102289061203e565b979650505050505050565b60008261083357506000610861565b8282028284828161084057fe5b041461085e5760405162461bcd60e51b81526004016102289061204e565b90505b92915050565b600061085e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610e2c565b60008282018381101561085e5760405162461bcd60e51b81526004016102289061202e565b60048054604051637ad2ec8560e01b8152600092839261096a9286926001600160a01b0390921691637ad2ec859161090e918e918e918e918e9101611efb565b60206040518083038186803b15801561092657600080fd5b505afa15801561093a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061095e9190810190611c2d565b9063ffffffff6108a916565b90508381111561097957600080fd5b60048054604051634bd49ccb60e01b81526001600160a01b0390911691634bd49ccb916109b0918c918c918c918c91899101611f09565b600060405180830381600087803b1580156109ca57600080fd5b505af11580156109de573d6000803e3d6000fd5b5050505083811415610a5e57600480546040516308345fbf60e01b81526001600160a01b03909116916308345fbf91610a22918c918c918c9160018d019101611efb565b600060405180830381600087803b158015610a3c57600080fd5b505af1158015610a50573d6000803e3d6000fd5b505050506001915050610a64565b60009150505b9695505050505050565b6000610a7a8383610e65565b6040516301ffc9a760e01b81529091506001600160a01b038716906301ffc9a790610ab090632dde656160e21b90600401611f81565b60206040518083038186803b158015610ac857600080fd5b505afa158015610adc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b009190810190611b41565b15610cc55760405163b9c4d9fb60e01b815286906060906001600160a01b0383169063b9c4d9fb90610b36908a9060040161207e565b60006040518083038186803b158015610b4e57600080fd5b505afa158015610b62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b8a9190810190611ad7565b90506060826001600160a01b0316630ebd4c7f896040518263ffffffff1660e01b8152600401610bba919061207e565b60006040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c0e9190810190611b0c565b90508151815114610c1e57600080fd5b60005b8151811015610cc057600080610c6287610c5d612710610523888881518110610c4657fe5b60200260200101518e61082490919063ffffffff16565b610f07565b91509150819650848381518110610c7557fe5b60200260200101516001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610cb5573d6000803e3d6000fd5b505050600101610c21565b505050505b6040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015610cfb573d6000803e3d6000fd5b50505050505050565b606061081960405180604001604052806009815260200168017103b30b63ab29d160bd1b815250610d3486610f2b565b610d418a8a8a8989610fee565b919063ffffffff6110e416565b600060608590506060610dc76040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a000000000000815250610d9a8451610f2b565b60408051600080825260208201818152828401828152606084019283526080840190945288939091611238565b90506001818051906020012087878760405160008152602001604052604051610df39493929190611f59565b6020604051602081039080840390855afa158015610e15573d6000803e3d6000fd5b50505060206040510351925050505b949350505050565b60008183610e4d5760405162461bcd60e51b81526004016102289190611ffd565b506000838581610e5957fe5b049150505b9392505050565b60008080610e8385610c5d612710610523838963ffffffff61082416565b915091506000610ea46127106105236001548961082490919063ffffffff16565b90506000610eb8828463ffffffff6108a916565b90508015610efc576002546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610efa573d6000803e3d6000fd5b505b509195945050505050565b60008082841115610f1d57505080820381610f24565b5060009050825b9250929050565b606081610f5057506040805180820190915260018152600360fc1b6020820152610fe9565b8160005b8115610f6857600101600a82049150610f54565b6060816040519080825280601f01601f191660200182016040528015610f95576020820181803883390190505b50905060001982015b8515610fe357600a860660300160f81b82828060019003935081518110610fc157fe5b60200101906001600160f81b031916908160001a905350600a86049550610f9e565b50925050505b919050565b60608061108e611006886001600160a01b03166114de565b6040518060400160405280600b81526020016a017103a37b5b2b724b21d160ad1b81525061103389610f2b565b6040518060400160405280600981526020016801710383934b1b29d160bd1b81525061105e8a610f2b565b60405180604001604052806009815260200168017103737b731b29d160bd1b8152506110898a610f2b565b611651565b905083156110d8576110d060405180604001604052806007815260200166017103332b29d160cd1b8152506110c286610f2b565b83919063ffffffff6110e416565b9150506110db565b90505b95945050505050565b60608084905060608490506060849050606081518351855101016040519080825280601f01601f191660200182016040528015611128576020820181803883390190505b5090506000805b85518110156111805785818151811061114457fe5b602001015160f81c60f81b83838060010194508151811061116157fe5b60200101906001600160f81b031916908160001a90535060010161112f565b5060005b84518110156111d55784818151811061119957fe5b602001015160f81c60f81b8383806001019450815181106111b657fe5b60200101906001600160f81b031916908160001a905350600101611184565b5060005b835181101561122a578381815181106111ee57fe5b602001015160f81c60f81b83838060010194508151811061120b57fe5b60200101906001600160f81b031916908160001a9053506001016111d9565b509098975050505050505050565b60608082518451865188518a518c518e510101010101016040519080825280601f01601f191660200182016040528015611279576020820181803883390190505b5090506000805b8a518110156112d1578a818151811061129557fe5b602001015160f81c60f81b8383806001019450815181106112b257fe5b60200101906001600160f81b031916908160001a905350600101611280565b5060005b8951811015611326578981815181106112ea57fe5b602001015160f81c60f81b83838060010194508151811061130757fe5b60200101906001600160f81b031916908160001a9053506001016112d5565b5060005b885181101561137b5788818151811061133f57fe5b602001015160f81c60f81b83838060010194508151811061135c57fe5b60200101906001600160f81b031916908160001a90535060010161132a565b5060005b87518110156113d05787818151811061139457fe5b602001015160f81c60f81b8383806001019450815181106113b157fe5b60200101906001600160f81b031916908160001a90535060010161137f565b5060005b8651811015611425578681815181106113e957fe5b602001015160f81c60f81b83838060010194508151811061140657fe5b60200101906001600160f81b031916908160001a9053506001016113d4565b5060005b855181101561147a5785818151811061143e57fe5b602001015160f81c60f81b83838060010194508151811061145b57fe5b60200101906001600160f81b031916908160001a905350600101611429565b5060005b84518110156114cf5784818151811061149357fe5b602001015160f81c60f81b8383806001019450815181106114b057fe5b60200101906001600160f81b031916908160001a90535060010161147e565b50909998505050505050505050565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151602a80825260608281019094526001600160a01b03851692918491602082018180388339019050509050600360fc1b8160008151811061154257fe5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061156b57fe5b60200101906001600160f81b031916908160001a90535060005b6014811015610fe3578260048583600c01602081106115a057fe5b1a60f81b6001600160f81b031916901c60f81c60ff16815181106115c057fe5b602001015160f81c60f81b8282600202600201815181106115dd57fe5b60200101906001600160f81b031916908160001a905350828482600c016020811061160457fe5b825191901a600f1690811061161557fe5b602001015160f81c60f81b82826002026003018151811061163257fe5b60200101906001600160f81b031916908160001a905350600101611585565b60608082518451865188518a518c518e510101010101016040519080825280601f01601f191660200182016040528015611692576020820181803883390190505b5090506000805b8a518110156116ea578a81815181106116ae57fe5b602001015160f81c60f81b8383806001019450815181106116cb57fe5b60200101906001600160f81b031916908160001a905350600101611699565b5060005b895181101561173f5789818151811061170357fe5b602001015160f81c60f81b83838060010194508151811061172057fe5b60200101906001600160f81b031916908160001a9053506001016116ee565b5060005b88518110156117945788818151811061175857fe5b602001015160f81c60f81b83838060010194508151811061177557fe5b60200101906001600160f81b031916908160001a905350600101611743565b5060005b87518110156117e9578781815181106117ad57fe5b602001015160f81c60f81b8383806001019450815181106117ca57fe5b60200101906001600160f81b031916908160001a905350600101611798565b5060005b865181101561183e5786818151811061180257fe5b602001015160f81c60f81b83838060010194508151811061181f57fe5b60200101906001600160f81b031916908160001a9053506001016117ed565b5060005b85518110156118935785818151811061185757fe5b602001015160f81c60f81b83838060010194508151811061187457fe5b60200101906001600160f81b031916908160001a905350600101611842565b5060005b84518110156114cf578481815181106118ac57fe5b602001015160f81c60f81b8383806001019450815181106118c957fe5b60200101906001600160f81b031916908160001a905350600101611897565b803561086181612163565b805161086181612163565b600082601f83011261190f57600080fd5b815161192261191d826120b3565b61208c565b9150818183526020840193506020810190508385602084028201111561194757600080fd5b60005b83811015611973578161195d88826118f3565b845250602092830192919091019060010161194a565b5050505092915050565b600082601f83011261198e57600080fd5b815161199c61191d826120b3565b915081818352602084019350602081019050838560208402820111156119c157600080fd5b60005b8381101561197357816119d78882611a69565b84525060209283019291909101906001016119c4565b805161086181612177565b803561086181612180565b803561086181612189565b600060608284031215611a2057600080fd5b611a2a606061208c565b90506000611a388484611a74565b8252506020611a49848483016119f8565b6020830152506040611a5d848285016119f8565b60408301525092915050565b805161086181612180565b803561086181612192565b600060208284031215611a9157600080fd5b6000610e2484846118e8565b60008060408385031215611ab057600080fd5b6000611abc85856118e8565b9250506020611acd858286016119f8565b9150509250929050565b600060208284031215611ae957600080fd5b815167ffffffffffffffff811115611b0057600080fd5b610e24848285016118fe565b600060208284031215611b1e57600080fd5b815167ffffffffffffffff811115611b3557600080fd5b610e248482850161197d565b600060208284031215611b5357600080fd5b6000610e2484846119ed565b600080600080600080600080610140898b031215611b7c57600080fd5b6000611b888b8b611a03565b9850506020611b998b828c016119f8565b9750506040611baa8b828c016118e8565b9650506060611bbb8b828c016119f8565b9550506080611bcc8b828c016119f8565b94505060a0611bdd8b828c016119f8565b93505060c0611bee8b828c016119f8565b92505060e0611bff8b828c01611a0e565b9150509295985092959890939650565b600060208284031215611c2157600080fd5b6000610e2484846119f8565b600060208284031215611c3f57600080fd5b6000610e248484611a69565b611c548161211e565b82525050565b611c54816120e1565b611c54816120ec565b611c54816120f1565b611c54816120f4565b6000611c89826120d4565b611c9381856120d8565b9350611ca3818560208601612129565b611cac81612159565b9093019392505050565b611c5481612101565b6000611ccc602d836120d8565b7f6d61782062757965722070657263656e746167652063616e2774206265206d6f81526c07265207468616e20313030303609c1b602082015260400192915050565b6000611d1b6026836120d8565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b6000611d63601b836120d8565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000611d9c6013836120d8565b72696e636f7272656374207369676e617475726560681b815260200192915050565b6000611dcb6021836120d8565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000611e0e6020836120d8565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000611e476016836120d8565b751b5cd9cb9d985b1d59481a5cc81a5b98dbdc9c9958dd60521b815260200192915050565b611c5481612118565b602081016108618284611c5a565b60408101611e918285611c4b565b610e5e6020830184611c6c565b60808101611eac8287611c4b565b611eb96020830186611c6c565b611ec66040830185611c4b565b6110db6060830184611c6c565b60608101611ee18286611c5a565b611eee6020830185611c6c565b610e246040830184611c4b565b60808101611eac8287611c5a565b60a08101611f178288611c5a565b611f246020830187611c6c565b611f316040830186611c4b565b611f3e6060830185611c6c565b610a646080830184611c6c565b602081016108618284611c63565b60808101611f678287611c6c565b611f746020830186611e6c565b611ec66040830185611c6c565b602081016108618284611c75565b602081016108618284611cb6565b60c08101611fab8289611cb6565b611fb86020830188611c4b565b611fc56040830187611c4b565b611fd26060830186611c6c565b611fdf6080830185611c6c565b81810360a0830152611ff18184611c7e565b98975050505050505050565b6020808252810161085e8184611c7e565b6020808252810161086181611cbf565b6020808252810161086181611d0e565b6020808252810161086181611d56565b6020808252810161086181611d8f565b6020808252810161086181611dbe565b6020808252810161086181611e01565b6020808252810161086181611e3a565b602081016108618284611c6c565b60405181810167ffffffffffffffff811182821017156120ab57600080fd5b604052919050565b600067ffffffffffffffff8211156120ca57600080fd5b5060209081020190565b5190565b90815260200190565b60006108618261210c565b151590565b90565b6001600160e01b03191690565b6000610861826120e1565b6001600160a01b031690565b60ff1690565b600061086182612101565b60005b8381101561214457818101518382015260200161212c565b83811115612153576000848401525b50505050565b601f01601f191690565b61216c816120e1565b811461049157600080fd5b61216c816120ec565b61216c816120f1565b61216c81612101565b61216c8161211856fea365627a7a723158209513d9c1c1bc9c0c40535656012bc96d316d03c56f1e3fc3588561fc265adccb6c6578706572696d656e74616cf564736f6c63430005100040000000000000000000000000ba56193fb0c408e9c230f98ad58a9ebccdbd168200000000000000000000000036163f6d7c0b1e5b8a5e3e2f678bdb1c25d33edc000000000000000000000000e8637989dfe98c60e26b49b62913ba776ef6ceb7
Deployed Bytecode
0x6080604052600436106100a75760003560e01c80638da5cb5b116100645780638da5cb5b146101675780638f32d59b1461017c57806398590ef91461019e578063f2fde38b146101b1578063fa7da19d146101d1578063fd453a85146101f1576100a7565b80631c31f710146100ac57806338af3eed146100ce57806341a259a6146100f95780635de6c42f1461011b5780636e667db31461013d578063715018a614610152575b600080fd5b3480156100b857600080fd5b506100cc6100c7366004611a7f565b610204565b005b3480156100da57600080fd5b506100e3610253565b6040516100f09190611e75565b60405180910390f35b34801561010557600080fd5b5061010e610262565b6040516100f09190611f8f565b34801561012757600080fd5b50610130610271565b6040516100f0919061207e565b34801561014957600080fd5b5061010e610277565b34801561015e57600080fd5b506100cc610286565b34801561017357600080fd5b506100e36102f4565b34801561018857600080fd5b50610191610303565b6040516100f09190611f4b565b6100cc6101ac366004611a9d565b610327565b3480156101bd57600080fd5b506100cc6101cc366004611a7f565b610464565b3480156101dd57600080fd5b506100cc6101ec366004611c0f565b610494565b6100cc6101ff366004611b5f565b6104df565b61020c610303565b6102315760405162461bcd60e51b81526004016102289061205e565b60405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6004546001600160a01b031681565b60015481565b6003546001600160a01b031681565b61028e610303565b6102aa5760405162461bcd60e51b81526004016102289061205e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b600080546001600160a01b03166103186106ae565b6001600160a01b031614905090565b6004805460405163250adb3160e11b81526000926001600160a01b0390921691634a15b6629161035d9187918791339101611ed3565b60206040518083038186803b15801561037557600080fd5b505afa158015610389573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103ad9190810190611c2d565b600480546040516308345fbf60e01b81529293506001600160a01b0316916308345fbf916103e691879187913391600189019101611efb565b600060405180830381600087803b15801561040057600080fd5b505af1158015610414573d6000803e3d6000fd5b5050505081836001600160a01b03167f1910cc041d39d8d4ddb31ea5990a0b170e2b585057bfac4853f3c2929b276ee23384600101604051610457929190611e83565b60405180910390a3505050565b61046c610303565b6104885760405162461bcd60e51b81526004016102289061205e565b610491816106b2565b50565b61049c610303565b6104b85760405162461bcd60e51b81526004016102289061205e565b6127108111156104da5760405162461bcd60e51b81526004016102289061200e565b600155565b60006104f089898989888888610733565b90506000610504858763ffffffff61082416565b9050600061052f6127106105236001548561082490919063ffffffff16565b9063ffffffff61086716565b905034610542838363ffffffff6108a916565b1461055f5760405162461bcd60e51b81526004016102289061206e565b600061056f8c8c8c878d8d6108ce565b9050600360009054906101000a90046001600160a01b03166001600160a01b0316639c1c2ee98d8c338f8d604051806020016040528060008152506040518763ffffffff1660e01b81526004016105cb96959493929190611f9d565b600060405180830381600087803b1580156105e557600080fd5b505af11580156105f9573d6000803e3d6000fd5b5050505061060a8c8c8c868a610a6e565b8a8c6001600160a01b03167f710791c544fdcb0c8c5b17f5bfa5b6721dfff68224047778e2d64e426ded61c68c8a338d60405161064a9493929190611e9e565b60405180910390a380156106a0578a8c6001600160a01b03167f1910cc041d39d8d4ddb31ea5990a0b170e2b585057bfac4853f3c2929b276ee28c87600101604051610697929190611e83565b60405180910390a35b505050505050505050505050565b3390565b6001600160a01b0381166106d85760405162461bcd60e51b81526004016102289061201e565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6004805460405163250adb3160e11b81526000926001600160a01b0390921691634a15b66291610769918c918c918c9101611ed3565b60206040518083038186803b15801561078157600080fd5b505afa158015610795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107b99190810190611c2d565b9050856001600160a01b03166107f38360000151846020015185604001516107e58d8d8b8d8c8b610d04565b92919063ffffffff610d4e16565b6001600160a01b0316146108195760405162461bcd60e51b81526004016102289061203e565b979650505050505050565b60008261083357506000610861565b8282028284828161084057fe5b041461085e5760405162461bcd60e51b81526004016102289061204e565b90505b92915050565b600061085e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610e2c565b60008282018381101561085e5760405162461bcd60e51b81526004016102289061202e565b60048054604051637ad2ec8560e01b8152600092839261096a9286926001600160a01b0390921691637ad2ec859161090e918e918e918e918e9101611efb565b60206040518083038186803b15801561092657600080fd5b505afa15801561093a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061095e9190810190611c2d565b9063ffffffff6108a916565b90508381111561097957600080fd5b60048054604051634bd49ccb60e01b81526001600160a01b0390911691634bd49ccb916109b0918c918c918c918c91899101611f09565b600060405180830381600087803b1580156109ca57600080fd5b505af11580156109de573d6000803e3d6000fd5b5050505083811415610a5e57600480546040516308345fbf60e01b81526001600160a01b03909116916308345fbf91610a22918c918c918c9160018d019101611efb565b600060405180830381600087803b158015610a3c57600080fd5b505af1158015610a50573d6000803e3d6000fd5b505050506001915050610a64565b60009150505b9695505050505050565b6000610a7a8383610e65565b6040516301ffc9a760e01b81529091506001600160a01b038716906301ffc9a790610ab090632dde656160e21b90600401611f81565b60206040518083038186803b158015610ac857600080fd5b505afa158015610adc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b009190810190611b41565b15610cc55760405163b9c4d9fb60e01b815286906060906001600160a01b0383169063b9c4d9fb90610b36908a9060040161207e565b60006040518083038186803b158015610b4e57600080fd5b505afa158015610b62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b8a9190810190611ad7565b90506060826001600160a01b0316630ebd4c7f896040518263ffffffff1660e01b8152600401610bba919061207e565b60006040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c0e9190810190611b0c565b90508151815114610c1e57600080fd5b60005b8151811015610cc057600080610c6287610c5d612710610523888881518110610c4657fe5b60200260200101518e61082490919063ffffffff16565b610f07565b91509150819650848381518110610c7557fe5b60200260200101516001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610cb5573d6000803e3d6000fd5b505050600101610c21565b505050505b6040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015610cfb573d6000803e3d6000fd5b50505050505050565b606061081960405180604001604052806009815260200168017103b30b63ab29d160bd1b815250610d3486610f2b565b610d418a8a8a8989610fee565b919063ffffffff6110e416565b600060608590506060610dc76040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a000000000000815250610d9a8451610f2b565b60408051600080825260208201818152828401828152606084019283526080840190945288939091611238565b90506001818051906020012087878760405160008152602001604052604051610df39493929190611f59565b6020604051602081039080840390855afa158015610e15573d6000803e3d6000fd5b50505060206040510351925050505b949350505050565b60008183610e4d5760405162461bcd60e51b81526004016102289190611ffd565b506000838581610e5957fe5b049150505b9392505050565b60008080610e8385610c5d612710610523838963ffffffff61082416565b915091506000610ea46127106105236001548961082490919063ffffffff16565b90506000610eb8828463ffffffff6108a916565b90508015610efc576002546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610efa573d6000803e3d6000fd5b505b509195945050505050565b60008082841115610f1d57505080820381610f24565b5060009050825b9250929050565b606081610f5057506040805180820190915260018152600360fc1b6020820152610fe9565b8160005b8115610f6857600101600a82049150610f54565b6060816040519080825280601f01601f191660200182016040528015610f95576020820181803883390190505b50905060001982015b8515610fe357600a860660300160f81b82828060019003935081518110610fc157fe5b60200101906001600160f81b031916908160001a905350600a86049550610f9e565b50925050505b919050565b60608061108e611006886001600160a01b03166114de565b6040518060400160405280600b81526020016a017103a37b5b2b724b21d160ad1b81525061103389610f2b565b6040518060400160405280600981526020016801710383934b1b29d160bd1b81525061105e8a610f2b565b60405180604001604052806009815260200168017103737b731b29d160bd1b8152506110898a610f2b565b611651565b905083156110d8576110d060405180604001604052806007815260200166017103332b29d160cd1b8152506110c286610f2b565b83919063ffffffff6110e416565b9150506110db565b90505b95945050505050565b60608084905060608490506060849050606081518351855101016040519080825280601f01601f191660200182016040528015611128576020820181803883390190505b5090506000805b85518110156111805785818151811061114457fe5b602001015160f81c60f81b83838060010194508151811061116157fe5b60200101906001600160f81b031916908160001a90535060010161112f565b5060005b84518110156111d55784818151811061119957fe5b602001015160f81c60f81b8383806001019450815181106111b657fe5b60200101906001600160f81b031916908160001a905350600101611184565b5060005b835181101561122a578381815181106111ee57fe5b602001015160f81c60f81b83838060010194508151811061120b57fe5b60200101906001600160f81b031916908160001a9053506001016111d9565b509098975050505050505050565b60608082518451865188518a518c518e510101010101016040519080825280601f01601f191660200182016040528015611279576020820181803883390190505b5090506000805b8a518110156112d1578a818151811061129557fe5b602001015160f81c60f81b8383806001019450815181106112b257fe5b60200101906001600160f81b031916908160001a905350600101611280565b5060005b8951811015611326578981815181106112ea57fe5b602001015160f81c60f81b83838060010194508151811061130757fe5b60200101906001600160f81b031916908160001a9053506001016112d5565b5060005b885181101561137b5788818151811061133f57fe5b602001015160f81c60f81b83838060010194508151811061135c57fe5b60200101906001600160f81b031916908160001a90535060010161132a565b5060005b87518110156113d05787818151811061139457fe5b602001015160f81c60f81b8383806001019450815181106113b157fe5b60200101906001600160f81b031916908160001a90535060010161137f565b5060005b8651811015611425578681815181106113e957fe5b602001015160f81c60f81b83838060010194508151811061140657fe5b60200101906001600160f81b031916908160001a9053506001016113d4565b5060005b855181101561147a5785818151811061143e57fe5b602001015160f81c60f81b83838060010194508151811061145b57fe5b60200101906001600160f81b031916908160001a905350600101611429565b5060005b84518110156114cf5784818151811061149357fe5b602001015160f81c60f81b8383806001019450815181106114b057fe5b60200101906001600160f81b031916908160001a90535060010161147e565b50909998505050505050505050565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151602a80825260608281019094526001600160a01b03851692918491602082018180388339019050509050600360fc1b8160008151811061154257fe5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061156b57fe5b60200101906001600160f81b031916908160001a90535060005b6014811015610fe3578260048583600c01602081106115a057fe5b1a60f81b6001600160f81b031916901c60f81c60ff16815181106115c057fe5b602001015160f81c60f81b8282600202600201815181106115dd57fe5b60200101906001600160f81b031916908160001a905350828482600c016020811061160457fe5b825191901a600f1690811061161557fe5b602001015160f81c60f81b82826002026003018151811061163257fe5b60200101906001600160f81b031916908160001a905350600101611585565b60608082518451865188518a518c518e510101010101016040519080825280601f01601f191660200182016040528015611692576020820181803883390190505b5090506000805b8a518110156116ea578a81815181106116ae57fe5b602001015160f81c60f81b8383806001019450815181106116cb57fe5b60200101906001600160f81b031916908160001a905350600101611699565b5060005b895181101561173f5789818151811061170357fe5b602001015160f81c60f81b83838060010194508151811061172057fe5b60200101906001600160f81b031916908160001a9053506001016116ee565b5060005b88518110156117945788818151811061175857fe5b602001015160f81c60f81b83838060010194508151811061177557fe5b60200101906001600160f81b031916908160001a905350600101611743565b5060005b87518110156117e9578781815181106117ad57fe5b602001015160f81c60f81b8383806001019450815181106117ca57fe5b60200101906001600160f81b031916908160001a905350600101611798565b5060005b865181101561183e5786818151811061180257fe5b602001015160f81c60f81b83838060010194508151811061181f57fe5b60200101906001600160f81b031916908160001a9053506001016117ed565b5060005b85518110156118935785818151811061185757fe5b602001015160f81c60f81b83838060010194508151811061187457fe5b60200101906001600160f81b031916908160001a905350600101611842565b5060005b84518110156114cf578481815181106118ac57fe5b602001015160f81c60f81b8383806001019450815181106118c957fe5b60200101906001600160f81b031916908160001a905350600101611897565b803561086181612163565b805161086181612163565b600082601f83011261190f57600080fd5b815161192261191d826120b3565b61208c565b9150818183526020840193506020810190508385602084028201111561194757600080fd5b60005b83811015611973578161195d88826118f3565b845250602092830192919091019060010161194a565b5050505092915050565b600082601f83011261198e57600080fd5b815161199c61191d826120b3565b915081818352602084019350602081019050838560208402820111156119c157600080fd5b60005b8381101561197357816119d78882611a69565b84525060209283019291909101906001016119c4565b805161086181612177565b803561086181612180565b803561086181612189565b600060608284031215611a2057600080fd5b611a2a606061208c565b90506000611a388484611a74565b8252506020611a49848483016119f8565b6020830152506040611a5d848285016119f8565b60408301525092915050565b805161086181612180565b803561086181612192565b600060208284031215611a9157600080fd5b6000610e2484846118e8565b60008060408385031215611ab057600080fd5b6000611abc85856118e8565b9250506020611acd858286016119f8565b9150509250929050565b600060208284031215611ae957600080fd5b815167ffffffffffffffff811115611b0057600080fd5b610e24848285016118fe565b600060208284031215611b1e57600080fd5b815167ffffffffffffffff811115611b3557600080fd5b610e248482850161197d565b600060208284031215611b5357600080fd5b6000610e2484846119ed565b600080600080600080600080610140898b031215611b7c57600080fd5b6000611b888b8b611a03565b9850506020611b998b828c016119f8565b9750506040611baa8b828c016118e8565b9650506060611bbb8b828c016119f8565b9550506080611bcc8b828c016119f8565b94505060a0611bdd8b828c016119f8565b93505060c0611bee8b828c016119f8565b92505060e0611bff8b828c01611a0e565b9150509295985092959890939650565b600060208284031215611c2157600080fd5b6000610e2484846119f8565b600060208284031215611c3f57600080fd5b6000610e248484611a69565b611c548161211e565b82525050565b611c54816120e1565b611c54816120ec565b611c54816120f1565b611c54816120f4565b6000611c89826120d4565b611c9381856120d8565b9350611ca3818560208601612129565b611cac81612159565b9093019392505050565b611c5481612101565b6000611ccc602d836120d8565b7f6d61782062757965722070657263656e746167652063616e2774206265206d6f81526c07265207468616e20313030303609c1b602082015260400192915050565b6000611d1b6026836120d8565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b6000611d63601b836120d8565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000611d9c6013836120d8565b72696e636f7272656374207369676e617475726560681b815260200192915050565b6000611dcb6021836120d8565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000611e0e6020836120d8565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000611e476016836120d8565b751b5cd9cb9d985b1d59481a5cc81a5b98dbdc9c9958dd60521b815260200192915050565b611c5481612118565b602081016108618284611c5a565b60408101611e918285611c4b565b610e5e6020830184611c6c565b60808101611eac8287611c4b565b611eb96020830186611c6c565b611ec66040830185611c4b565b6110db6060830184611c6c565b60608101611ee18286611c5a565b611eee6020830185611c6c565b610e246040830184611c4b565b60808101611eac8287611c5a565b60a08101611f178288611c5a565b611f246020830187611c6c565b611f316040830186611c4b565b611f3e6060830185611c6c565b610a646080830184611c6c565b602081016108618284611c63565b60808101611f678287611c6c565b611f746020830186611e6c565b611ec66040830185611c6c565b602081016108618284611c75565b602081016108618284611cb6565b60c08101611fab8289611cb6565b611fb86020830188611c4b565b611fc56040830187611c4b565b611fd26060830186611c6c565b611fdf6080830185611c6c565b81810360a0830152611ff18184611c7e565b98975050505050505050565b6020808252810161085e8184611c7e565b6020808252810161086181611cbf565b6020808252810161086181611d0e565b6020808252810161086181611d56565b6020808252810161086181611d8f565b6020808252810161086181611dbe565b6020808252810161086181611e01565b6020808252810161086181611e3a565b602081016108618284611c6c565b60405181810167ffffffffffffffff811182821017156120ab57600080fd5b604052919050565b600067ffffffffffffffff8211156120ca57600080fd5b5060209081020190565b5190565b90815260200190565b60006108618261210c565b151590565b90565b6001600160e01b03191690565b6000610861826120e1565b6001600160a01b031690565b60ff1690565b600061086182612101565b60005b8381101561214457818101518382015260200161212c565b83811115612153576000848401525b50505050565b601f01601f191690565b61216c816120e1565b811461049157600080fd5b61216c816120ec565b61216c816120f1565b61216c81612101565b61216c8161211856fea365627a7a723158209513d9c1c1bc9c0c40535656012bc96d316d03c56f1e3fc3588561fc265adccb6c6578706572696d656e74616cf564736f6c63430005100040
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ba56193fb0c408e9c230f98ad58a9ebccdbd168200000000000000000000000036163f6d7c0b1e5b8a5e3e2f678bdb1c25d33edc000000000000000000000000e8637989dfe98c60e26b49b62913ba776ef6ceb7
-----Decoded View---------------
Arg [0] : _transferProxy (address): 0xba56193fB0C408e9c230f98Ad58A9EbCcdbD1682
Arg [1] : _nonceHolder (address): 0x36163f6D7c0b1E5b8a5e3e2f678BdB1C25D33edc
Arg [2] : beneficiary (address): 0xE8637989dFe98c60E26B49b62913Ba776eF6ceb7
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000ba56193fb0c408e9c230f98ad58a9ebccdbd1682
Arg [1] : 00000000000000000000000036163f6d7c0b1e5b8a5e3e2f678bdb1c25d33edc
Arg [2] : 000000000000000000000000e8637989dfe98c60e26b49b62913ba776ef6ceb7
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.