More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 190,488 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Exchange | 20610521 | 149 days ago | IN | 0.00000205 ETH | 0.00013316 | ||||
Exchange | 20610521 | 149 days ago | IN | 0 ETH | 0.00010573 | ||||
Cancel | 20453317 | 171 days ago | IN | 0 ETH | 0.00004378 | ||||
Cancel | 20453269 | 171 days ago | IN | 0 ETH | 0.00006368 | ||||
Exchange | 20453142 | 171 days ago | IN | 0.0000001 ETH | 0.00015648 | ||||
Exchange | 20453008 | 171 days ago | IN | 0 ETH | 0.00017617 | ||||
Cancel | 20452838 | 171 days ago | IN | 0 ETH | 0.00005756 | ||||
Exchange | 20451879 | 171 days ago | IN | 0.00000102 ETH | 0.00013312 | ||||
Exchange | 20408671 | 177 days ago | IN | 0.001025 ETH | 0.00015644 | ||||
Exchange | 20408666 | 177 days ago | IN | 0 ETH | 0.0005 | ||||
Exchange | 20408666 | 177 days ago | IN | 0.00007687 ETH | 0.0001 | ||||
Exchange | 20408357 | 177 days ago | IN | 0 ETH | 0.00017617 | ||||
Exchange | 20408316 | 177 days ago | IN | 0.007175 ETH | 0.00015645 | ||||
Exchange | 20408173 | 177 days ago | IN | 0 ETH | 0.00013345 | ||||
Exchange | 20408173 | 177 days ago | IN | 0 ETH | 0.00013348 | ||||
Cancel | 20402514 | 178 days ago | IN | 0 ETH | 0.00004376 | ||||
Exchange | 20395687 | 179 days ago | IN | 0.00087125 ETH | 0.00013316 | ||||
Exchange | 20395563 | 179 days ago | IN | 0.00000011 ETH | 0.00013315 | ||||
Cancel | 20395525 | 179 days ago | IN | 0 ETH | 0.00004376 | ||||
Cancel | 20395525 | 179 days ago | IN | 0 ETH | 0.00004376 | ||||
Exchange | 20394286 | 179 days ago | IN | 0.01025 ETH | 0.00013307 | ||||
Cancel | 20394045 | 179 days ago | IN | 0 ETH | 0.00234975 | ||||
Cancel | 20394045 | 179 days ago | IN | 0 ETH | 0.00472242 | ||||
Exchange | 20393888 | 179 days ago | IN | 0 ETH | 0.01152491 | ||||
Exchange | 20393888 | 179 days ago | IN | 0 ETH | 0.00017616 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
12699349 | 1307 days ago | 0.06 ETH | ||||
12699349 | 1307 days ago | 0.02 ETH | ||||
12699089 | 1307 days ago | 0.06 ETH | ||||
12699089 | 1307 days ago | 0.02 ETH | ||||
12699088 | 1307 days ago | 0.06 ETH | ||||
12699088 | 1307 days ago | 0.02 ETH | ||||
12699088 | 1307 days ago | 0.06 ETH | ||||
12699088 | 1307 days ago | 0.02 ETH | ||||
12696932 | 1307 days ago | 0.0175 ETH | ||||
12696932 | 1307 days ago | 0.002 ETH | ||||
12696932 | 1307 days ago | 0.001 ETH | ||||
12696855 | 1307 days ago | 0.42 ETH | ||||
12696855 | 1307 days ago | 0.048 ETH | ||||
12696855 | 1307 days ago | 0.024 ETH | ||||
12696848 | 1307 days ago | 0.0000475 ETH | ||||
12696848 | 1307 days ago | 0.00005 ETH | ||||
12696848 | 1307 days ago | 0.000005 ETH | ||||
12696836 | 1307 days ago | 0.0000475 ETH | ||||
12696836 | 1307 days ago | 0.00005 ETH | ||||
12696836 | 1307 days ago | 0.000005 ETH | ||||
12696826 | 1307 days ago | 0.00013125 ETH | ||||
12696826 | 1307 days ago | 0.000015 ETH | ||||
12696826 | 1307 days ago | 0.0000075 ETH | ||||
12696818 | 1307 days ago | 0.00070875 ETH | ||||
12696818 | 1307 days ago | 0.000081 ETH |
Loading...
Loading
Contract Name:
ExchangeV1
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-17 */ pragma solidity ^0.5.0; pragma experimental ABIEncoderV2; /** * @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 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); } /** * @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; } /* * @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; } } /** * @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); } } /** * @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; } } contract OwnableOperatorRole is Ownable, OperatorRole { function addOperator(address account) external onlyOwner { _addOperator(account); } function removeOperator(address account) external onlyOwner { _removeOperator(account); } } /** @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); } 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 TransferProxyForDeprecated is OwnableOperatorRole { function erc721TransferFrom(IERC721 token, address from, address to, uint256 tokenId) external onlyOperator { token.transferFrom(from, to, tokenId); } } /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool); /** * @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); } contract ERC20TransferProxy is OwnableOperatorRole { function erc20safeTransferFrom(IERC20 token, address from, address to, uint256 value) external onlyOperator { require(token.transferFrom(from, to, value), "failure while transferring"); } } library UintLibrary { using SafeMath for uint; 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); } function bp(uint value, uint bpValue) internal pure returns (uint) { return value.mul(bpValue).div(10000); } } 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 BytesLibrary { function toString(bytes32 value) internal pure returns (string memory) { bytes memory alphabet = "0123456789abcdef"; bytes memory str = new bytes(64); for (uint256 i = 0; i < 32; i++) { str[i*2] = alphabet[uint8(value[i] >> 4)]; str[1+i*2] = alphabet[uint8(value[i] & 0x0f)]; } return string(str); } } contract ExchangeDomainV1 { enum AssetType {ETH, ERC20, ERC1155, ERC721, ERC721Deprecated} struct Asset { address token; uint tokenId; AssetType assetType; } struct OrderKey { /* who signed the order */ address owner; /* random number */ uint salt; /* what has owner */ Asset sellAsset; /* what wants owner */ Asset buyAsset; } struct Order { OrderKey key; /* how much has owner (in wei, or UINT256_MAX if ERC-721) */ uint selling; /* how much wants owner (in wei, or UINT256_MAX if ERC-721) */ uint buying; /* fee for selling */ uint sellerFee; } /* An ECDSA signature. */ struct Sig { /* v parameter */ uint8 v; /* r parameter */ bytes32 r; /* s parameter */ bytes32 s; } } contract ExchangeStateV1 is OwnableOperatorRole { // keccak256(OrderKey) => completed mapping(bytes32 => uint256) public completed; function getCompleted(ExchangeDomainV1.OrderKey calldata key) view external returns (uint256) { return completed[getCompletedKey(key)]; } function setCompleted(ExchangeDomainV1.OrderKey calldata key, uint256 newCompleted) external onlyOperator { completed[getCompletedKey(key)] = newCompleted; } function getCompletedKey(ExchangeDomainV1.OrderKey memory key) pure public returns (bytes32) { return keccak256(abi.encodePacked(key.owner, key.sellAsset.token, key.sellAsset.tokenId, key.buyAsset.token, key.buyAsset.tokenId, key.salt)); } } contract ExchangeOrdersHolderV1 { mapping(bytes32 => OrderParams) internal orders; struct OrderParams { /* how much has owner (in wei, or UINT256_MAX if ERC-721) */ uint selling; /* how much wants owner (in wei, or UINT256_MAX if ERC-721) */ uint buying; /* fee for selling */ uint sellerFee; } function add(ExchangeDomainV1.Order calldata order) external { require(msg.sender == order.key.owner, "order could be added by owner only"); bytes32 key = prepareKey(order); orders[key] = OrderParams(order.selling, order.buying, order.sellerFee); } function exists(ExchangeDomainV1.Order calldata order) external view returns (bool) { bytes32 key = prepareKey(order); OrderParams memory params = orders[key]; return params.buying == order.buying && params.selling == order.selling && params.sellerFee == order.sellerFee; } function prepareKey(ExchangeDomainV1.Order memory order) internal pure returns (bytes32) { return keccak256(abi.encode( order.key.sellAsset.token, order.key.sellAsset.tokenId, order.key.owner, order.key.buyAsset.token, order.key.buyAsset.tokenId, order.key.salt )); } } /** * @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) external view returns (address payable[] memory); function getFeeBps(uint256 id) external view returns (uint[] memory); } contract ExchangeV1 is Ownable, ExchangeDomainV1 { using SafeMath for uint; using UintLibrary for uint; using StringLibrary for string; using BytesLibrary for bytes32; enum FeeSide {NONE, SELL, BUY} event Buy( address indexed sellToken, uint256 indexed sellTokenId, uint256 sellValue, address owner, address buyToken, uint256 buyTokenId, uint256 buyValue, address buyer, uint256 amount, uint256 salt ); event Cancel( address indexed sellToken, uint256 indexed sellTokenId, address owner, address buyToken, uint256 buyTokenId, uint256 salt ); bytes4 private constant _INTERFACE_ID_FEES = 0xb7799584; uint256 private constant UINT256_MAX = 2 ** 256 - 1; address payable public beneficiary; address public buyerFeeSigner; TransferProxy public transferProxy; TransferProxyForDeprecated public transferProxyForDeprecated; ERC20TransferProxy public erc20TransferProxy; ExchangeStateV1 public state; ExchangeOrdersHolderV1 public ordersHolder; constructor( TransferProxy _transferProxy, TransferProxyForDeprecated _transferProxyForDeprecated, ERC20TransferProxy _erc20TransferProxy, ExchangeStateV1 _state, ExchangeOrdersHolderV1 _ordersHolder, address payable _beneficiary, address _buyerFeeSigner ) public { transferProxy = _transferProxy; transferProxyForDeprecated = _transferProxyForDeprecated; erc20TransferProxy = _erc20TransferProxy; state = _state; ordersHolder = _ordersHolder; beneficiary = _beneficiary; buyerFeeSigner = _buyerFeeSigner; } function setBeneficiary(address payable newBeneficiary) external onlyOwner { beneficiary = newBeneficiary; } function setBuyerFeeSigner(address newBuyerFeeSigner) external onlyOwner { buyerFeeSigner = newBuyerFeeSigner; } function exchange( Order calldata order, Sig calldata sig, uint buyerFee, Sig calldata buyerFeeSig, uint amount, address buyer ) payable external { validateOrderSig(order, sig); validateBuyerFeeSig(order, buyerFee, buyerFeeSig); uint paying = order.buying.mul(amount).div(order.selling); verifyOpenAndModifyOrderState(order.key, order.selling, amount); require(order.key.sellAsset.assetType != AssetType.ETH, "ETH is not supported on sell side"); if (order.key.buyAsset.assetType == AssetType.ETH) { validateEthTransfer(paying, buyerFee); } FeeSide feeSide = getFeeSide(order.key.sellAsset.assetType, order.key.buyAsset.assetType); if (buyer == address(0x0)) { buyer = msg.sender; } transferWithFeesPossibility(order.key.sellAsset, amount, order.key.owner, buyer, feeSide == FeeSide.SELL, buyerFee, order.sellerFee, order.key.buyAsset); transferWithFeesPossibility(order.key.buyAsset, paying, msg.sender, order.key.owner, feeSide == FeeSide.BUY, order.sellerFee, buyerFee, order.key.sellAsset); emitBuy(order, amount, buyer); } function validateEthTransfer(uint value, uint buyerFee) internal view { uint256 buyerFeeValue = value.bp(buyerFee); require(msg.value == value + buyerFeeValue, "msg.value is incorrect"); } function cancel(OrderKey calldata key) external { require(key.owner == msg.sender, "not an owner"); state.setCompleted(key, UINT256_MAX); emit Cancel(key.sellAsset.token, key.sellAsset.tokenId, msg.sender, key.buyAsset.token, key.buyAsset.tokenId, key.salt); } function validateOrderSig( Order memory order, Sig memory sig ) internal view { if (sig.v == 0 && sig.r == bytes32(0x0) && sig.s == bytes32(0x0)) { require(ordersHolder.exists(order), "incorrect signature"); } else { require(prepareMessage(order).recover(sig.v, sig.r, sig.s) == order.key.owner, "incorrect signature"); } } function validateBuyerFeeSig( Order memory order, uint buyerFee, Sig memory sig ) internal view { require(prepareBuyerFeeMessage(order, buyerFee).recover(sig.v, sig.r, sig.s) == buyerFeeSigner, "incorrect buyer fee signature"); } function prepareBuyerFeeMessage(Order memory order, uint fee) public pure returns (string memory) { return keccak256(abi.encode(order, fee)).toString(); } function prepareMessage(Order memory order) public pure returns (string memory) { return keccak256(abi.encode(order)).toString(); } function transferWithFeesPossibility(Asset memory firstType, uint value, address from, address to, bool hasFee, uint256 sellerFee, uint256 buyerFee, Asset memory secondType) internal { if (!hasFee) { transfer(firstType, value, from, to); } else { transferWithFees(firstType, value, from, to, sellerFee, buyerFee, secondType); } } function transfer(Asset memory asset, uint value, address from, address to) internal { if (asset.assetType == AssetType.ETH) { address payable toPayable = address(uint160(to)); toPayable.transfer(value); } else if (asset.assetType == AssetType.ERC20) { require(asset.tokenId == 0, "tokenId should be 0"); erc20TransferProxy.erc20safeTransferFrom(IERC20(asset.token), from, to, value); } else if (asset.assetType == AssetType.ERC721) { require(value == 1, "value should be 1 for ERC-721"); transferProxy.erc721safeTransferFrom(IERC721(asset.token), from, to, asset.tokenId); } else if (asset.assetType == AssetType.ERC721Deprecated) { require(value == 1, "value should be 1 for ERC-721"); transferProxyForDeprecated.erc721TransferFrom(IERC721(asset.token), from, to, asset.tokenId); } else { transferProxy.erc1155safeTransferFrom(IERC1155(asset.token), from, to, asset.tokenId, value, ""); } } function transferWithFees(Asset memory firstType, uint value, address from, address to, uint256 sellerFee, uint256 buyerFee, Asset memory secondType) internal { uint restValue = transferFeeToBeneficiary(firstType, from, value, sellerFee, buyerFee); if ( secondType.assetType == AssetType.ERC1155 && IERC1155(secondType.token).supportsInterface(_INTERFACE_ID_FEES) || (secondType.assetType == AssetType.ERC721 || secondType.assetType == AssetType.ERC721Deprecated) && IERC721(secondType.token).supportsInterface(_INTERFACE_ID_FEES) ) { HasSecondarySaleFees withFees = HasSecondarySaleFees(secondType.token); address payable[] memory recipients = withFees.getFeeRecipients(secondType.tokenId); uint[] memory fees = withFees.getFeeBps(secondType.tokenId); require(fees.length == recipients.length); for (uint256 i = 0; i < fees.length; i++) { (uint newRestValue, uint current) = subFeeInBp(restValue, value, fees[i]); restValue = newRestValue; transfer(firstType, current, from, recipients[i]); } } address payable toPayable = address(uint160(to)); transfer(firstType, restValue, from, toPayable); } function transferFeeToBeneficiary(Asset memory asset, address from, uint total, uint sellerFee, uint buyerFee) internal returns (uint) { (uint restValue, uint sellerFeeValue) = subFeeInBp(total, total, sellerFee); uint buyerFeeValue = total.bp(buyerFee); uint beneficiaryFee = buyerFeeValue.add(sellerFeeValue); if (beneficiaryFee > 0) { transfer(asset, beneficiaryFee, from, beneficiary); } return restValue; } function emitBuy(Order memory order, uint amount, address buyer) internal { emit Buy(order.key.sellAsset.token, order.key.sellAsset.tokenId, order.selling, order.key.owner, order.key.buyAsset.token, order.key.buyAsset.tokenId, order.buying, buyer, amount, order.key.salt ); } function subFeeInBp(uint value, uint total, uint feeInBp) internal pure returns (uint newValue, uint realFee) { return subFee(value, total.bp(feeInBp)); } 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; } } function verifyOpenAndModifyOrderState(OrderKey memory key, uint selling, uint amount) internal { uint completed = state.getCompleted(key); uint newCompleted = completed.add(amount); require(newCompleted <= selling, "not enough stock of order for buying"); state.setCompleted(key, newCompleted); } function getFeeSide(AssetType sellType, AssetType buyType) internal pure returns (FeeSide) { if ((sellType == AssetType.ERC721 || sellType == AssetType.ERC721Deprecated) && (buyType == AssetType.ERC721 || buyType == AssetType.ERC721Deprecated)) { return FeeSide.NONE; } if (uint(sellType) > uint(buyType)) { return FeeSide.BUY; } return FeeSide.SELL; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract TransferProxy","name":"_transferProxy","type":"address"},{"internalType":"contract TransferProxyForDeprecated","name":"_transferProxyForDeprecated","type":"address"},{"internalType":"contract ERC20TransferProxy","name":"_erc20TransferProxy","type":"address"},{"internalType":"contract ExchangeStateV1","name":"_state","type":"address"},{"internalType":"contract ExchangeOrdersHolderV1","name":"_ordersHolder","type":"address"},{"internalType":"address payable","name":"_beneficiary","type":"address"},{"internalType":"address","name":"_buyerFeeSigner","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sellToken","type":"address"},{"indexed":true,"internalType":"uint256","name":"sellTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellValue","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"buyToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"buyTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyValue","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"salt","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sellToken","type":"address"},{"indexed":true,"internalType":"uint256","name":"sellTokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"buyToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"buyTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"salt","type":"uint256"}],"name":"Cancel","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":true,"inputs":[],"name":"buyerFeeSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"enum ExchangeDomainV1.AssetType","name":"assetType","type":"uint8"}],"internalType":"struct ExchangeDomainV1.Asset","name":"sellAsset","type":"tuple"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"enum ExchangeDomainV1.AssetType","name":"assetType","type":"uint8"}],"internalType":"struct ExchangeDomainV1.Asset","name":"buyAsset","type":"tuple"}],"internalType":"struct ExchangeDomainV1.OrderKey","name":"key","type":"tuple"}],"name":"cancel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"erc20TransferProxy","outputs":[{"internalType":"contract ERC20TransferProxy","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"components":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"enum ExchangeDomainV1.AssetType","name":"assetType","type":"uint8"}],"internalType":"struct ExchangeDomainV1.Asset","name":"sellAsset","type":"tuple"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"enum ExchangeDomainV1.AssetType","name":"assetType","type":"uint8"}],"internalType":"struct ExchangeDomainV1.Asset","name":"buyAsset","type":"tuple"}],"internalType":"struct ExchangeDomainV1.OrderKey","name":"key","type":"tuple"},{"internalType":"uint256","name":"selling","type":"uint256"},{"internalType":"uint256","name":"buying","type":"uint256"},{"internalType":"uint256","name":"sellerFee","type":"uint256"}],"internalType":"struct ExchangeDomainV1.Order","name":"order","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ExchangeDomainV1.Sig","name":"sig","type":"tuple"},{"internalType":"uint256","name":"buyerFee","type":"uint256"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ExchangeDomainV1.Sig","name":"buyerFeeSig","type":"tuple"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"buyer","type":"address"}],"name":"exchange","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":"ordersHolder","outputs":[{"internalType":"contract ExchangeOrdersHolderV1","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":true,"inputs":[{"components":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"enum ExchangeDomainV1.AssetType","name":"assetType","type":"uint8"}],"internalType":"struct ExchangeDomainV1.Asset","name":"sellAsset","type":"tuple"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"enum ExchangeDomainV1.AssetType","name":"assetType","type":"uint8"}],"internalType":"struct ExchangeDomainV1.Asset","name":"buyAsset","type":"tuple"}],"internalType":"struct ExchangeDomainV1.OrderKey","name":"key","type":"tuple"},{"internalType":"uint256","name":"selling","type":"uint256"},{"internalType":"uint256","name":"buying","type":"uint256"},{"internalType":"uint256","name":"sellerFee","type":"uint256"}],"internalType":"struct ExchangeDomainV1.Order","name":"order","type":"tuple"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"prepareBuyerFeeMessage","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"components":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"enum ExchangeDomainV1.AssetType","name":"assetType","type":"uint8"}],"internalType":"struct ExchangeDomainV1.Asset","name":"sellAsset","type":"tuple"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"enum ExchangeDomainV1.AssetType","name":"assetType","type":"uint8"}],"internalType":"struct ExchangeDomainV1.Asset","name":"buyAsset","type":"tuple"}],"internalType":"struct ExchangeDomainV1.OrderKey","name":"key","type":"tuple"},{"internalType":"uint256","name":"selling","type":"uint256"},{"internalType":"uint256","name":"buying","type":"uint256"},{"internalType":"uint256","name":"sellerFee","type":"uint256"}],"internalType":"struct ExchangeDomainV1.Order","name":"order","type":"tuple"}],"name":"prepareMessage","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"newBeneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newBuyerFeeSigner","type":"address"}],"name":"setBuyerFeeSigner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"state","outputs":[{"internalType":"contract ExchangeStateV1","name":"","type":"address"}],"payable":false,"stateMutability":"view","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"},{"constant":true,"inputs":[],"name":"transferProxyForDeprecated","outputs":[{"internalType":"contract TransferProxyForDeprecated","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620029d0380380620029d0833981016040819052620000349162000139565b6000620000496001600160e01b036200011516565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600380546001600160a01b03199081166001600160a01b03998a16179091556004805482169789169790971790965560058054871695881695909517909455600680548616938716939093179092556007805485169186169190911790556001805484169185169190911790556002805490921692169190911790556200022f565b3390565b805162000126816200020a565b92915050565b8051620001268162000224565b600080600080600080600060e0888a0312156200015557600080fd5b6000620001638a8a6200012c565b9750506020620001768a828b016200012c565b9650506040620001898a828b016200012c565b95505060606200019c8a828b016200012c565b9450506080620001af8a828b016200012c565b93505060a0620001c28a828b0162000119565b92505060c0620001d58a828b0162000119565b91505092959891949750929550565b60006200012682620001fe565b60006200012682620001e4565b6001600160a01b031690565b6200021581620001e4565b81146200022157600080fd5b50565b6200021581620001f1565b612791806200023f6000396000f3fe6080604052600436106100fe5760003560e01c8063715018a6116100955780639cec6392116100645780639cec63921461026a578063c19d93fb1461027d578063ca120b1f14610292578063f2fde38b146102b2578063fee03e9e146102d2576100fe565b8063715018a6146102095780638da5cb5b1461021e5780638f32d59b146102335780639704dc4414610255576100fe565b806338af3eed116100d157806338af3eed1461019d5780634df97bc5146101bf57806355d5d326146101d45780636e667db3146101f4576100fe565b806302329e1014610103578063049944b61461012e5780631b4c98741461015b5780631c31f7101461017b575b600080fd5b34801561010f57600080fd5b506101186102e7565b60405161012591906123a2565b60405180910390f35b34801561013a57600080fd5b5061014e610149366004611dc6565b6102f6565b6040516101259190612436565b34801561016757600080fd5b5061014e610176366004611de5565b61032f565b34801561018757600080fd5b5061019b610196366004611c11565b610350565b005b3480156101a957600080fd5b506101b261039f565b6040516101259190612328565b3480156101cb57600080fd5b506101b26103ae565b3480156101e057600080fd5b5061019b6101ef366004611c11565b6103bd565b34801561020057600080fd5b50610118610403565b34801561021557600080fd5b5061019b610412565b34801561022a57600080fd5b506101b2610480565b34801561023f57600080fd5b5061024861048f565b604051610125919061236b565b34801561026157600080fd5b506101186104b3565b61019b610278366004611d39565b6104c2565b34801561028957600080fd5b506101186106cd565b34801561029e57600080fd5b5061019b6102ad366004611cfb565b6106dc565b3480156102be57600080fd5b5061019b6102cd366004611c11565b6107ea565b3480156102de57600080fd5b5061011861081a565b6004546001600160a01b031681565b60606103278260405160200161030c9190612542565b60405160208183030381529060405280519060200120610829565b90505b919050565b6060610347838360405160200161030c929190612551565b90505b92915050565b61035861048f565b61037d5760405162461bcd60e51b8152600401610374906124b7565b60405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b6002546001600160a01b031681565b6103c561048f565b6103e15760405162461bcd60e51b8152600401610374906124b7565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031681565b61041a61048f565b6104365760405162461bcd60e51b8152600401610374906124b7565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b600080546001600160a01b03166104a461093c565b6001600160a01b031614905090565b6007546001600160a01b031681565b6104e86104d436889003880188611dc6565b6104e336889003880188611e21565b610940565b61050f6104fa36889003880188611dc6565b8561050a36879003870187611e21565b610a6d565b600061053b61010088013561052f6101208a01358663ffffffff610ac316565b9063ffffffff610afd16565b905061055b61054f36899003890189611d1a565b88610100013585610b3f565b600061056d60a0890160808a01611cbf565b600481111561057857fe5b14156105965760405162461bcd60e51b8152600401610374906124c7565b60006105a9610100890160e08a01611cbf565b60048111156105b457fe5b14156105c4576105c48186610c61565b60006105ef6105d960a08a0160808b01611cbf565b6105ea6101008b0160e08c01611cbf565b610c96565b90506001600160a01b038316610603573392505b610659610618368a90038a0160408b01611cdd565b8561062660208c018c611c11565b86600186600281111561063557fe5b148b8e61014001358f60000160a0018036036106549190810190611cdd565b610d25565b6106aa61066e368a90038a0160a08b01611cdd565b833361067d60208d018d611c11565b600286600281111561068b57fe5b148d61014001358c8f6000016040018036036106549190810190611cdd565b6106c36106bc368a90038a018a611dc6565b8585610d4a565b5050505050505050565b6006546001600160a01b031681565b336106ea6020830183611c11565b6001600160a01b0316146107105760405162461bcd60e51b8152600401610374906124d7565b600654604051631d03b74d60e11b81526001600160a01b0390911690633a076e9a9061074490849060001990600401612507565b600060405180830381600087803b15801561075e57600080fd5b505af1158015610772573d6000803e3d6000fd5b505050606082018035915061078a9060408401611c11565b6001600160a01b03167fbfe0e802e586c99960de1a111c80f598b281996d65080d74dbe29986f55b274a336107c560c0860160a08701611c11565b6040516107df92919060c088013590602089013590612336565b60405180910390a350565b6107f261048f565b61080e5760405162461bcd60e51b8152600401610374906124b7565b61081781610dc9565b50565b6005546001600160a01b031681565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151828152606081810184529283919060208201818038833901905050905060005b60208110156109345782600486836020811061088957fe5b1a60f81b6001600160f81b031916901c60f81c60ff16815181106108a957fe5b602001015160f81c60f81b8282600202815181106108c357fe5b60200101906001600160f81b031916908160001a905350828582602081106108e757fe5b825191901a600f169081106108f857fe5b602001015160f81c60f81b82826002026001018151811061091557fe5b60200101906001600160f81b031916908160001a905350600101610871565b509392505050565b3390565b805160ff1615801561095457506020810151155b801561096257506040810151155b15610a0857600754604051632aee7a3160e01b81526001600160a01b0390911690632aee7a3190610997908590600401612542565b60206040518083038186803b1580156109af57600080fd5b505afa1580156109c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109e79190810190611ca1565b610a035760405162461bcd60e51b815260040161037490612487565b610a69565b8160000151600001516001600160a01b0316610a43826000015183602001518460400151610a35876102f6565b92919063ffffffff610e4a16565b6001600160a01b031614610a695760405162461bcd60e51b815260040161037490612487565b5050565b6002548151602083015160408401516001600160a01b0390931692610a98929190610a35888861032f565b6001600160a01b031614610abe5760405162461bcd60e51b815260040161037490612497565b505050565b600082610ad25750600061034a565b82820282848281610adf57fe5b04146103475760405162461bcd60e51b8152600401610374906124a7565b600061034783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610f27565b6006546040516303ec000360e61b81526000916001600160a01b03169063fb0000c090610b70908790600401612524565b60206040518083038186803b158015610b8857600080fd5b505afa158015610b9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bc09190810190611e3f565b90506000610bd4828463ffffffff610f6016565b905083811115610bf65760405162461bcd60e51b815260040161037490612447565b600654604051631d03b74d60e11b81526001600160a01b0390911690633a076e9a90610c289088908590600401612533565b600060405180830381600087803b158015610c4257600080fd5b505af1158015610c56573d6000803e3d6000fd5b505050505050505050565b6000610c73838363ffffffff610f8516565b90508083013414610abe5760405162461bcd60e51b8152600401610374906124f7565b60006003836004811115610ca657fe5b1480610cbd57506004836004811115610cbb57fe5b145b8015610ce957506003826004811115610cd257fe5b1480610ce957506004826004811115610ce757fe5b145b15610cf65750600061034a565b816004811115610d0257fe5b836004811115610d0e57fe5b1115610d1c5750600261034a565b50600192915050565b83610d3b57610d3688888888610f9d565b6106c3565b6106c3888888888787876111f0565b825160408082015160208082015191518188015185516060870151805190850151878c01519590980151965195976001600160a01b03909416967fdddcdb07e460849cf04a4445b7af9faf01b7f5c7ba75deaf969ac5ed830312c396610dbc9694959394929392918b918d919061257c565b60405180910390a3505050565b6001600160a01b038116610def5760405162461bcd60e51b815260040161037490612467565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600060608590506060610ec36040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a000000000000815250610e9684516114f5565b604080516000808252602082018181528284018281526060840192835260808401909452889390916115b6565b90506001818051906020012087878760405160008152602001604052604051610eef9493929190612379565b6020604051602081039080840390855afa158015610f11573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b60008183610f485760405162461bcd60e51b81526004016103749190612436565b506000838581610f5457fe5b049150505b9392505050565b6000828201838110156103475760405162461bcd60e51b815260040161037490612477565b600061034761271061052f858563ffffffff610ac316565b600084604001516004811115610faf57fe5b1415610ff45760405181906001600160a01b0382169085156108fc029086906000818181858888f19350505050158015610fed573d6000803e3d6000fd5b50506111ea565b60018460400151600481111561100657fe5b141561109b5760208401511561102e5760405162461bcd60e51b8152600401610374906124e7565b600554845160405163776062c360e01b81526001600160a01b039092169163776062c3916110649186908690899060040161240e565b600060405180830381600087803b15801561107e57600080fd5b505af1158015611092573d6000803e3d6000fd5b505050506111ea565b6003846040015160048111156110ad57fe5b141561110e57826001146110d35760405162461bcd60e51b815260040161037490612457565b60035484516020860151604051637b84dc8360e11b81526001600160a01b039093169263f709b906926110649290918791879160040161240e565b60048460400151600481111561112057fe5b141561117f57826001146111465760405162461bcd60e51b815260040161037490612457565b60048054855160208701516040516321143af960e21b81526001600160a01b0390931693638450ebe4936110649392889288920161240e565b60035484516020860151604051639c1c2ee960e01b81526001600160a01b0390931692639c1c2ee9926111bc929091879187918a906004016123b0565b600060405180830381600087803b1580156111d657600080fd5b505af11580156106c3573d6000803e3d6000fd5b50505050565b60006111ff888789878761185c565b905060028260400151600481111561121357fe5b1480156112a1575081516040516301ffc9a760e01b81526001600160a01b03909116906301ffc9a79061125190632dde656160e21b90600401612394565b60206040518083038186803b15801561126957600080fd5b505afa15801561127d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112a19190810190611ca1565b8061136157506003826040015160048111156112b957fe5b14806112d457506004826040015160048111156112d257fe5b145b8015611361575081516040516301ffc9a760e01b81526001600160a01b03909116906301ffc9a79061131190632dde656160e21b90600401612394565b60206040518083038186803b15801561132957600080fd5b505afa15801561133d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113619190810190611ca1565b156114e8578151602083015160405163b9c4d9fb60e01b81526060916001600160a01b0384169163b9c4d9fb9161139a9160040161256e565b60006040518083038186803b1580156113b257600080fd5b505afa1580156113c6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113ee9190810190611c37565b90506060826001600160a01b0316630ebd4c7f86602001516040518263ffffffff1660e01b8152600401611422919061256e565b60006040518083038186803b15801561143a57600080fd5b505afa15801561144e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114769190810190611c6c565b9050815181511461148657600080fd5b60005b81518110156114e3576000806114b3878e8686815181106114a657fe5b60200260200101516118ca565b915091508196506114d98e828e8887815181106114cc57fe5b6020026020010151610f9d565b5050600101611489565b505050505b84610c5689838984610f9d565b60608161151a57506040805180820190915260018152600360fc1b602082015261032a565b8160005b811561153257600101600a8204915061151e565b6060816040519080825280601f01601f19166020018201604052801561155f576020820181803883390190505b50905060001982015b85156115ad57600a860660300160f81b8282806001900393508151811061158b57fe5b60200101906001600160f81b031916908160001a905350600a86049550611568565b50949350505050565b60608082518451865188518a518c518e510101010101016040519080825280601f01601f1916602001820160405280156115f7576020820181803883390190505b5090506000805b8a5181101561164f578a818151811061161357fe5b602001015160f81c60f81b83838060010194508151811061163057fe5b60200101906001600160f81b031916908160001a9053506001016115fe565b5060005b89518110156116a45789818151811061166857fe5b602001015160f81c60f81b83838060010194508151811061168557fe5b60200101906001600160f81b031916908160001a905350600101611653565b5060005b88518110156116f9578881815181106116bd57fe5b602001015160f81c60f81b8383806001019450815181106116da57fe5b60200101906001600160f81b031916908160001a9053506001016116a8565b5060005b875181101561174e5787818151811061171257fe5b602001015160f81c60f81b83838060010194508151811061172f57fe5b60200101906001600160f81b031916908160001a9053506001016116fd565b5060005b86518110156117a35786818151811061176757fe5b602001015160f81c60f81b83838060010194508151811061178457fe5b60200101906001600160f81b031916908160001a905350600101611752565b5060005b85518110156117f8578581815181106117bc57fe5b602001015160f81c60f81b8383806001019450815181106117d957fe5b60200101906001600160f81b031916908160001a9053506001016117a7565b5060005b845181101561184d5784818151811061181157fe5b602001015160f81c60f81b83838060010194508151811061182e57fe5b60200101906001600160f81b031916908160001a9053506001016117fc565b50909998505050505050505050565b600080600061186c8687876118ca565b90925090506000611883878663ffffffff610f8516565b90506000611897828463ffffffff610f6016565b905080156118ba576001546118ba908b9083908c906001600160a01b0316610f9d565b5091925050505b95945050505050565b6000806118e6856118e1868663ffffffff610f8516565b6118f2565b91509150935093915050565b600080828411156119085750508082038161190f565b5060009050825b9250929050565b803561034a81612712565b805161034a81612712565b600082601f83011261193d57600080fd5b815161195061194b8261261a565b6125f3565b9150818183526020840193506020810190508385602084028201111561197557600080fd5b60005b838110156119a1578161198b8882611921565b8452506020928301929190910190600101611978565b5050505092915050565b600082601f8301126119bc57600080fd5b81516119ca61194b8261261a565b915081818352602084019350602081019050838560208402820111156119ef57600080fd5b60005b838110156119a15781611a058882611bfb565b84525060209283019291909101906001016119f2565b805161034a81612726565b803561034a8161272f565b803561034a81612738565b600060608284031215611a4e57600080fd5b611a5860606125f3565b90506000611a668484611916565b8252506020611a7784848301611a26565b6020830152506040611a8b84828501611a31565b60408301525092915050565b60006101008284031215611aaa57600080fd5b50919050565b60006101008284031215611ac357600080fd5b611acd60806125f3565b90506000611adb8484611916565b8252506020611aec84848301611a26565b6020830152506040611b0084828501611a3c565b60408301525060a0611b1484828501611a3c565b60608301525092915050565b60006101608284031215611aaa57600080fd5b60006101608284031215611b4657600080fd5b611b5060806125f3565b90506000611b5e8484611ab0565b825250610100611b7084848301611a26565b602083015250610120611b8584828501611a26565b604083015250610140611b1484828501611a26565b600060608284031215611aaa57600080fd5b600060608284031215611bbe57600080fd5b611bc860606125f3565b90506000611bd68484611c06565b8252506020611be784848301611a26565b6020830152506040611a8b84828501611a26565b805161034a8161272f565b803561034a81612745565b600060208284031215611c2357600080fd5b6000611c2f8484611916565b949350505050565b600060208284031215611c4957600080fd5b815167ffffffffffffffff811115611c6057600080fd5b611c2f8482850161192c565b600060208284031215611c7e57600080fd5b815167ffffffffffffffff811115611c9557600080fd5b611c2f848285016119ab565b600060208284031215611cb357600080fd5b6000611c2f8484611a1b565b600060208284031215611cd157600080fd5b6000611c2f8484611a31565b600060608284031215611cef57600080fd5b6000611c2f8484611a3c565b60006101008284031215611d0e57600080fd5b6000611c2f8484611a97565b60006101008284031215611d2d57600080fd5b6000611c2f8484611ab0565b6000806000806000806102808789031215611d5357600080fd5b6000611d5f8989611b20565b965050610160611d7189828a01611b9a565b9550506101c0611d8389828a01611a26565b9450506101e0611d9589828a01611b9a565b935050610240611da789828a01611a26565b925050610260611db989828a01611916565b9150509295509295509295565b60006101608284031215611dd957600080fd5b6000611c2f8484611b33565b6000806101808385031215611df957600080fd5b6000611e058585611b33565b925050610160611e1785828601611a26565b9150509250929050565b600060608284031215611e3357600080fd5b6000611c2f8484611bac565b600060208284031215611e5157600080fd5b6000611c2f8484611bfb565b611e66816126b5565b82525050565b611e6681612679565b611e6681612684565b611e6681612689565b611e668161268c565b611e66816126bc565b611e66816126c7565b6000611ead8261263b565b611eb7818561263f565b9350611ec78185602086016126d2565b611ed0816126fe565b9093019392505050565b6000611ee760248361263f565b7f6e6f7420656e6f7567682073746f636b206f66206f7264657220666f7220627581526379696e6760e01b602082015260400192915050565b6000611f2d601d8361263f565b7f76616c75652073686f756c64206265203120666f72204552432d373231000000815260200192915050565b6000611f6660268361263f565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b6000611fae601b8361263f565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000611fe760138361263f565b72696e636f7272656374207369676e617475726560681b815260200192915050565b6000612016601d8361263f565b7f696e636f727265637420627579657220666565207369676e6174757265000000815260200192915050565b600061204f60218361263f565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b600061209260208361263f565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b60006120cb60218361263f565b7f455448206973206e6f7420737570706f72746564206f6e2073656c6c207369648152606560f81b602082015260400192915050565b600061034a60008361263f565b600061211b600c8361263f565b6b3737ba1030b71037bbb732b960a11b815260200192915050565b600061214360138361263f565b720746f6b656e49642073686f756c64206265203606c1b815260200192915050565b600061217260168361263f565b751b5cd9cb9d985b1d59481a5cc81a5b98dbdc9c9958dd60521b815260200192915050565b606082016121a58280612648565b6121af8482611e6c565b506121bd602083018361266a565b6121ca6020850182611e7e565b506121d86040830183612657565b6111ea6040850182611e99565b805160608301906121f68482611e6c565b5060208201516122096020850182611e7e565b5060408201516111ea6040850182611e99565b610100820161222b8280612648565b6122358482611e6c565b50612243602083018361266a565b6122506020850182611e7e565b5061225e6040830183612666565b61226b6040850182612197565b5061227960a0830183612666565b6111ea60a0850182612197565b80516101008301906122988482611e6c565b5060208201516122ab6020850182611e7e565b5060408201516122be60408501826121e5565b5060608201516111ea60a08501826121e5565b80516101608301906122e38482612286565b5060208201516122f7610100850182611e7e565b50604082015161230b610120850182611e7e565b5060608201516111ea610140850182611e7e565b611e66816126af565b6020810161034a8284611e6c565b608081016123448287611e5d565b6123516020830186611e6c565b61235e6040830185611e7e565b6118c16060830184611e7e565b6020810161034a8284611e75565b608081016123878287611e7e565b612351602083018661231f565b6020810161034a8284611e87565b6020810161034a8284611e90565b60c081016123be8288611e90565b6123cb6020830187611e6c565b6123d86040830186611e6c565b6123e56060830185611e7e565b6123f26080830184611e7e565b81810360a083015261240381612101565b979650505050505050565b6080810161241c8287611e90565b6124296020830186611e6c565b61235e6040830185611e6c565b602080825281016103478184611ea2565b6020808252810161032781611eda565b6020808252810161032781611f20565b6020808252810161032781611f59565b6020808252810161032781611fa1565b6020808252810161032781611fda565b6020808252810161032781612009565b6020808252810161032781612042565b6020808252810161032781612085565b60208082528101610327816120be565b602080825281016103278161210e565b6020808252810161032781612136565b6020808252810161032781612165565b6101208101612516828561221c565b610f59610100830184611e7e565b610100810161034a8284612286565b61012081016125168285612286565b610160810161034a82846122d1565b610180810161256082856122d1565b610f59610160830184611e7e565b6020810161034a8284611e7e565b610100810161258b828b611e7e565b612598602083018a611e6c565b6125a56040830189611e6c565b6125b26060830188611e7e565b6125bf6080830187611e7e565b6125cc60a0830186611e6c565b6125d960c0830185611e7e565b6125e660e0830184611e7e565b9998505050505050505050565b60405181810167ffffffffffffffff8111828210171561261257600080fd5b604052919050565b600067ffffffffffffffff82111561263157600080fd5b5060209081020190565b5190565b90815260200190565b60006103476020840184611916565b60006103476020840184611a31565b5090565b60006103476020840184611a26565b6000610327826126a3565b151590565b90565b6001600160e01b03191690565b8061032a81612708565b6001600160a01b031690565b60ff1690565b6000610327825b600061032782612679565b600061032782612699565b60005b838110156126ed5781810151838201526020016126d5565b838111156111ea5750506000910152565b601f01601f191690565b6005811061081757fe5b61271b81612679565b811461081757600080fd5b61271b81612684565b61271b81612689565b6005811061081757600080fd5b61271b816126af56fea365627a7a72315820559aa28e28a92b415b945f053776f237c6d6a776c69f445be4800b11f7d401db6c6578706572696d656e74616cf564736f6c634300051100400000000000000000000000004fee7b061c97c9c496b01dbce9cdb10c02f0a0be000000000000000000000000661aa0fce9ba700d652433dfc8134c2bdf0ba443000000000000000000000000b8e4526e0da700e9ef1f879af713d691f81507d8000000000000000000000000ed1f5f8724cc185d4e48a71a7fac64fa5216e4a8000000000000000000000000c286c8b4bf8e29ad049a42b17ddf4a7c3248bbe1000000000000000000000000b3dc72ada453547a3dec51867f4e1cce24d5d597000000000000000000000000f03ba06dd459ae597357b491219fcb573f5fe683
Deployed Bytecode
0x6080604052600436106100fe5760003560e01c8063715018a6116100955780639cec6392116100645780639cec63921461026a578063c19d93fb1461027d578063ca120b1f14610292578063f2fde38b146102b2578063fee03e9e146102d2576100fe565b8063715018a6146102095780638da5cb5b1461021e5780638f32d59b146102335780639704dc4414610255576100fe565b806338af3eed116100d157806338af3eed1461019d5780634df97bc5146101bf57806355d5d326146101d45780636e667db3146101f4576100fe565b806302329e1014610103578063049944b61461012e5780631b4c98741461015b5780631c31f7101461017b575b600080fd5b34801561010f57600080fd5b506101186102e7565b60405161012591906123a2565b60405180910390f35b34801561013a57600080fd5b5061014e610149366004611dc6565b6102f6565b6040516101259190612436565b34801561016757600080fd5b5061014e610176366004611de5565b61032f565b34801561018757600080fd5b5061019b610196366004611c11565b610350565b005b3480156101a957600080fd5b506101b261039f565b6040516101259190612328565b3480156101cb57600080fd5b506101b26103ae565b3480156101e057600080fd5b5061019b6101ef366004611c11565b6103bd565b34801561020057600080fd5b50610118610403565b34801561021557600080fd5b5061019b610412565b34801561022a57600080fd5b506101b2610480565b34801561023f57600080fd5b5061024861048f565b604051610125919061236b565b34801561026157600080fd5b506101186104b3565b61019b610278366004611d39565b6104c2565b34801561028957600080fd5b506101186106cd565b34801561029e57600080fd5b5061019b6102ad366004611cfb565b6106dc565b3480156102be57600080fd5b5061019b6102cd366004611c11565b6107ea565b3480156102de57600080fd5b5061011861081a565b6004546001600160a01b031681565b60606103278260405160200161030c9190612542565b60405160208183030381529060405280519060200120610829565b90505b919050565b6060610347838360405160200161030c929190612551565b90505b92915050565b61035861048f565b61037d5760405162461bcd60e51b8152600401610374906124b7565b60405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b6002546001600160a01b031681565b6103c561048f565b6103e15760405162461bcd60e51b8152600401610374906124b7565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031681565b61041a61048f565b6104365760405162461bcd60e51b8152600401610374906124b7565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b600080546001600160a01b03166104a461093c565b6001600160a01b031614905090565b6007546001600160a01b031681565b6104e86104d436889003880188611dc6565b6104e336889003880188611e21565b610940565b61050f6104fa36889003880188611dc6565b8561050a36879003870187611e21565b610a6d565b600061053b61010088013561052f6101208a01358663ffffffff610ac316565b9063ffffffff610afd16565b905061055b61054f36899003890189611d1a565b88610100013585610b3f565b600061056d60a0890160808a01611cbf565b600481111561057857fe5b14156105965760405162461bcd60e51b8152600401610374906124c7565b60006105a9610100890160e08a01611cbf565b60048111156105b457fe5b14156105c4576105c48186610c61565b60006105ef6105d960a08a0160808b01611cbf565b6105ea6101008b0160e08c01611cbf565b610c96565b90506001600160a01b038316610603573392505b610659610618368a90038a0160408b01611cdd565b8561062660208c018c611c11565b86600186600281111561063557fe5b148b8e61014001358f60000160a0018036036106549190810190611cdd565b610d25565b6106aa61066e368a90038a0160a08b01611cdd565b833361067d60208d018d611c11565b600286600281111561068b57fe5b148d61014001358c8f6000016040018036036106549190810190611cdd565b6106c36106bc368a90038a018a611dc6565b8585610d4a565b5050505050505050565b6006546001600160a01b031681565b336106ea6020830183611c11565b6001600160a01b0316146107105760405162461bcd60e51b8152600401610374906124d7565b600654604051631d03b74d60e11b81526001600160a01b0390911690633a076e9a9061074490849060001990600401612507565b600060405180830381600087803b15801561075e57600080fd5b505af1158015610772573d6000803e3d6000fd5b505050606082018035915061078a9060408401611c11565b6001600160a01b03167fbfe0e802e586c99960de1a111c80f598b281996d65080d74dbe29986f55b274a336107c560c0860160a08701611c11565b6040516107df92919060c088013590602089013590612336565b60405180910390a350565b6107f261048f565b61080e5760405162461bcd60e51b8152600401610374906124b7565b61081781610dc9565b50565b6005546001600160a01b031681565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151828152606081810184529283919060208201818038833901905050905060005b60208110156109345782600486836020811061088957fe5b1a60f81b6001600160f81b031916901c60f81c60ff16815181106108a957fe5b602001015160f81c60f81b8282600202815181106108c357fe5b60200101906001600160f81b031916908160001a905350828582602081106108e757fe5b825191901a600f169081106108f857fe5b602001015160f81c60f81b82826002026001018151811061091557fe5b60200101906001600160f81b031916908160001a905350600101610871565b509392505050565b3390565b805160ff1615801561095457506020810151155b801561096257506040810151155b15610a0857600754604051632aee7a3160e01b81526001600160a01b0390911690632aee7a3190610997908590600401612542565b60206040518083038186803b1580156109af57600080fd5b505afa1580156109c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109e79190810190611ca1565b610a035760405162461bcd60e51b815260040161037490612487565b610a69565b8160000151600001516001600160a01b0316610a43826000015183602001518460400151610a35876102f6565b92919063ffffffff610e4a16565b6001600160a01b031614610a695760405162461bcd60e51b815260040161037490612487565b5050565b6002548151602083015160408401516001600160a01b0390931692610a98929190610a35888861032f565b6001600160a01b031614610abe5760405162461bcd60e51b815260040161037490612497565b505050565b600082610ad25750600061034a565b82820282848281610adf57fe5b04146103475760405162461bcd60e51b8152600401610374906124a7565b600061034783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610f27565b6006546040516303ec000360e61b81526000916001600160a01b03169063fb0000c090610b70908790600401612524565b60206040518083038186803b158015610b8857600080fd5b505afa158015610b9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bc09190810190611e3f565b90506000610bd4828463ffffffff610f6016565b905083811115610bf65760405162461bcd60e51b815260040161037490612447565b600654604051631d03b74d60e11b81526001600160a01b0390911690633a076e9a90610c289088908590600401612533565b600060405180830381600087803b158015610c4257600080fd5b505af1158015610c56573d6000803e3d6000fd5b505050505050505050565b6000610c73838363ffffffff610f8516565b90508083013414610abe5760405162461bcd60e51b8152600401610374906124f7565b60006003836004811115610ca657fe5b1480610cbd57506004836004811115610cbb57fe5b145b8015610ce957506003826004811115610cd257fe5b1480610ce957506004826004811115610ce757fe5b145b15610cf65750600061034a565b816004811115610d0257fe5b836004811115610d0e57fe5b1115610d1c5750600261034a565b50600192915050565b83610d3b57610d3688888888610f9d565b6106c3565b6106c3888888888787876111f0565b825160408082015160208082015191518188015185516060870151805190850151878c01519590980151965195976001600160a01b03909416967fdddcdb07e460849cf04a4445b7af9faf01b7f5c7ba75deaf969ac5ed830312c396610dbc9694959394929392918b918d919061257c565b60405180910390a3505050565b6001600160a01b038116610def5760405162461bcd60e51b815260040161037490612467565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600060608590506060610ec36040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a000000000000815250610e9684516114f5565b604080516000808252602082018181528284018281526060840192835260808401909452889390916115b6565b90506001818051906020012087878760405160008152602001604052604051610eef9493929190612379565b6020604051602081039080840390855afa158015610f11573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b60008183610f485760405162461bcd60e51b81526004016103749190612436565b506000838581610f5457fe5b049150505b9392505050565b6000828201838110156103475760405162461bcd60e51b815260040161037490612477565b600061034761271061052f858563ffffffff610ac316565b600084604001516004811115610faf57fe5b1415610ff45760405181906001600160a01b0382169085156108fc029086906000818181858888f19350505050158015610fed573d6000803e3d6000fd5b50506111ea565b60018460400151600481111561100657fe5b141561109b5760208401511561102e5760405162461bcd60e51b8152600401610374906124e7565b600554845160405163776062c360e01b81526001600160a01b039092169163776062c3916110649186908690899060040161240e565b600060405180830381600087803b15801561107e57600080fd5b505af1158015611092573d6000803e3d6000fd5b505050506111ea565b6003846040015160048111156110ad57fe5b141561110e57826001146110d35760405162461bcd60e51b815260040161037490612457565b60035484516020860151604051637b84dc8360e11b81526001600160a01b039093169263f709b906926110649290918791879160040161240e565b60048460400151600481111561112057fe5b141561117f57826001146111465760405162461bcd60e51b815260040161037490612457565b60048054855160208701516040516321143af960e21b81526001600160a01b0390931693638450ebe4936110649392889288920161240e565b60035484516020860151604051639c1c2ee960e01b81526001600160a01b0390931692639c1c2ee9926111bc929091879187918a906004016123b0565b600060405180830381600087803b1580156111d657600080fd5b505af11580156106c3573d6000803e3d6000fd5b50505050565b60006111ff888789878761185c565b905060028260400151600481111561121357fe5b1480156112a1575081516040516301ffc9a760e01b81526001600160a01b03909116906301ffc9a79061125190632dde656160e21b90600401612394565b60206040518083038186803b15801561126957600080fd5b505afa15801561127d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112a19190810190611ca1565b8061136157506003826040015160048111156112b957fe5b14806112d457506004826040015160048111156112d257fe5b145b8015611361575081516040516301ffc9a760e01b81526001600160a01b03909116906301ffc9a79061131190632dde656160e21b90600401612394565b60206040518083038186803b15801561132957600080fd5b505afa15801561133d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113619190810190611ca1565b156114e8578151602083015160405163b9c4d9fb60e01b81526060916001600160a01b0384169163b9c4d9fb9161139a9160040161256e565b60006040518083038186803b1580156113b257600080fd5b505afa1580156113c6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113ee9190810190611c37565b90506060826001600160a01b0316630ebd4c7f86602001516040518263ffffffff1660e01b8152600401611422919061256e565b60006040518083038186803b15801561143a57600080fd5b505afa15801561144e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114769190810190611c6c565b9050815181511461148657600080fd5b60005b81518110156114e3576000806114b3878e8686815181106114a657fe5b60200260200101516118ca565b915091508196506114d98e828e8887815181106114cc57fe5b6020026020010151610f9d565b5050600101611489565b505050505b84610c5689838984610f9d565b60608161151a57506040805180820190915260018152600360fc1b602082015261032a565b8160005b811561153257600101600a8204915061151e565b6060816040519080825280601f01601f19166020018201604052801561155f576020820181803883390190505b50905060001982015b85156115ad57600a860660300160f81b8282806001900393508151811061158b57fe5b60200101906001600160f81b031916908160001a905350600a86049550611568565b50949350505050565b60608082518451865188518a518c518e510101010101016040519080825280601f01601f1916602001820160405280156115f7576020820181803883390190505b5090506000805b8a5181101561164f578a818151811061161357fe5b602001015160f81c60f81b83838060010194508151811061163057fe5b60200101906001600160f81b031916908160001a9053506001016115fe565b5060005b89518110156116a45789818151811061166857fe5b602001015160f81c60f81b83838060010194508151811061168557fe5b60200101906001600160f81b031916908160001a905350600101611653565b5060005b88518110156116f9578881815181106116bd57fe5b602001015160f81c60f81b8383806001019450815181106116da57fe5b60200101906001600160f81b031916908160001a9053506001016116a8565b5060005b875181101561174e5787818151811061171257fe5b602001015160f81c60f81b83838060010194508151811061172f57fe5b60200101906001600160f81b031916908160001a9053506001016116fd565b5060005b86518110156117a35786818151811061176757fe5b602001015160f81c60f81b83838060010194508151811061178457fe5b60200101906001600160f81b031916908160001a905350600101611752565b5060005b85518110156117f8578581815181106117bc57fe5b602001015160f81c60f81b8383806001019450815181106117d957fe5b60200101906001600160f81b031916908160001a9053506001016117a7565b5060005b845181101561184d5784818151811061181157fe5b602001015160f81c60f81b83838060010194508151811061182e57fe5b60200101906001600160f81b031916908160001a9053506001016117fc565b50909998505050505050505050565b600080600061186c8687876118ca565b90925090506000611883878663ffffffff610f8516565b90506000611897828463ffffffff610f6016565b905080156118ba576001546118ba908b9083908c906001600160a01b0316610f9d565b5091925050505b95945050505050565b6000806118e6856118e1868663ffffffff610f8516565b6118f2565b91509150935093915050565b600080828411156119085750508082038161190f565b5060009050825b9250929050565b803561034a81612712565b805161034a81612712565b600082601f83011261193d57600080fd5b815161195061194b8261261a565b6125f3565b9150818183526020840193506020810190508385602084028201111561197557600080fd5b60005b838110156119a1578161198b8882611921565b8452506020928301929190910190600101611978565b5050505092915050565b600082601f8301126119bc57600080fd5b81516119ca61194b8261261a565b915081818352602084019350602081019050838560208402820111156119ef57600080fd5b60005b838110156119a15781611a058882611bfb565b84525060209283019291909101906001016119f2565b805161034a81612726565b803561034a8161272f565b803561034a81612738565b600060608284031215611a4e57600080fd5b611a5860606125f3565b90506000611a668484611916565b8252506020611a7784848301611a26565b6020830152506040611a8b84828501611a31565b60408301525092915050565b60006101008284031215611aaa57600080fd5b50919050565b60006101008284031215611ac357600080fd5b611acd60806125f3565b90506000611adb8484611916565b8252506020611aec84848301611a26565b6020830152506040611b0084828501611a3c565b60408301525060a0611b1484828501611a3c565b60608301525092915050565b60006101608284031215611aaa57600080fd5b60006101608284031215611b4657600080fd5b611b5060806125f3565b90506000611b5e8484611ab0565b825250610100611b7084848301611a26565b602083015250610120611b8584828501611a26565b604083015250610140611b1484828501611a26565b600060608284031215611aaa57600080fd5b600060608284031215611bbe57600080fd5b611bc860606125f3565b90506000611bd68484611c06565b8252506020611be784848301611a26565b6020830152506040611a8b84828501611a26565b805161034a8161272f565b803561034a81612745565b600060208284031215611c2357600080fd5b6000611c2f8484611916565b949350505050565b600060208284031215611c4957600080fd5b815167ffffffffffffffff811115611c6057600080fd5b611c2f8482850161192c565b600060208284031215611c7e57600080fd5b815167ffffffffffffffff811115611c9557600080fd5b611c2f848285016119ab565b600060208284031215611cb357600080fd5b6000611c2f8484611a1b565b600060208284031215611cd157600080fd5b6000611c2f8484611a31565b600060608284031215611cef57600080fd5b6000611c2f8484611a3c565b60006101008284031215611d0e57600080fd5b6000611c2f8484611a97565b60006101008284031215611d2d57600080fd5b6000611c2f8484611ab0565b6000806000806000806102808789031215611d5357600080fd5b6000611d5f8989611b20565b965050610160611d7189828a01611b9a565b9550506101c0611d8389828a01611a26565b9450506101e0611d9589828a01611b9a565b935050610240611da789828a01611a26565b925050610260611db989828a01611916565b9150509295509295509295565b60006101608284031215611dd957600080fd5b6000611c2f8484611b33565b6000806101808385031215611df957600080fd5b6000611e058585611b33565b925050610160611e1785828601611a26565b9150509250929050565b600060608284031215611e3357600080fd5b6000611c2f8484611bac565b600060208284031215611e5157600080fd5b6000611c2f8484611bfb565b611e66816126b5565b82525050565b611e6681612679565b611e6681612684565b611e6681612689565b611e668161268c565b611e66816126bc565b611e66816126c7565b6000611ead8261263b565b611eb7818561263f565b9350611ec78185602086016126d2565b611ed0816126fe565b9093019392505050565b6000611ee760248361263f565b7f6e6f7420656e6f7567682073746f636b206f66206f7264657220666f7220627581526379696e6760e01b602082015260400192915050565b6000611f2d601d8361263f565b7f76616c75652073686f756c64206265203120666f72204552432d373231000000815260200192915050565b6000611f6660268361263f565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b6000611fae601b8361263f565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000611fe760138361263f565b72696e636f7272656374207369676e617475726560681b815260200192915050565b6000612016601d8361263f565b7f696e636f727265637420627579657220666565207369676e6174757265000000815260200192915050565b600061204f60218361263f565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b600061209260208361263f565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b60006120cb60218361263f565b7f455448206973206e6f7420737570706f72746564206f6e2073656c6c207369648152606560f81b602082015260400192915050565b600061034a60008361263f565b600061211b600c8361263f565b6b3737ba1030b71037bbb732b960a11b815260200192915050565b600061214360138361263f565b720746f6b656e49642073686f756c64206265203606c1b815260200192915050565b600061217260168361263f565b751b5cd9cb9d985b1d59481a5cc81a5b98dbdc9c9958dd60521b815260200192915050565b606082016121a58280612648565b6121af8482611e6c565b506121bd602083018361266a565b6121ca6020850182611e7e565b506121d86040830183612657565b6111ea6040850182611e99565b805160608301906121f68482611e6c565b5060208201516122096020850182611e7e565b5060408201516111ea6040850182611e99565b610100820161222b8280612648565b6122358482611e6c565b50612243602083018361266a565b6122506020850182611e7e565b5061225e6040830183612666565b61226b6040850182612197565b5061227960a0830183612666565b6111ea60a0850182612197565b80516101008301906122988482611e6c565b5060208201516122ab6020850182611e7e565b5060408201516122be60408501826121e5565b5060608201516111ea60a08501826121e5565b80516101608301906122e38482612286565b5060208201516122f7610100850182611e7e565b50604082015161230b610120850182611e7e565b5060608201516111ea610140850182611e7e565b611e66816126af565b6020810161034a8284611e6c565b608081016123448287611e5d565b6123516020830186611e6c565b61235e6040830185611e7e565b6118c16060830184611e7e565b6020810161034a8284611e75565b608081016123878287611e7e565b612351602083018661231f565b6020810161034a8284611e87565b6020810161034a8284611e90565b60c081016123be8288611e90565b6123cb6020830187611e6c565b6123d86040830186611e6c565b6123e56060830185611e7e565b6123f26080830184611e7e565b81810360a083015261240381612101565b979650505050505050565b6080810161241c8287611e90565b6124296020830186611e6c565b61235e6040830185611e6c565b602080825281016103478184611ea2565b6020808252810161032781611eda565b6020808252810161032781611f20565b6020808252810161032781611f59565b6020808252810161032781611fa1565b6020808252810161032781611fda565b6020808252810161032781612009565b6020808252810161032781612042565b6020808252810161032781612085565b60208082528101610327816120be565b602080825281016103278161210e565b6020808252810161032781612136565b6020808252810161032781612165565b6101208101612516828561221c565b610f59610100830184611e7e565b610100810161034a8284612286565b61012081016125168285612286565b610160810161034a82846122d1565b610180810161256082856122d1565b610f59610160830184611e7e565b6020810161034a8284611e7e565b610100810161258b828b611e7e565b612598602083018a611e6c565b6125a56040830189611e6c565b6125b26060830188611e7e565b6125bf6080830187611e7e565b6125cc60a0830186611e6c565b6125d960c0830185611e7e565b6125e660e0830184611e7e565b9998505050505050505050565b60405181810167ffffffffffffffff8111828210171561261257600080fd5b604052919050565b600067ffffffffffffffff82111561263157600080fd5b5060209081020190565b5190565b90815260200190565b60006103476020840184611916565b60006103476020840184611a31565b5090565b60006103476020840184611a26565b6000610327826126a3565b151590565b90565b6001600160e01b03191690565b8061032a81612708565b6001600160a01b031690565b60ff1690565b6000610327825b600061032782612679565b600061032782612699565b60005b838110156126ed5781810151838201526020016126d5565b838111156111ea5750506000910152565b601f01601f191690565b6005811061081757fe5b61271b81612679565b811461081757600080fd5b61271b81612684565b61271b81612689565b6005811061081757600080fd5b61271b816126af56fea365627a7a72315820559aa28e28a92b415b945f053776f237c6d6a776c69f445be4800b11f7d401db6c6578706572696d656e74616cf564736f6c63430005110040
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004fee7b061c97c9c496b01dbce9cdb10c02f0a0be000000000000000000000000661aa0fce9ba700d652433dfc8134c2bdf0ba443000000000000000000000000b8e4526e0da700e9ef1f879af713d691f81507d8000000000000000000000000ed1f5f8724cc185d4e48a71a7fac64fa5216e4a8000000000000000000000000c286c8b4bf8e29ad049a42b17ddf4a7c3248bbe1000000000000000000000000b3dc72ada453547a3dec51867f4e1cce24d5d597000000000000000000000000f03ba06dd459ae597357b491219fcb573f5fe683
-----Decoded View---------------
Arg [0] : _transferProxy (address): 0x4feE7B061C97C9c496b01DbcE9CDb10c02f0a0Be
Arg [1] : _transferProxyForDeprecated (address): 0x661AA0fcE9BA700D652433DfC8134C2BdF0ba443
Arg [2] : _erc20TransferProxy (address): 0xB8e4526E0DA700E9eF1F879AF713d691f81507D8
Arg [3] : _state (address): 0xEd1f5F8724Cc185d4e48a71A7Fac64fA5216E4A8
Arg [4] : _ordersHolder (address): 0xC286C8b4bF8E29AD049a42B17DDf4A7c3248BBE1
Arg [5] : _beneficiary (address): 0xB3dc72aDA453547A3dEC51867F4E1CcE24d5D597
Arg [6] : _buyerFeeSigner (address): 0xf03Ba06Dd459AE597357b491219fCb573f5fe683
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000004fee7b061c97c9c496b01dbce9cdb10c02f0a0be
Arg [1] : 000000000000000000000000661aa0fce9ba700d652433dfc8134c2bdf0ba443
Arg [2] : 000000000000000000000000b8e4526e0da700e9ef1f879af713d691f81507d8
Arg [3] : 000000000000000000000000ed1f5f8724cc185d4e48a71a7fac64fa5216e4a8
Arg [4] : 000000000000000000000000c286c8b4bf8e29ad049a42b17ddf4a7c3248bbe1
Arg [5] : 000000000000000000000000b3dc72ada453547a3dec51867f4e1cce24d5d597
Arg [6] : 000000000000000000000000f03ba06dd459ae597357b491219fcb573f5fe683
Deployed Bytecode Sourcemap
33945:9693:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34877:60;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34877:60:0;;;:::i;:::-;;;;;;;;;;;;;;;;38583:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38583:145:0;;;;;;;;:::i;:::-;;;;;;;;38407:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38407:168:0;;;;;;;;:::i;35687:122::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35687:122:0;;;;;;;;:::i;:::-;;34757:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34757:34:0;;;:::i;:::-;;;;;;;;34798:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34798:29:0;;;:::i;35817:126::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35817:126:0;;;;;;;;:::i;34836:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34836:34:0;;;:::i;12795:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12795:140:0;;;:::i;11984:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11984:79:0;;;:::i;12350:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12350:94:0;;;:::i;:::-;;;;;;;;35030:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35030:42:0;;;:::i;35951:1234::-;;;;;;;;;:::i;34995:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34995:28:0;;;:::i;37412:292::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37412:292:0;;;;;;;;:::i;13090:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13090:109:0;;;;;;;;:::i;34944:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34944:44:0;;;:::i;34877:60::-;;;-1:-1:-1;;;;;34877:60:0;;:::o;38583:145::-;38648:13;38681:39;38702:5;38691:17;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;38691:17:0;;;38681:28;;;;;;:37;:39::i;:::-;38674:46;;38583:145;;;;:::o;38407:168::-;38490:13;38523:44;38544:5;38551:3;38533:22;;;;;;;;;;38523:44;38516:51;;38407:168;;;;;:::o;35687:122::-;12196:9;:7;:9::i;:::-;12188:54;;;;-1:-1:-1;;;12188:54:0;;;;;;;;;;;;;;;;;35773:11;:28;;-1:-1:-1;;;;;;35773:28:0;-1:-1:-1;;;;;35773:28:0;;;;;;;;;;35687:122::o;34757:34::-;;;-1:-1:-1;;;;;34757:34:0;;:::o;34798:29::-;;;-1:-1:-1;;;;;34798:29:0;;:::o;35817:126::-;12196:9;:7;:9::i;:::-;12188:54;;;;-1:-1:-1;;;12188:54:0;;;;;;;;;35901:14;:34;;-1:-1:-1;;;;;;35901:34:0;-1:-1:-1;;;;;35901:34:0;;;;;;;;;;35817:126::o;34836:34::-;;;-1:-1:-1;;;;;34836:34:0;;:::o;12795:140::-;12196:9;:7;:9::i;:::-;12188:54;;;;-1:-1:-1;;;12188:54:0;;;;;;;;;12894:1;12878:6;;12857:40;;-1:-1:-1;;;;;12878:6:0;;;;12857:40;;12894:1;;12857:40;12925:1;12908:19;;-1:-1:-1;;;;;;12908:19:0;;;12795:140::o;11984:79::-;12022:7;12049:6;-1:-1:-1;;;;;12049:6:0;11984:79;:::o;12350:94::-;12390:4;12430:6;;-1:-1:-1;;;;;12430:6:0;12414:12;:10;:12::i;:::-;-1:-1:-1;;;;;12414:22:0;;12407:29;;12350:94;:::o;35030:42::-;;;-1:-1:-1;;;;;35030:42:0;;:::o;35951:1234::-;36167:28;;;;;;;;36184:5;36167:28;;;;;;;;;;36191:3;36167:28;;;:16;:28::i;:::-;36206:49;;;;;;;;36226:5;36206:49;;;36233:8;36206:49;;;;;;;36243:11;36206:49;;;:19;:49::i;:::-;36266:11;36280:43;36309:13;;;;36280:24;:12;;;;36297:6;36280:24;:16;:24;:::i;:::-;:28;:43;:28;:43;:::i;:::-;36266:57;-1:-1:-1;36334:63:0;;;;;;;;36364:5;36334:63;;;36375:5;:13;;;36390:6;36334:29;:63::i;:::-;36449:13;36416:29;;;;;;;;;;:46;;;;;;;;;;36408:92;;;;-1:-1:-1;;;36408:92:0;;;;;;;;;36547:13;36515:28;;;;;;;;;;:45;;;;;;;;;36511:115;;;36577:37;36597:6;36605:8;36577:19;:37::i;:::-;36636:15;36654:71;36665:29;;;;;;;;;;36696:28;;;;;;;;;;36654:10;:71::i;:::-;36636:89;-1:-1:-1;;;;;;36740:21:0;;36736:72;;36786:10;36778:18;;36736:72;36818:152;;;;;;;;36846:19;;;36818:152;;;36867:6;36875:15;;;;:5;:15;;;36892:5;36910:12;36899:7;:23;;;;;;;;;36924:8;36934:5;:15;;;36951:5;:9;;:18;;36818:152;;;;;;;;;;;;:27;:152::i;:::-;36981:156;;;;;;;;37009:18;;;36981:156;;;37029:6;37037:10;37049:15;;;;:5;:15;;;37077:11;37066:7;:22;;;;;;;;;37090:5;:15;;;37107:8;37117:5;:9;;:19;;36981:156;;;;;;;;;;;;37148:29;;;;;;;;37156:5;37148:29;;;37163:6;37171:5;37148:7;:29::i;:::-;35951:1234;;;;;;;;:::o;34995:28::-;;;-1:-1:-1;;;;;34995:28:0;;:::o;37412:292::-;37492:10;37479:9;;;;:3;:9;;;-1:-1:-1;;;;;37479:23:0;;37471:48;;;;-1:-1:-1;;;37471:48:0;;;;;;;;;37530:5;;:36;;-1:-1:-1;;;37530:36:0;;-1:-1:-1;;;;;37530:5:0;;;;:18;;:36;;37549:3;;-1:-1:-1;;34736:12:0;37530:36;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37530:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;37610:21:0;;;;;;-1:-1:-1;37589:19:0;;37610:13;;;37589:19;;;-1:-1:-1;;;;;37582:114:0;;37633:10;37645:18;;;;:12;;;:18;;;37582:114;;;;;;37665:20;;;;;;37687:8;;;;37582:114;;;;;;;;;;37412:292;:::o;13090:109::-;12196:9;:7;:9::i;:::-;12188:54;;;;-1:-1:-1;;;12188:54:0;;;;;;;;;13163:28;13182:8;13163:18;:28::i;:::-;13090:109;:::o;34944:44::-;;;-1:-1:-1;;;;;34944:44:0;;:::o;28178:375::-;28260:42;;;;;;;;;;;-1:-1:-1;;;28260:42:0;;;;28332:13;;;;;28234;28332;;;;;28234;;;28332;;;;21:6:-1;;104:10;28332:13:0;87:34:-1;135:17;;-1:-1;;28313:32:0;-1:-1:-1;28361:9:0;28356:161;28380:2;28376:1;:6;28356:161;;;28415:8;28442:1;28430:5;28436:1;28430:8;;;;;;;;;;-1:-1:-1;;;;;28430:13:0;;;;28424:20;;28415:30;;;;;;;;;;;;;;;;;;28404:3;28408:1;28410;28408:3;28404:8;;;;;;;;;;;:41;-1:-1:-1;;;;;28404:41:0;;;;;;;;;28473:8;28488:5;28494:1;28488:8;;;;;;;28473:32;;28488:8;;;28499:4;28482:22;;28473:32;;;;;;;;;;;;;;28460:3;28466:1;28468;28466:3;28464:1;:5;28460:10;;;;;;;;;;;:45;-1:-1:-1;;;;;28460:45:0;;;;;;;;-1:-1:-1;28384:3:0;;28356:161;;;-1:-1:-1;28541:3:0;28178:375;-1:-1:-1;;;28178:375:0:o;8969:98::-;9049:10;8969:98;:::o;37712:404::-;37828:5;;:10;;;:35;;;;-1:-1:-1;37842:5:0;;;;:21;37828:35;:60;;;;-1:-1:-1;37867:5:0;;;;:21;37828:60;37824:285;;;37913:12;;:26;;-1:-1:-1;;;37913:26:0;;-1:-1:-1;;;;;37913:12:0;;;;:19;;:26;;37933:5;;37913:26;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37913:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37913:26:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;37913:26:0;;;;;;;;;37905:58;;;;-1:-1:-1;;;37905:58:0;;;;;;;;;37824:285;;;38058:5;:9;;;:15;;;-1:-1:-1;;;;;38004:69:0;:50;38034:3;:5;;;38041:3;:5;;;38048:3;:5;;;38004:21;38019:5;38004:14;:21::i;:::-;:29;:50;;;:29;:50;:::i;:::-;-1:-1:-1;;;;;38004:69:0;;37996:101;;;;-1:-1:-1;;;37996:101:0;;;;;;;;;37712:404;;:::o;38124:275::-;38343:14;;38319:5;;38326;;;;38333;;;;-1:-1:-1;;;;;38343:14:0;;;;38271:68;;38319:5;38326;38271:39;38294:5;38301:8;38271:22;:39::i;:68::-;-1:-1:-1;;;;;38271:86:0;;38263:128;;;;-1:-1:-1;;;38263:128:0;;;;;;;;;38124:275;;;:::o;2268:471::-;2326:7;2571:6;2567:47;;-1:-1:-1;2601:1:0;2594:8;;2567:47;2638:5;;;2642:1;2638;:5;:1;2662:5;;;;;:10;2654:56;;;;-1:-1:-1;;;2654:56:0;;;;;;;;3207:132;3265:7;3292:39;3296:1;3299;3292:39;;;;;;;;;;;;;;;;;:3;:39::i;42848:338::-;42972:5;;:23;;-1:-1:-1;;;42972:23:0;;42955:14;;-1:-1:-1;;;;;42972:5:0;;:18;;:23;;42991:3;;42972:23;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42972:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42972:23:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42972:23:0;;;;;;;;;42955:40;-1:-1:-1;43006:17:0;43026:21;42955:40;43040:6;43026:21;:13;:21;:::i;:::-;43006:41;;43082:7;43066:12;:23;;43058:72;;;;-1:-1:-1;;;43058:72:0;;;;;;;;;43141:5;;:37;;-1:-1:-1;;;43141:37:0;;-1:-1:-1;;;;;43141:5:0;;;;:18;;:37;;43160:3;;43165:12;;43141:37;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43141:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43141:37:0;;;;42848:338;;;;;:::o;37193:211::-;37274:21;37298:18;:5;37307:8;37298:18;:8;:18;:::i;:::-;37274:42;;37356:13;37348:5;:21;37335:9;:34;37327:69;;;;-1:-1:-1;;;37327:69:0;;;;;;;;43194:441;43276:7;43313:16;43301:8;:28;;;;;;;;;:70;;;-1:-1:-1;43345:26:0;43333:8;:38;;;;;;;;;43301:70;43300:159;;;;-1:-1:-1;43401:16:0;43390:7;:27;;;;;;;;;:68;;;-1:-1:-1;43432:26:0;43421:7;:37;;;;;;;;;43390:68;43296:211;;;-1:-1:-1;43483:12:0;43476:19;;43296:211;43543:7;43538:13;;;;;;;;43526:8;43521:14;;;;;;;;:30;43517:81;;;-1:-1:-1;43575:11:0;43568:18;;43517:81;-1:-1:-1;43615:12:0;43194:441;;;;:::o;38736:387::-;38935:6;38930:186;;38958:36;38967:9;38978:5;38985:4;38991:2;38958:8;:36::i;:::-;38930:186;;;39027:77;39044:9;39055:5;39062:4;39068:2;39072:9;39083:8;39093:10;39027:16;:77::i;42016:363::-;42137:9;;:19;;;;;:27;;;;;42110:25;;42166:13;;;;42194:15;;42224:18;;;;:24;;42250:26;;;;42278:12;;;;42346:14;;;;;42106:265;;42137:27;;-1:-1:-1;;;;;42106:265:0;;;;;;;;42166:13;;42194:15;;42224:24;;42250:26;42278:12;42305:5;;42325:6;;42346:14;42106:265;;;;;;;;;;42016:363;;;:::o;13305:229::-;-1:-1:-1;;;;;13379:22:0;;13371:73;;;;-1:-1:-1;;;13371:73:0;;;;;;;;;13481:6;;;13460:38;;-1:-1:-1;;;;;13460:38:0;;;;13481:6;;;13460:38;;;13509:6;:17;;-1:-1:-1;;;;;;13509:17:0;-1:-1:-1;;;;;13509:17:0;;;;;;;;;;13305:229::o;26802:469::-;26896:7;26916:21;26946:7;26916:38;;26965:24;26992:211;27013:39;;;;;;;;;;;;;;;;;27073:26;:8;:15;:24;:26::i;:::-;27138:12;;;27148:1;27138:12;;;;;;27152;;;;;;27166;;;;;;27180;;;;;;;;;27115:8;;27138:12;;26992:6;:211::i;:::-;26965:238;;27221:42;27241:11;27231:22;;;;;;27255:1;27258;27261;27221:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;27221:42:0;;-1:-1:-1;;27221:42:0;;;26802:469;-1:-1:-1;;;;;;;;26802:469:0:o;3869:345::-;3955:7;4057:12;4050:5;4042:28;;;;-1:-1:-1;;;4042:28:0;;;;;;;;;;;4081:9;4097:1;4093;:5;;;;;;;-1:-1:-1;;3869:345:0;;;;;;:::o;896:181::-;954:7;986:5;;;1010:6;;;;1002:46;;;;-1:-1:-1;;;1002:46:0;;;;;;;;25640:122;25701:4;25725:29;25748:5;25725:18;:5;25735:7;25725:18;:9;:18;:::i;39131:1068::-;39250:13;39231:5;:15;;;:32;;;;;;;;;39227:965;;;39343:25;;39324:2;;-1:-1:-1;;;;;39343:18:0;;;:25;;;;;39362:5;;39280:25;39343;39280;39343;39362:5;39343:18;:25;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39343:25:0;39227:965;;;;39409:15;39390:5;:15;;;:34;;;;;;;;;39386:806;;;39449:13;;;;:18;39441:50;;;;-1:-1:-1;;;39441:50:0;;;;;;;;;39506:18;;39554:11;;39506:78;;-1:-1:-1;;;39506:78:0;;-1:-1:-1;;;;;39506:18:0;;;;:40;;:78;;39568:4;;39574:2;;39578:5;;39506:78;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39506:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39506:78:0;;;;39386:806;;;39625:16;39606:5;:15;;;:35;;;;;;;;;39602:590;;;39666:5;39675:1;39666:10;39658:52;;;;-1:-1:-1;;;39658:52:0;;;;;;;;;39725:13;;39770:11;;39794:13;;;;39725:83;;-1:-1:-1;;;39725:83:0;;-1:-1:-1;;;;;39725:13:0;;;;:36;;:83;;39770:11;;39784:4;;39790:2;;39725:83;;;;39602:590;39849:26;39830:5;:15;;;:45;;;;;;;;;39826:366;;;39900:5;39909:1;39900:10;39892:52;;;;-1:-1:-1;;;39892:52:0;;;;;;;;;39959:26;;;40013:11;;40037:13;;;;39959:92;;-1:-1:-1;;;39959:92:0;;-1:-1:-1;;;;;39959:26:0;;;;:45;;:92;;40013:11;40027:4;;40033:2;;39959:92;;;39826:366;40084:13;;40131:11;;40155:13;;;;40084:96;;-1:-1:-1;;;40084:96:0;;-1:-1:-1;;;;;40084:13:0;;;;:37;;:96;;40131:11;;40145:4;;40151:2;;40170:5;;40084:96;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40084:96:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;39826:366:0;39131:1068;;;;:::o;40207:1310::-;40377:14;40394:69;40419:9;40430:4;40436:5;40443:9;40454:8;40394:24;:69::i;:::-;40377:86;-1:-1:-1;40516:17:0;40492:10;:20;;;:41;;;;;;;;;:109;;;;-1:-1:-1;40546:16:0;;40537:64;;-1:-1:-1;;;40537:64:0;;-1:-1:-1;;;;;40537:44:0;;;;;;:64;;-1:-1:-1;;;40582:18:0;40537:64;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40537:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40537:64:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40537:64:0;;;;;;;;;40492:289;;;-1:-1:-1;40643:16:0;40619:10;:20;;;:40;;;;;;;;;:94;;;-1:-1:-1;40687:26:0;40663:10;:20;;;:50;;;;;;;;;40619:94;40618:163;;;;-1:-1:-1;40726:16:0;;40718:63;;-1:-1:-1;;;40718:63:0;;-1:-1:-1;;;;;40718:43:0;;;;;;:63;;-1:-1:-1;;;40762:18:0;40718:63;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40718:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40718:63:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40718:63:0;;;;;;;;;40474:919;;;40861:16;;40957:18;;;;40931:45;;-1:-1:-1;;;40931:45:0;;40893:35;;-1:-1:-1;;;;;40931:25:0;;;;;:45;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40931:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40931:45:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;40931:45:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;40931:45:0;;;;;;;;;40893:83;;40991:18;41012:8;-1:-1:-1;;;;;41012:18:0;;41031:10;:18;;;41012:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41012:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41012:38:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;41012:38:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;41012:38:0;;;;;;;;;40991:59;;41088:10;:17;41073:4;:11;:32;41065:41;;;;;;41126:9;41121:261;41145:4;:11;41141:1;:15;41121:261;;;41183:17;41202:12;41218:37;41229:9;41240:5;41247:4;41252:1;41247:7;;;;;;;;;;;;;;41218:10;:37::i;:::-;41182:73;;;;41286:12;41274:24;;41317:49;41326:9;41337:7;41346:4;41352:10;41363:1;41352:13;;;;;;;;;;;;;;41317:8;:49::i;:::-;-1:-1:-1;;41158:3:0;;41121:261;;;;40474:919;;;;41447:2;41462:47;41471:9;41482;41493:4;41447:2;41462:8;:47::i;25167:465::-;25219:13;25249:6;25245:49;;-1:-1:-1;25272:10:0;;;;;;;;;;;;-1:-1:-1;;;25272:10:0;;;;;;25245:49;25313:1;25304:6;25344:69;25351:6;;25344:69;;25374:5;;25399:2;25394:7;;;;25344:69;;;25423:17;25453:3;25443:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;25443:14:0;87:34:-1;135:17;;-1:-1;25443:14:0;-1:-1:-1;25423:34:0;-1:-1:-1;;;25477:7:0;;25495:100;25502:6;;25495:100;;25557:2;25553:1;:6;25548:2;:11;25537:24;;25525:4;25530:3;;;;;;;25525:9;;;;;;;;;;;:36;-1:-1:-1;;;;;25525:36:0;;;;;;;;-1:-1:-1;25581:2:0;25576:7;;;;25495:100;;;-1:-1:-1;25619:4:0;25167:465;-1:-1:-1;;;;25167:465:0:o;27279:864::-;27437:12;27462:24;27571:2;:9;27559:2;:9;27547:2;:9;27535:2;:9;27523:2;:9;27511:2;:9;27499:2;:9;:21;:33;:45;:57;:69;:81;27489:92;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;27489:92:0;87:34:-1;135:17;;-1:-1;27489:92:0;-1:-1:-1;27462:119:0;-1:-1:-1;27592:6:0;;27613:61;27634:2;:9;27630:1;:13;27613:61;;;27669:2;27672:1;27669:5;;;;;;;;;;;;;;;;27650:11;27662:3;;;;;;27650:16;;;;;;;;;;;:24;-1:-1:-1;;;;;27650:24:0;;;;;;;;-1:-1:-1;27645:3:0;;27613:61;;;-1:-1:-1;27690:6:0;27685:61;27706:2;:9;27702:1;:13;27685:61;;;27741:2;27744:1;27741:5;;;;;;;;;;;;;;;;27722:11;27734:3;;;;;;27722:16;;;;;;;;;;;:24;-1:-1:-1;;;;;27722:24:0;;;;;;;;-1:-1:-1;27717:3:0;;27685:61;;;-1:-1:-1;27762:6:0;27757:61;27778:2;:9;27774:1;:13;27757:61;;;27813:2;27816:1;27813:5;;;;;;;;;;;;;;;;27794:11;27806:3;;;;;;27794:16;;;;;;;;;;;:24;-1:-1:-1;;;;;27794:24:0;;;;;;;;-1:-1:-1;27789:3:0;;27757:61;;;-1:-1:-1;27834:6:0;27829:61;27850:2;:9;27846:1;:13;27829:61;;;27885:2;27888:1;27885:5;;;;;;;;;;;;;;;;27866:11;27878:3;;;;;;27866:16;;;;;;;;;;;:24;-1:-1:-1;;;;;27866:24:0;;;;;;;;-1:-1:-1;27861:3:0;;27829:61;;;-1:-1:-1;27906:6:0;27901:61;27922:2;:9;27918:1;:13;27901:61;;;27957:2;27960:1;27957:5;;;;;;;;;;;;;;;;27938:11;27950:3;;;;;;27938:16;;;;;;;;;;;:24;-1:-1:-1;;;;;27938:24:0;;;;;;;;-1:-1:-1;27933:3:0;;27901:61;;;-1:-1:-1;27978:6:0;27973:61;27994:2;:9;27990:1;:13;27973:61;;;28029:2;28032:1;28029:5;;;;;;;;;;;;;;;;28010:11;28022:3;;;;;;28010:16;;;;;;;;;;;:24;-1:-1:-1;;;;;28010:24:0;;;;;;;;-1:-1:-1;28005:3:0;;27973:61;;;-1:-1:-1;28050:6:0;28045:61;28066:2;:9;28062:1;:13;28045:61;;;28101:2;28104:1;28101:5;;;;;;;;;;;;;;;;28082:11;28094:3;;;;;;28082:16;;;;;;;;;;;:24;-1:-1:-1;;;;;28082:24:0;;;;;;;;-1:-1:-1;28077:3:0;;28045:61;;;-1:-1:-1;28124:11:0;;27279:864;-1:-1:-1;;;;;;;;;27279:864:0:o;41525:483::-;41654:4;41672:14;41688:19;41711:35;41722:5;41729;41736:9;41711:10;:35::i;:::-;41671:75;;-1:-1:-1;41671:75:0;-1:-1:-1;41757:18:0;41778;:5;41787:8;41778:18;:8;:18;:::i;:::-;41757:39;-1:-1:-1;41807:19:0;41829:33;41757:39;41847:14;41829:33;:17;:33;:::i;:::-;41807:55;-1:-1:-1;41877:18:0;;41873:101;;41950:11;;41912:50;;41921:5;;41928:14;;41944:4;;-1:-1:-1;;;;;41950:11:0;41912:8;:50::i;:::-;-1:-1:-1;41991:9:0;;-1:-1:-1;;;41525:483:0;;;;;;;;:::o;42387:168::-;42468:13;;42515:32;42522:5;42529:17;:5;42538:7;42529:17;:8;:17;:::i;:::-;42515:6;:32::i;:::-;42508:39;;;;42387:168;;;;;;:::o;42563:277::-;42624:13;42639:12;42676:3;42668:5;:11;42664:169;;;-1:-1:-1;;42707:11:0;;;42715:3;42664:169;;;-1:-1:-1;42790:1:0;;-1:-1:-1;42816:5:0;42664:169;42563:277;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;295:150;381:13;;399:41;381:13;399:41;;478:746;;614:3;607:4;599:6;595:17;591:27;581:2;;632:1;629;622:12;581:2;662:6;656:13;684:88;699:72;764:6;699:72;;;684:88;;;675:97;;789:5;814:6;807:5;800:21;844:4;836:6;832:17;822:27;;866:4;861:3;857:14;850:21;;919:6;966:3;958:4;950:6;946:17;941:3;937:27;934:36;931:2;;;983:1;980;973:12;931:2;1008:1;993:225;1018:6;1015:1;1012:13;993:225;;;1076:3;1098:56;1150:3;1138:10;1098:56;;;1086:69;;-1:-1;1178:4;1169:14;;;;1197;;;;;1040:1;1033:9;993:225;;;997:14;574:650;;;;;;;;1250:722;;1378:3;1371:4;1363:6;1359:17;1355:27;1345:2;;1396:1;1393;1386:12;1345:2;1426:6;1420:13;1448:80;1463:64;1520:6;1463:64;;1448:80;1439:89;;1545:5;1570:6;1563:5;1556:21;1600:4;1592:6;1588:17;1578:27;;1622:4;1617:3;1613:14;1606:21;;1675:6;1722:3;1714:4;1706:6;1702:17;1697:3;1693:27;1690:36;1687:2;;;1739:1;1736;1729:12;1687:2;1764:1;1749:217;1774:6;1771:1;1768:13;1749:217;;;1832:3;1854:48;1898:3;1886:10;1854:48;;;1842:61;;-1:-1;1926:4;1917:14;;;;1945;;;;;1796:1;1789:9;1749:217;;1980:128;2055:13;;2073:30;2055:13;2073:30;;2115:130;2182:20;;2207:33;2182:20;2207:33;;2252:158;2333:20;;2358:47;2333:20;2358:47;;2453:628;;2561:4;2549:9;2544:3;2540:19;2536:30;2533:2;;;2579:1;2576;2569:12;2533:2;2597:20;2612:4;2597:20;;;2588:29;-1:-1;2668:1;2700:49;2745:3;2725:9;2700:49;;;2675:75;;-1:-1;2814:2;2847:49;2892:3;2868:22;;;2847:49;;;2840:4;2833:5;2829:16;2822:75;2771:137;2963:2;2996:63;3055:3;3046:6;3035:9;3031:22;2996:63;;;2989:4;2982:5;2978:16;2971:89;2918:153;2527:554;;;;;3804:160;;3916:3;3907:6;3902:3;3898:16;3894:26;3891:2;;;3933:1;3930;3923:12;3891:2;-1:-1;3952:6;3884:80;-1:-1;3884:80;4010:803;;4121:6;4109:9;4104:3;4100:19;4096:32;4093:2;;;4141:1;4138;4131:12;4093:2;4159:20;4174:4;4159:20;;;4150:29;-1:-1;4230:1;4262:49;4307:3;4287:9;4262:49;;;4237:75;;-1:-1;4373:2;4406:49;4451:3;4427:22;;;4406:49;;;4399:4;4392:5;4388:16;4381:75;4333:134;4522:2;4555:68;4619:3;4610:6;4599:9;4595:22;4555:68;;;4548:4;4541:5;4537:16;4530:94;4477:158;4689:3;4723:68;4787:3;4778:6;4767:9;4763:22;4723:68;;;4716:4;4709:5;4705:16;4698:94;4645:158;4087:726;;;;;5711:157;;5820:3;5811:6;5806:3;5802:16;5798:26;5795:2;;;5837:1;5834;5827:12;5911:789;;6023:6;6011:9;6006:3;6002:19;5998:32;5995:2;;;6043:1;6040;6033:12;5995:2;6061:20;6076:4;6061:20;;;6052:29;-1:-1;6130:1;6162:71;6229:3;6209:9;6162:71;;;6137:97;;-1:-1;6298:3;6332:49;6377:3;6353:22;;;6332:49;;;6325:4;6318:5;6314:16;6307:75;6255:138;6445:3;6479:49;6524:3;6515:6;6504:9;6500:22;6479:49;;;6472:4;6465:5;6461:16;6454:75;6403:137;6595:3;6629:49;6674:3;6665:6;6654:9;6650:22;6629:49;;6743:154;;6850:2;6841:6;6836:3;6832:16;6828:25;6825:2;;;6866:1;6863;6856:12;6938:596;;7048:4;7036:9;7031:3;7027:19;7023:30;7020:2;;;7066:1;7063;7056:12;7020:2;7084:20;7099:4;7084:20;;;7075:29;-1:-1;7151:1;7183:47;7226:3;7206:9;7183:47;;;7158:73;;-1:-1;7289:2;7322:49;7367:3;7343:22;;;7322:49;;;7315:4;7308:5;7304:16;7297:75;7252:131;7430:2;7463:49;7508:3;7499:6;7488:9;7484:22;7463:49;;7678:134;7756:13;;7774:33;7756:13;7774:33;;7819:126;7884:20;;7909:31;7884:20;7909:31;;7952:241;;8056:2;8044:9;8035:7;8031:23;8027:32;8024:2;;;8072:1;8069;8062:12;8024:2;8107:1;8124:53;8169:7;8149:9;8124:53;;;8114:63;8018:175;-1:-1;;;;8018:175;8464:408;;8612:2;8600:9;8591:7;8587:23;8583:32;8580:2;;;8628:1;8625;8618:12;8580:2;8663:24;;8707:18;8696:30;;8693:2;;;8739:1;8736;8729:12;8693:2;8759:97;8848:7;8839:6;8828:9;8824:22;8759:97;;8879:392;;9019:2;9007:9;8998:7;8994:23;8990:32;8987:2;;;9035:1;9032;9025:12;8987:2;9070:24;;9114:18;9103:30;;9100:2;;;9146:1;9143;9136:12;9100:2;9166:89;9247:7;9238:6;9227:9;9223:22;9166:89;;9278:257;;9390:2;9378:9;9369:7;9365:23;9361:32;9358:2;;;9406:1;9403;9396:12;9358:2;9441:1;9458:61;9511:7;9491:9;9458:61;;9542:269;;9660:2;9648:9;9639:7;9635:23;9631:32;9628:2;;;9676:1;9673;9666:12;9628:2;9711:1;9728:67;9787:7;9767:9;9728:67;;9818:287;;9945:2;9933:9;9924:7;9920:23;9916:32;9913:2;;;9961:1;9958;9951:12;9913:2;9996:1;10013:76;10081:7;10061:9;10013:76;;10112:298;;10244:3;10232:9;10223:7;10219:23;10215:33;10212:2;;;10261:1;10258;10251:12;10212:2;10296:1;10313:81;10386:7;10366:9;10313:81;;10417:294;;10547:3;10535:9;10526:7;10522:23;10518:33;10515:2;;;10564:1;10561;10554:12;10515:2;10599:1;10616:79;10687:7;10667:9;10616:79;;10718:1014;;;;;;;10978:3;10966:9;10957:7;10953:23;10949:33;10946:2;;;10995:1;10992;10985:12;10946:2;11030:1;11047:78;11117:7;11097:9;11047:78;;;11037:88;;11009:122;11162:3;11181:76;11249:7;11240:6;11229:9;11225:22;11181:76;;;11171:86;;11141:122;11294:3;11313:53;11358:7;11349:6;11338:9;11334:22;11313:53;;;11303:63;;11273:99;11403:3;11422:76;11490:7;11481:6;11470:9;11466:22;11422:76;;;11412:86;;11382:122;11535:3;11554:53;11599:7;11590:6;11579:9;11575:22;11554:53;;;11544:63;;11514:99;11644:3;11663:53;11708:7;11699:6;11688:9;11684:22;11663:53;;;11653:63;;11623:99;10940:792;;;;;;;;;11739:288;;11866:3;11854:9;11845:7;11841:23;11837:33;11834:2;;;11883:1;11880;11873:12;11834:2;11918:1;11935:76;12003:7;11983:9;11935:76;;12034:414;;;12178:3;12166:9;12157:7;12153:23;12149:33;12146:2;;;12195:1;12192;12185:12;12146:2;12230:1;12247:76;12315:7;12295:9;12247:76;;;12237:86;;12209:120;12360:3;12379:53;12424:7;12415:6;12404:9;12400:22;12379:53;;;12369:63;;12339:99;12140:308;;;;;;12455:283;;12580:2;12568:9;12559:7;12555:23;12551:32;12548:2;;;12596:1;12593;12586:12;12548:2;12631:1;12648:74;12714:7;12694:9;12648:74;;12745:263;;12860:2;12848:9;12839:7;12835:23;12831:32;12828:2;;;12876:1;12873;12866:12;12828:2;12911:1;12928:64;12984:7;12964:9;12928:64;;13015:142;13106:45;13145:5;13106:45;;;13101:3;13094:58;13088:69;;;13164:137;13263:32;13289:5;13263:32;;13538:104;13615:21;13630:5;13615:21;;13649:113;13732:24;13750:5;13732:24;;13769:110;13850:23;13867:5;13850:23;;13886:178;13995:63;14052:5;13995:63;;15312:140;15397:49;15440:5;15397:49;;15459:347;;15571:39;15604:5;15571:39;;;15622:71;15686:6;15681:3;15622:71;;;15615:78;;15698:52;15743:6;15738:3;15731:4;15724:5;15720:16;15698:52;;;15771:29;15793:6;15771:29;;;15762:39;;;;15551:255;-1:-1;;;15551:255;15814:373;;15974:67;16038:2;16033:3;15974:67;;;16074:34;16054:55;;-1:-1;;;16138:2;16129:12;;16122:28;16178:2;16169:12;;15960:227;-1:-1;;15960:227;16196:329;;16356:67;16420:2;16415:3;16356:67;;;16456:31;16436:52;;16516:2;16507:12;;16342:183;-1:-1;;16342:183;16534:375;;16694:67;16758:2;16753:3;16694:67;;;16794:34;16774:55;;-1:-1;;;16858:2;16849:12;;16842:30;16900:2;16891:12;;16680:229;-1:-1;;16680:229;16918:327;;17078:67;17142:2;17137:3;17078:67;;;17178:29;17158:50;;17236:2;17227:12;;17064:181;-1:-1;;17064:181;17254:319;;17414:67;17478:2;17473:3;17414:67;;;-1:-1;;;17494:42;;17564:2;17555:12;;17400:173;-1:-1;;17400:173;17582:329;;17742:67;17806:2;17801:3;17742:67;;;17842:31;17822:52;;17902:2;17893:12;;17728:183;-1:-1;;17728:183;17920:370;;18080:67;18144:2;18139:3;18080:67;;;18180:34;18160:55;;-1:-1;;;18244:2;18235:12;;18228:25;18281:2;18272:12;;18066:224;-1:-1;;18066:224;18299:332;;18459:67;18523:2;18518:3;18459:67;;;18559:34;18539:55;;18622:2;18613:12;;18445:186;-1:-1;;18445:186;18640:370;;18800:67;18864:2;18859:3;18800:67;;;18900:34;18880:55;;-1:-1;;;18964:2;18955:12;;18948:25;19001:2;18992:12;;18786:224;-1:-1;;18786:224;19019:260;;19178:65;19241:1;19236:3;19178:65;;19288:312;;19448:67;19512:2;19507:3;19448:67;;;-1:-1;;;19528:35;;19591:2;19582:12;;19434:166;-1:-1;;19434:166;19609:319;;19769:67;19833:2;19828:3;19769:67;;;-1:-1;;;19849:42;;19919:2;19910:12;;19755:173;-1:-1;;19755:173;19937:322;;20097:67;20161:2;20156:3;20097:67;;;-1:-1;;;20177:45;;20250:2;20241:12;;20083:176;-1:-1;;20083:176;20336:730;20463:4;20454:14;;20530:50;20567:5;;20530:50;;;20586:63;20638:3;20620:12;20586:63;;;20483:172;20714:50;20758:4;20751:5;20747:16;20740:5;20714:50;;;20770:63;20827:4;20822:3;20818:14;20804:12;20770:63;;;20665:174;20900:64;20958:4;20951:5;20947:16;20940:5;20900:64;;;20970:75;21039:4;21034:3;21030:14;21016:12;20970:75;;21142:633;21334:23;;21267:4;21258:14;;;21363:63;21262:3;21334:23;21363:63;;;21287:145;21508:4;21501:5;21497:16;21491:23;21520:63;21577:4;21572:3;21568:14;21554:12;21520:63;;;21442:147;21667:4;21660:5;21656:16;21650:23;21679:75;21748:4;21743:3;21739:14;21725:12;21679:75;;21857:1038;22004:6;21995:16;;22073:50;22110:5;;22073:50;;;22129:63;22181:3;22163:12;22129:63;;;22026:172;22254:50;22298:4;22291:5;22287:16;22280:5;22254:50;;;22310:63;22367:4;22362:3;22358:14;22344:12;22310:63;;;22208:171;22440:71;22505:4;22498:5;22494:16;22487:5;22440:71;;;22517:107;22618:4;22613:3;22609:14;22595:12;22517:107;;;22389:241;22690:71;22755:4;22748:5;22744:16;22737:5;22690:71;;;22767:107;22868:4;22863:3;22859:14;22845:12;22767:107;;22977:882;23191:23;;23122:6;23113:16;;;23220:63;23117:3;23191:23;23220:63;;;23144:145;23362:4;23355:5;23351:16;23345:23;23374:63;23431:4;23426:3;23422:14;23408:12;23374:63;;;23299:144;23521:4;23514:5;23510:16;23504:23;23533:105;23632:4;23627:3;23623:14;23609:12;23533:105;;;23453:191;23721:4;23714:5;23710:16;23704:23;23733:105;23832:4;23827:3;23823:14;23809:12;23733:105;;24885:845;25091:23;;25024:6;25015:16;;;25120:111;25019:3;25091:23;25120:111;;;25046:191;25313:4;25306:5;25302:16;25296:23;25325:65;25382:6;25377:3;25373:16;25359:12;25325:65;;;25247:149;25471:4;25464:5;25460:16;25454:23;25483:65;25540:6;25535:3;25531:16;25517:12;25483:65;;;25406:148;25632:4;25625:5;25621:16;25615:23;25644:65;25701:6;25696:3;25692:16;25678:12;25644:65;;25967:107;26046:22;26062:5;26046:22;;26081:213;26199:2;26184:18;;26213:71;26188:9;26257:6;26213:71;;26553:563;26763:3;26748:19;;26778:79;26752:9;26830:6;26778:79;;;26868:72;26936:2;26925:9;26921:18;26912:6;26868:72;;;26951;27019:2;27008:9;27004:18;26995:6;26951:72;;;27034;27102:2;27091:9;27087:18;27078:6;27034:72;;27123:201;27235:2;27220:18;;27249:65;27224:9;27287:6;27249:65;;27331:539;27529:3;27514:19;;27544:71;27518:9;27588:6;27544:71;;;27626:68;27690:2;27679:9;27675:18;27666:6;27626:68;;27877:209;27993:2;27978:18;;28007:69;27982:9;28049:6;28007:69;;28093:265;28237:2;28222:18;;28251:97;28226:9;28321:6;28251:97;;28915:995;29261:3;29246:19;;29276:87;29250:9;29336:6;29276:87;;;29374:72;29442:2;29431:9;29427:18;29418:6;29374:72;;;29457;29525:2;29514:9;29510:18;29501:6;29457:72;;;29540;29608:2;29597:9;29593:18;29584:6;29540:72;;;29623:73;29691:3;29680:9;29676:19;29667:6;29623:73;;;29745:9;29739:4;29735:20;29729:3;29718:9;29714:19;29707:49;29770:130;29895:4;29770:130;;;29762:138;29232:678;-1:-1;;;;;;;29232:678;29917:575;30133:3;30118:19;;30148:85;30122:9;30206:6;30148:85;;;30244:72;30312:2;30301:9;30297:18;30288:6;30244:72;;;30327;30395:2;30384:9;30380:18;30371:6;30327:72;;31633:301;31771:2;31785:47;;;31756:18;;31846:78;31756:18;31910:6;31846:78;;31941:407;32132:2;32146:47;;;32117:18;;32207:131;32117:18;32207:131;;32355:407;32546:2;32560:47;;;32531:18;;32621:131;32531:18;32621:131;;32769:407;32960:2;32974:47;;;32945:18;;33035:131;32945:18;33035:131;;33183:407;33374:2;33388:47;;;33359:18;;33449:131;33359:18;33449:131;;33597:407;33788:2;33802:47;;;33773:18;;33863:131;33773:18;33863:131;;34011:407;34202:2;34216:47;;;34187:18;;34277:131;34187:18;34277:131;;34425:407;34616:2;34630:47;;;34601:18;;34691:131;34601:18;34691:131;;34839:407;35030:2;35044:47;;;35015:18;;35105:131;35015:18;35105:131;;35253:407;35444:2;35458:47;;;35429:18;;35519:131;35429:18;35519:131;;35667:407;35858:2;35872:47;;;35843:18;;35933:131;35843:18;35933:131;;36081:407;36272:2;36286:47;;;36257:18;;36347:131;36257:18;36347:131;;36495:407;36686:2;36700:47;;;36671:18;;36761:131;36671:18;36761:131;;36909:434;37109:3;37094:19;;37124:125;37098:9;37222:6;37124:125;;;37260:73;37328:3;37317:9;37313:19;37304:6;37260:73;;37350:318;37520:3;37505:19;;37535:123;37509:9;37631:6;37535:123;;37675:430;37873:3;37858:19;;37888:123;37862:9;37984:6;37888:123;;38112:306;38276:3;38261:19;;38291:117;38265:9;38381:6;38291:117;;38425:418;38617:3;38602:19;;38632:117;38606:9;38722:6;38632:117;;;38760:73;38828:3;38817:9;38813:19;38804:6;38760:73;;38850:213;38968:2;38953:18;;38982:71;38957:9;39026:6;38982:71;;39070:995;39384:3;39369:19;;39399:71;39373:9;39443:6;39399:71;;;39481:72;39549:2;39538:9;39534:18;39525:6;39481:72;;;39564;39632:2;39621:9;39617:18;39608:6;39564:72;;;39647;39715:2;39704:9;39700:18;39691:6;39647:72;;;39730:73;39798:3;39787:9;39783:19;39774:6;39730:73;;;39814;39882:3;39871:9;39867:19;39858:6;39814:73;;;39898;39966:3;39955:9;39951:19;39942:6;39898:73;;;39982;40050:3;40039:9;40035:19;40026:6;39982:73;;;39355:710;;;;;;;;;;;;40072:256;40134:2;40128:9;40160:17;;;40235:18;40220:34;;40256:22;;;40217:62;40214:2;;;40292:1;40289;40282:12;40214:2;40308;40301:22;40112:216;;-1:-1;40112:216;40335:312;;40502:18;40494:6;40491:30;40488:2;;;40534:1;40531;40524:12;40488:2;-1:-1;40569:4;40557:17;;;40622:15;;40425:222;40965:122;41053:12;;41024:63;41095:162;41197:19;;;41246:4;41237:14;;41190:67;41438:119;;41512:39;41547:2;41542:3;41538:12;41533:3;41512:39;;41566:147;;41654:53;41703:2;41698:3;41694:12;41689:3;41654:53;;41722:104;-1:-1;41817:3;41801:25;41835:119;;41909:39;41944:2;41939:3;41935:12;41930:3;41909:39;;41962:91;;42024:24;42042:5;42024:24;;42166:85;42232:13;42225:21;;42208:43;42258:72;42320:5;42303:27;42337:144;-1:-1;;;;;;42398:78;;42381:100;42488:134;42564:5;42570:47;42564:5;42570:47;;42629:121;-1:-1;;;;;42691:54;;42674:76;42836:81;42907:4;42896:16;;42879:38;42924:129;;43011:37;43042:5;43060:173;;43165:63;43222:5;43165:63;;45547:134;;45638:38;45670:5;45638:38;;45932:268;45997:1;46004:101;46018:6;46015:1;46012:13;46004:101;;;46085:11;;;46079:18;46066:11;;;46059:39;46040:2;46033:10;46004:101;;;46120:6;46117:1;46114:13;46111:2;;;-1:-1;;46185:1;46167:16;;46160:27;45981:219;46208:97;46296:2;46276:14;-1:-1;;46272:28;;46256:49;46313:105;46396:1;46389:5;46386:12;46376:2;;46402:9;46425:117;46494:24;46512:5;46494:24;;;46487:5;46484:35;46474:2;;46533:1;46530;46523:12;46689:111;46755:21;46770:5;46755:21;;46807:117;46876:24;46894:5;46876:24;;46931:108;47014:1;47007:5;47004:12;46994:2;;47030:1;47027;47020:12;47170:113;47237:22;47253:5;47237:22;
Swarm Source
bzzr://559aa28e28a92b415b945f053776f237c6d6a776c69f445be4800b11f7d401db
Loading...
Loading
Loading...
Loading
OVERVIEW
Rarible NFT Exchange contractLoading...
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.