Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ExchangeV1
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-01-14 */ /** *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"},{"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
60806040523480156200001157600080fd5b506040516200290538038062002905833981016040819052620000349162000139565b6000620000496001600160e01b036200011516565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600380546001600160a01b03199081166001600160a01b03998a16179091556004805482169789169790971790965560058054871695881695909517909455600680548616938716939093179092556007805485169186169190911790556001805484169185169190911790556002805490921692169190911790556200022f565b3390565b805162000126816200020a565b92915050565b8051620001268162000224565b600080600080600080600060e0888a0312156200015557600080fd5b6000620001638a8a6200012c565b9750506020620001768a828b016200012c565b9650506040620001898a828b016200012c565b95505060606200019c8a828b016200012c565b9450506080620001af8a828b016200012c565b93505060a0620001c28a828b0162000119565b92505060c0620001d58a828b0162000119565b91505092959891949750929550565b60006200012682620001fe565b60006200012682620001e4565b6001600160a01b031690565b6200021581620001e4565b81146200022157600080fd5b50565b6200021581620001f1565b6126c6806200023f6000396000f3fe6080604052600436106100fe5760003560e01c8063715018a611610095578063a1fd8e3011610064578063a1fd8e301461026a578063c19d93fb1461027d578063ca120b1f14610292578063f2fde38b146102b2578063fee03e9e146102d2576100fe565b8063715018a6146102095780638da5cb5b1461021e5780638f32d59b146102335780639704dc4414610255576100fe565b806338af3eed116100d157806338af3eed1461019d5780634df97bc5146101bf57806355d5d326146101d45780636e667db3146101f4576100fe565b806302329e1014610103578063049944b61461012e5780631b4c98741461015b5780631c31f7101461017b575b600080fd5b34801561010f57600080fd5b506101186102e7565b60405161012591906122e7565b60405180910390f35b34801561013a57600080fd5b5061014e610149366004611d44565b6102f6565b604051610125919061237b565b34801561016757600080fd5b5061014e610176366004611d63565b61032f565b34801561018757600080fd5b5061019b610196366004611ba2565b610350565b005b3480156101a957600080fd5b506101b261039f565b604051610125919061226d565b3480156101cb57600080fd5b506101b26103ae565b3480156101e057600080fd5b5061019b6101ef366004611ba2565b6103bd565b34801561020057600080fd5b50610118610403565b34801561021557600080fd5b5061019b610412565b34801561022a57600080fd5b506101b2610480565b34801561023f57600080fd5b5061024861048f565b60405161012591906122b0565b34801561026157600080fd5b506101186104b3565b61019b610278366004611cca565b6104c2565b34801561028957600080fd5b506101186106a5565b34801561029e57600080fd5b5061019b6102ad366004611c8c565b6106b4565b3480156102be57600080fd5b5061019b6102cd366004611ba2565b6107c2565b3480156102de57600080fd5b506101186107f2565b6004546001600160a01b031681565b60606103278260405160200161030c9190612477565b60405160208183030381529060405280519060200120610801565b90505b919050565b6060610347838360405160200161030c929190612486565b90505b92915050565b61035861048f565b61037d5760405162461bcd60e51b8152600401610374906123ec565b60405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b6002546001600160a01b031681565b6103c561048f565b6103e15760405162461bcd60e51b8152600401610374906123ec565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031681565b61041a61048f565b6104365760405162461bcd60e51b8152600401610374906123ec565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b600080546001600160a01b03166104a4610914565b6001600160a01b031614905090565b6007546001600160a01b031681565b6104e86104d436879003870187611d44565b6104e336879003870187611d9f565b610918565b60006105146101008701356105086101208901358663ffffffff610a4516565b9063ffffffff610a7f16565b905061053461052836889003880188611cab565b87610100013585610ac1565b600061054660a0880160808901611c50565b600481111561055157fe5b141561056f5760405162461bcd60e51b8152600401610374906123fc565b6000610582610100880160e08901611c50565b600481111561058d57fe5b141561059d5761059d8185610be3565b60006105c86105b260a0890160808a01611c50565b6105c36101008a0160e08b01611c50565b610c1d565b90506001600160a01b0383166105dc573392505b6106326105f136899003890160408a01611c6e565b856105ff60208b018b611ba2565b86600186600281111561060e57fe5b148a8d61014001358e60000160a00180360361062d9190810190611c6e565b610cac565b61068361064736899003890160a08a01611c6e565b833361065660208c018c611ba2565b600286600281111561066457fe5b148c61014001358b8e60000160400180360361062d9190810190611c6e565b61069c61069536899003890189611d44565b8585610cdb565b50505050505050565b6006546001600160a01b031681565b336106c26020830183611ba2565b6001600160a01b0316146106e85760405162461bcd60e51b81526004016103749061240c565b600654604051631d03b74d60e11b81526001600160a01b0390911690633a076e9a9061071c9084906000199060040161243c565b600060405180830381600087803b15801561073657600080fd5b505af115801561074a573d6000803e3d6000fd5b50505060608201803591506107629060408401611ba2565b6001600160a01b03167fbfe0e802e586c99960de1a111c80f598b281996d65080d74dbe29986f55b274a3361079d60c0860160a08701611ba2565b6040516107b792919060c08801359060208901359061227b565b60405180910390a350565b6107ca61048f565b6107e65760405162461bcd60e51b8152600401610374906123ec565b6107ef81610d5a565b50565b6005546001600160a01b031681565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151828152606081810184529283919060208201818038833901905050905060005b602081101561090c5782600486836020811061086157fe5b1a60f81b6001600160f81b031916901c60f81c60ff168151811061088157fe5b602001015160f81c60f81b82826002028151811061089b57fe5b60200101906001600160f81b031916908160001a905350828582602081106108bf57fe5b825191901a600f169081106108d057fe5b602001015160f81c60f81b8282600202600101815181106108ed57fe5b60200101906001600160f81b031916908160001a905350600101610849565b509392505050565b3390565b805160ff1615801561092c57506020810151155b801561093a57506040810151155b156109e057600754604051632aee7a3160e01b81526001600160a01b0390911690632aee7a319061096f908590600401612477565b60206040518083038186803b15801561098757600080fd5b505afa15801561099b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109bf9190810190611c32565b6109db5760405162461bcd60e51b8152600401610374906123cc565b610a41565b8160000151600001516001600160a01b0316610a1b826000015183602001518460400151610a0d876102f6565b92919063ffffffff610ddb16565b6001600160a01b031614610a415760405162461bcd60e51b8152600401610374906123cc565b5050565b600082610a545750600061034a565b82820282848281610a6157fe5b04146103475760405162461bcd60e51b8152600401610374906123dc565b600061034783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610eb8565b6006546040516303ec000360e61b81526000916001600160a01b03169063fb0000c090610af2908790600401612459565b60206040518083038186803b158015610b0a57600080fd5b505afa158015610b1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b429190810190611dbd565b90506000610b56828463ffffffff610ef116565b905083811115610b785760405162461bcd60e51b81526004016103749061238c565b600654604051631d03b74d60e11b81526001600160a01b0390911690633a076e9a90610baa9088908590600401612468565b600060405180830381600087803b158015610bc457600080fd5b505af1158015610bd8573d6000803e3d6000fd5b505050505050505050565b6000610bf5838363ffffffff610f1616565b90508083013414610c185760405162461bcd60e51b81526004016103749061242c565b505050565b60006003836004811115610c2d57fe5b1480610c4457506004836004811115610c4257fe5b145b8015610c7057506003826004811115610c5957fe5b1480610c7057506004826004811115610c6e57fe5b145b15610c7d5750600061034a565b816004811115610c8957fe5b836004811115610c9557fe5b1115610ca35750600261034a565b50600192915050565b83610cc257610cbd88888888610f2e565b610cd1565b610cd188888888878787611181565b5050505050505050565b825160408082015160208082015191518188015185516060870151805190850151878c01519590980151965195976001600160a01b03909416967fdddcdb07e460849cf04a4445b7af9faf01b7f5c7ba75deaf969ac5ed830312c396610d4d9694959394929392918b918d91906124b1565b60405180910390a3505050565b6001600160a01b038116610d805760405162461bcd60e51b8152600401610374906123ac565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600060608590506060610e546040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a000000000000815250610e278451611486565b60408051600080825260208201818152828401828152606084019283526080840190945288939091611547565b90506001818051906020012087878760405160008152602001604052604051610e8094939291906122be565b6020604051602081039080840390855afa158015610ea2573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b60008183610ed95760405162461bcd60e51b8152600401610374919061237b565b506000838581610ee557fe5b049150505b9392505050565b6000828201838110156103475760405162461bcd60e51b8152600401610374906123bc565b6000610347612710610508858563ffffffff610a4516565b600084604001516004811115610f4057fe5b1415610f855760405181906001600160a01b0382169085156108fc029086906000818181858888f19350505050158015610f7e573d6000803e3d6000fd5b505061117b565b600184604001516004811115610f9757fe5b141561102c57602084015115610fbf5760405162461bcd60e51b81526004016103749061241c565b600554845160405163776062c360e01b81526001600160a01b039092169163776062c391610ff591869086908990600401612353565b600060405180830381600087803b15801561100f57600080fd5b505af1158015611023573d6000803e3d6000fd5b5050505061117b565b60038460400151600481111561103e57fe5b141561109f57826001146110645760405162461bcd60e51b81526004016103749061239c565b60035484516020860151604051637b84dc8360e11b81526001600160a01b039093169263f709b90692610ff592909187918791600401612353565b6004846040015160048111156110b157fe5b141561111057826001146110d75760405162461bcd60e51b81526004016103749061239c565b60048054855160208701516040516321143af960e21b81526001600160a01b0390931693638450ebe493610ff593928892889201612353565b60035484516020860151604051639c1c2ee960e01b81526001600160a01b0390931692639c1c2ee99261114d929091879187918a906004016122f5565b600060405180830381600087803b15801561116757600080fd5b505af1158015610cd1573d6000803e3d6000fd5b50505050565b600061119088878987876117ed565b90506002826040015160048111156111a457fe5b148015611232575081516040516301ffc9a760e01b81526001600160a01b03909116906301ffc9a7906111e290632dde656160e21b906004016122d9565b60206040518083038186803b1580156111fa57600080fd5b505afa15801561120e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112329190810190611c32565b806112f2575060038260400151600481111561124a57fe5b1480611265575060048260400151600481111561126357fe5b145b80156112f2575081516040516301ffc9a760e01b81526001600160a01b03909116906301ffc9a7906112a290632dde656160e21b906004016122d9565b60206040518083038186803b1580156112ba57600080fd5b505afa1580156112ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112f29190810190611c32565b15611479578151602083015160405163b9c4d9fb60e01b81526060916001600160a01b0384169163b9c4d9fb9161132b916004016124a3565b60006040518083038186803b15801561134357600080fd5b505afa158015611357573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261137f9190810190611bc8565b90506060826001600160a01b0316630ebd4c7f86602001516040518263ffffffff1660e01b81526004016113b391906124a3565b60006040518083038186803b1580156113cb57600080fd5b505afa1580156113df573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114079190810190611bfd565b9050815181511461141757600080fd5b60005b815181101561147457600080611444878e86868151811061143757fe5b602002602001015161185b565b9150915081965061146a8e828e88878151811061145d57fe5b6020026020010151610f2e565b505060010161141a565b505050505b84610bd889838984610f2e565b6060816114ab57506040805180820190915260018152600360fc1b602082015261032a565b8160005b81156114c357600101600a820491506114af565b6060816040519080825280601f01601f1916602001820160405280156114f0576020820181803883390190505b50905060001982015b851561153e57600a860660300160f81b8282806001900393508151811061151c57fe5b60200101906001600160f81b031916908160001a905350600a860495506114f9565b50949350505050565b60608082518451865188518a518c518e510101010101016040519080825280601f01601f191660200182016040528015611588576020820181803883390190505b5090506000805b8a518110156115e0578a81815181106115a457fe5b602001015160f81c60f81b8383806001019450815181106115c157fe5b60200101906001600160f81b031916908160001a90535060010161158f565b5060005b8951811015611635578981815181106115f957fe5b602001015160f81c60f81b83838060010194508151811061161657fe5b60200101906001600160f81b031916908160001a9053506001016115e4565b5060005b885181101561168a5788818151811061164e57fe5b602001015160f81c60f81b83838060010194508151811061166b57fe5b60200101906001600160f81b031916908160001a905350600101611639565b5060005b87518110156116df578781815181106116a357fe5b602001015160f81c60f81b8383806001019450815181106116c057fe5b60200101906001600160f81b031916908160001a90535060010161168e565b5060005b8651811015611734578681815181106116f857fe5b602001015160f81c60f81b83838060010194508151811061171557fe5b60200101906001600160f81b031916908160001a9053506001016116e3565b5060005b85518110156117895785818151811061174d57fe5b602001015160f81c60f81b83838060010194508151811061176a57fe5b60200101906001600160f81b031916908160001a905350600101611738565b5060005b84518110156117de578481815181106117a257fe5b602001015160f81c60f81b8383806001019450815181106117bf57fe5b60200101906001600160f81b031916908160001a90535060010161178d565b50909998505050505050505050565b60008060006117fd86878761185b565b90925090506000611814878663ffffffff610f1616565b90506000611828828463ffffffff610ef116565b9050801561184b5760015461184b908b9083908c906001600160a01b0316610f2e565b5091925050505b95945050505050565b60008061187785611872868663ffffffff610f1616565b611883565b91509150935093915050565b60008082841115611899575050808203816118a0565b5060009050825b9250929050565b803561034a81612647565b805161034a81612647565b600082601f8301126118ce57600080fd5b81516118e16118dc8261254f565b612528565b9150818183526020840193506020810190508385602084028201111561190657600080fd5b60005b83811015611932578161191c88826118b2565b8452506020928301929190910190600101611909565b5050505092915050565b600082601f83011261194d57600080fd5b815161195b6118dc8261254f565b9150818183526020840193506020810190508385602084028201111561198057600080fd5b60005b8381101561193257816119968882611b8c565b8452506020928301929190910190600101611983565b805161034a8161265b565b803561034a81612664565b803561034a8161266d565b6000606082840312156119df57600080fd5b6119e96060612528565b905060006119f784846118a7565b8252506020611a08848483016119b7565b6020830152506040611a1c848285016119c2565b60408301525092915050565b60006101008284031215611a3b57600080fd5b50919050565b60006101008284031215611a5457600080fd5b611a5e6080612528565b90506000611a6c84846118a7565b8252506020611a7d848483016119b7565b6020830152506040611a91848285016119cd565b60408301525060a0611aa5848285016119cd565b60608301525092915050565b60006101608284031215611a3b57600080fd5b60006101608284031215611ad757600080fd5b611ae16080612528565b90506000611aef8484611a41565b825250610100611b01848483016119b7565b602083015250610120611b16848285016119b7565b604083015250610140611aa5848285016119b7565b600060608284031215611a3b57600080fd5b600060608284031215611b4f57600080fd5b611b596060612528565b90506000611b678484611b97565b8252506020611b78848483016119b7565b6020830152506040611a1c848285016119b7565b805161034a81612664565b803561034a8161267a565b600060208284031215611bb457600080fd5b6000611bc084846118a7565b949350505050565b600060208284031215611bda57600080fd5b815167ffffffffffffffff811115611bf157600080fd5b611bc0848285016118bd565b600060208284031215611c0f57600080fd5b815167ffffffffffffffff811115611c2657600080fd5b611bc08482850161193c565b600060208284031215611c4457600080fd5b6000611bc084846119ac565b600060208284031215611c6257600080fd5b6000611bc084846119c2565b600060608284031215611c8057600080fd5b6000611bc084846119cd565b60006101008284031215611c9f57600080fd5b6000611bc08484611a28565b60006101008284031215611cbe57600080fd5b6000611bc08484611a41565b60008060008060006102208688031215611ce357600080fd5b6000611cef8888611ab1565b955050610160611d0188828901611b2b565b9450506101c0611d13888289016119b7565b9350506101e0611d25888289016119b7565b925050610200611d37888289016118a7565b9150509295509295909350565b60006101608284031215611d5757600080fd5b6000611bc08484611ac4565b6000806101808385031215611d7757600080fd5b6000611d838585611ac4565b925050610160611d95858286016119b7565b9150509250929050565b600060608284031215611db157600080fd5b6000611bc08484611b3d565b600060208284031215611dcf57600080fd5b6000611bc08484611b8c565b611de4816125ea565b82525050565b611de4816125ae565b611de4816125b9565b611de4816125be565b611de4816125c1565b611de4816125f1565b611de4816125fc565b6000611e2b82612570565b611e358185612574565b9350611e45818560208601612607565b611e4e81612633565b9093019392505050565b6000611e65602483612574565b7f6e6f7420656e6f7567682073746f636b206f66206f7264657220666f7220627581526379696e6760e01b602082015260400192915050565b6000611eab601d83612574565b7f76616c75652073686f756c64206265203120666f72204552432d373231000000815260200192915050565b6000611ee4602683612574565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b6000611f2c601b83612574565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000611f65601383612574565b72696e636f7272656374207369676e617475726560681b815260200192915050565b6000611f94602183612574565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000611fd7602083612574565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000612010602183612574565b7f455448206973206e6f7420737570706f72746564206f6e2073656c6c207369648152606560f81b602082015260400192915050565b600061034a600083612574565b6000612060600c83612574565b6b3737ba1030b71037bbb732b960a11b815260200192915050565b6000612088601383612574565b720746f6b656e49642073686f756c64206265203606c1b815260200192915050565b60006120b7601683612574565b751b5cd9cb9d985b1d59481a5cc81a5b98dbdc9c9958dd60521b815260200192915050565b606082016120ea828061257d565b6120f48482611dea565b50612102602083018361259f565b61210f6020850182611dfc565b5061211d604083018361258c565b61117b6040850182611e17565b8051606083019061213b8482611dea565b50602082015161214e6020850182611dfc565b50604082015161117b6040850182611e17565b6101008201612170828061257d565b61217a8482611dea565b50612188602083018361259f565b6121956020850182611dfc565b506121a3604083018361259b565b6121b060408501826120dc565b506121be60a083018361259b565b61117b60a08501826120dc565b80516101008301906121dd8482611dea565b5060208201516121f06020850182611dfc565b506040820151612203604085018261212a565b50606082015161117b60a085018261212a565b805161016083019061222884826121cb565b50602082015161223c610100850182611dfc565b506040820151612250610120850182611dfc565b50606082015161117b610140850182611dfc565b611de4816125e4565b6020810161034a8284611dea565b608081016122898287611ddb565b6122966020830186611dea565b6122a36040830185611dfc565b6118526060830184611dfc565b6020810161034a8284611df3565b608081016122cc8287611dfc565b6122966020830186612264565b6020810161034a8284611e05565b6020810161034a8284611e0e565b60c081016123038288611e0e565b6123106020830187611dea565b61231d6040830186611dea565b61232a6060830185611dfc565b6123376080830184611dfc565b81810360a083015261234881612046565b979650505050505050565b608081016123618287611e0e565b61236e6020830186611dea565b6122a36040830185611dea565b602080825281016103478184611e20565b6020808252810161032781611e58565b6020808252810161032781611e9e565b6020808252810161032781611ed7565b6020808252810161032781611f1f565b6020808252810161032781611f58565b6020808252810161032781611f87565b6020808252810161032781611fca565b6020808252810161032781612003565b6020808252810161032781612053565b602080825281016103278161207b565b60208082528101610327816120aa565b610120810161244b8285612161565b610eea610100830184611dfc565b610100810161034a82846121cb565b610120810161244b82856121cb565b610160810161034a8284612216565b61018081016124958285612216565b610eea610160830184611dfc565b6020810161034a8284611dfc565b61010081016124c0828b611dfc565b6124cd602083018a611dea565b6124da6040830189611dea565b6124e76060830188611dfc565b6124f46080830187611dfc565b61250160a0830186611dea565b61250e60c0830185611dfc565b61251b60e0830184611dfc565b9998505050505050505050565b60405181810167ffffffffffffffff8111828210171561254757600080fd5b604052919050565b600067ffffffffffffffff82111561256657600080fd5b5060209081020190565b5190565b90815260200190565b600061034760208401846118a7565b600061034760208401846119c2565b5090565b600061034760208401846119b7565b6000610327826125d8565b151590565b90565b6001600160e01b03191690565b8061032a8161263d565b6001600160a01b031690565b60ff1690565b6000610327825b6000610327826125ae565b6000610327826125ce565b60005b8381101561262257818101518382015260200161260a565b8381111561117b5750506000910152565b601f01601f191690565b600581106107ef57fe5b612650816125ae565b81146107ef57600080fd5b612650816125b9565b612650816125be565b600581106107ef57600080fd5b612650816125e456fea365627a7a72315820fe64246338c31ef223c612c5abeea3c6f17dcd52a47ac8da80ca2e63a4cf87ef6c6578706572696d656e74616cf564736f6c634300051100400000000000000000000000003fded36b6d10d7e0cbdd8847f3f9d76700241271000000000000000000000000672cfe8471922ff3fb8da73bb0ae2c0063cba85000000000000000000000000013594fdc7630942dfbd9b38e0f55e0b23f8332160000000000000000000000008b306028d6a37979692611b5c3f3d6d3e63b9a6800000000000000000000000084035a6b60aceef6c3009d84fc99cfd9e5a4c7f20000000000000000000000007b1908bd786e31db976560071e40556b7ac919690000000000000000000000007b1908bd786e31db976560071e40556b7ac91969
Deployed Bytecode
0x6080604052600436106100fe5760003560e01c8063715018a611610095578063a1fd8e3011610064578063a1fd8e301461026a578063c19d93fb1461027d578063ca120b1f14610292578063f2fde38b146102b2578063fee03e9e146102d2576100fe565b8063715018a6146102095780638da5cb5b1461021e5780638f32d59b146102335780639704dc4414610255576100fe565b806338af3eed116100d157806338af3eed1461019d5780634df97bc5146101bf57806355d5d326146101d45780636e667db3146101f4576100fe565b806302329e1014610103578063049944b61461012e5780631b4c98741461015b5780631c31f7101461017b575b600080fd5b34801561010f57600080fd5b506101186102e7565b60405161012591906122e7565b60405180910390f35b34801561013a57600080fd5b5061014e610149366004611d44565b6102f6565b604051610125919061237b565b34801561016757600080fd5b5061014e610176366004611d63565b61032f565b34801561018757600080fd5b5061019b610196366004611ba2565b610350565b005b3480156101a957600080fd5b506101b261039f565b604051610125919061226d565b3480156101cb57600080fd5b506101b26103ae565b3480156101e057600080fd5b5061019b6101ef366004611ba2565b6103bd565b34801561020057600080fd5b50610118610403565b34801561021557600080fd5b5061019b610412565b34801561022a57600080fd5b506101b2610480565b34801561023f57600080fd5b5061024861048f565b60405161012591906122b0565b34801561026157600080fd5b506101186104b3565b61019b610278366004611cca565b6104c2565b34801561028957600080fd5b506101186106a5565b34801561029e57600080fd5b5061019b6102ad366004611c8c565b6106b4565b3480156102be57600080fd5b5061019b6102cd366004611ba2565b6107c2565b3480156102de57600080fd5b506101186107f2565b6004546001600160a01b031681565b60606103278260405160200161030c9190612477565b60405160208183030381529060405280519060200120610801565b90505b919050565b6060610347838360405160200161030c929190612486565b90505b92915050565b61035861048f565b61037d5760405162461bcd60e51b8152600401610374906123ec565b60405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b6002546001600160a01b031681565b6103c561048f565b6103e15760405162461bcd60e51b8152600401610374906123ec565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031681565b61041a61048f565b6104365760405162461bcd60e51b8152600401610374906123ec565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b600080546001600160a01b03166104a4610914565b6001600160a01b031614905090565b6007546001600160a01b031681565b6104e86104d436879003870187611d44565b6104e336879003870187611d9f565b610918565b60006105146101008701356105086101208901358663ffffffff610a4516565b9063ffffffff610a7f16565b905061053461052836889003880188611cab565b87610100013585610ac1565b600061054660a0880160808901611c50565b600481111561055157fe5b141561056f5760405162461bcd60e51b8152600401610374906123fc565b6000610582610100880160e08901611c50565b600481111561058d57fe5b141561059d5761059d8185610be3565b60006105c86105b260a0890160808a01611c50565b6105c36101008a0160e08b01611c50565b610c1d565b90506001600160a01b0383166105dc573392505b6106326105f136899003890160408a01611c6e565b856105ff60208b018b611ba2565b86600186600281111561060e57fe5b148a8d61014001358e60000160a00180360361062d9190810190611c6e565b610cac565b61068361064736899003890160a08a01611c6e565b833361065660208c018c611ba2565b600286600281111561066457fe5b148c61014001358b8e60000160400180360361062d9190810190611c6e565b61069c61069536899003890189611d44565b8585610cdb565b50505050505050565b6006546001600160a01b031681565b336106c26020830183611ba2565b6001600160a01b0316146106e85760405162461bcd60e51b81526004016103749061240c565b600654604051631d03b74d60e11b81526001600160a01b0390911690633a076e9a9061071c9084906000199060040161243c565b600060405180830381600087803b15801561073657600080fd5b505af115801561074a573d6000803e3d6000fd5b50505060608201803591506107629060408401611ba2565b6001600160a01b03167fbfe0e802e586c99960de1a111c80f598b281996d65080d74dbe29986f55b274a3361079d60c0860160a08701611ba2565b6040516107b792919060c08801359060208901359061227b565b60405180910390a350565b6107ca61048f565b6107e65760405162461bcd60e51b8152600401610374906123ec565b6107ef81610d5a565b50565b6005546001600160a01b031681565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151828152606081810184529283919060208201818038833901905050905060005b602081101561090c5782600486836020811061086157fe5b1a60f81b6001600160f81b031916901c60f81c60ff168151811061088157fe5b602001015160f81c60f81b82826002028151811061089b57fe5b60200101906001600160f81b031916908160001a905350828582602081106108bf57fe5b825191901a600f169081106108d057fe5b602001015160f81c60f81b8282600202600101815181106108ed57fe5b60200101906001600160f81b031916908160001a905350600101610849565b509392505050565b3390565b805160ff1615801561092c57506020810151155b801561093a57506040810151155b156109e057600754604051632aee7a3160e01b81526001600160a01b0390911690632aee7a319061096f908590600401612477565b60206040518083038186803b15801561098757600080fd5b505afa15801561099b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109bf9190810190611c32565b6109db5760405162461bcd60e51b8152600401610374906123cc565b610a41565b8160000151600001516001600160a01b0316610a1b826000015183602001518460400151610a0d876102f6565b92919063ffffffff610ddb16565b6001600160a01b031614610a415760405162461bcd60e51b8152600401610374906123cc565b5050565b600082610a545750600061034a565b82820282848281610a6157fe5b04146103475760405162461bcd60e51b8152600401610374906123dc565b600061034783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610eb8565b6006546040516303ec000360e61b81526000916001600160a01b03169063fb0000c090610af2908790600401612459565b60206040518083038186803b158015610b0a57600080fd5b505afa158015610b1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b429190810190611dbd565b90506000610b56828463ffffffff610ef116565b905083811115610b785760405162461bcd60e51b81526004016103749061238c565b600654604051631d03b74d60e11b81526001600160a01b0390911690633a076e9a90610baa9088908590600401612468565b600060405180830381600087803b158015610bc457600080fd5b505af1158015610bd8573d6000803e3d6000fd5b505050505050505050565b6000610bf5838363ffffffff610f1616565b90508083013414610c185760405162461bcd60e51b81526004016103749061242c565b505050565b60006003836004811115610c2d57fe5b1480610c4457506004836004811115610c4257fe5b145b8015610c7057506003826004811115610c5957fe5b1480610c7057506004826004811115610c6e57fe5b145b15610c7d5750600061034a565b816004811115610c8957fe5b836004811115610c9557fe5b1115610ca35750600261034a565b50600192915050565b83610cc257610cbd88888888610f2e565b610cd1565b610cd188888888878787611181565b5050505050505050565b825160408082015160208082015191518188015185516060870151805190850151878c01519590980151965195976001600160a01b03909416967fdddcdb07e460849cf04a4445b7af9faf01b7f5c7ba75deaf969ac5ed830312c396610d4d9694959394929392918b918d91906124b1565b60405180910390a3505050565b6001600160a01b038116610d805760405162461bcd60e51b8152600401610374906123ac565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600060608590506060610e546040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a000000000000815250610e278451611486565b60408051600080825260208201818152828401828152606084019283526080840190945288939091611547565b90506001818051906020012087878760405160008152602001604052604051610e8094939291906122be565b6020604051602081039080840390855afa158015610ea2573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b60008183610ed95760405162461bcd60e51b8152600401610374919061237b565b506000838581610ee557fe5b049150505b9392505050565b6000828201838110156103475760405162461bcd60e51b8152600401610374906123bc565b6000610347612710610508858563ffffffff610a4516565b600084604001516004811115610f4057fe5b1415610f855760405181906001600160a01b0382169085156108fc029086906000818181858888f19350505050158015610f7e573d6000803e3d6000fd5b505061117b565b600184604001516004811115610f9757fe5b141561102c57602084015115610fbf5760405162461bcd60e51b81526004016103749061241c565b600554845160405163776062c360e01b81526001600160a01b039092169163776062c391610ff591869086908990600401612353565b600060405180830381600087803b15801561100f57600080fd5b505af1158015611023573d6000803e3d6000fd5b5050505061117b565b60038460400151600481111561103e57fe5b141561109f57826001146110645760405162461bcd60e51b81526004016103749061239c565b60035484516020860151604051637b84dc8360e11b81526001600160a01b039093169263f709b90692610ff592909187918791600401612353565b6004846040015160048111156110b157fe5b141561111057826001146110d75760405162461bcd60e51b81526004016103749061239c565b60048054855160208701516040516321143af960e21b81526001600160a01b0390931693638450ebe493610ff593928892889201612353565b60035484516020860151604051639c1c2ee960e01b81526001600160a01b0390931692639c1c2ee99261114d929091879187918a906004016122f5565b600060405180830381600087803b15801561116757600080fd5b505af1158015610cd1573d6000803e3d6000fd5b50505050565b600061119088878987876117ed565b90506002826040015160048111156111a457fe5b148015611232575081516040516301ffc9a760e01b81526001600160a01b03909116906301ffc9a7906111e290632dde656160e21b906004016122d9565b60206040518083038186803b1580156111fa57600080fd5b505afa15801561120e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112329190810190611c32565b806112f2575060038260400151600481111561124a57fe5b1480611265575060048260400151600481111561126357fe5b145b80156112f2575081516040516301ffc9a760e01b81526001600160a01b03909116906301ffc9a7906112a290632dde656160e21b906004016122d9565b60206040518083038186803b1580156112ba57600080fd5b505afa1580156112ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112f29190810190611c32565b15611479578151602083015160405163b9c4d9fb60e01b81526060916001600160a01b0384169163b9c4d9fb9161132b916004016124a3565b60006040518083038186803b15801561134357600080fd5b505afa158015611357573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261137f9190810190611bc8565b90506060826001600160a01b0316630ebd4c7f86602001516040518263ffffffff1660e01b81526004016113b391906124a3565b60006040518083038186803b1580156113cb57600080fd5b505afa1580156113df573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114079190810190611bfd565b9050815181511461141757600080fd5b60005b815181101561147457600080611444878e86868151811061143757fe5b602002602001015161185b565b9150915081965061146a8e828e88878151811061145d57fe5b6020026020010151610f2e565b505060010161141a565b505050505b84610bd889838984610f2e565b6060816114ab57506040805180820190915260018152600360fc1b602082015261032a565b8160005b81156114c357600101600a820491506114af565b6060816040519080825280601f01601f1916602001820160405280156114f0576020820181803883390190505b50905060001982015b851561153e57600a860660300160f81b8282806001900393508151811061151c57fe5b60200101906001600160f81b031916908160001a905350600a860495506114f9565b50949350505050565b60608082518451865188518a518c518e510101010101016040519080825280601f01601f191660200182016040528015611588576020820181803883390190505b5090506000805b8a518110156115e0578a81815181106115a457fe5b602001015160f81c60f81b8383806001019450815181106115c157fe5b60200101906001600160f81b031916908160001a90535060010161158f565b5060005b8951811015611635578981815181106115f957fe5b602001015160f81c60f81b83838060010194508151811061161657fe5b60200101906001600160f81b031916908160001a9053506001016115e4565b5060005b885181101561168a5788818151811061164e57fe5b602001015160f81c60f81b83838060010194508151811061166b57fe5b60200101906001600160f81b031916908160001a905350600101611639565b5060005b87518110156116df578781815181106116a357fe5b602001015160f81c60f81b8383806001019450815181106116c057fe5b60200101906001600160f81b031916908160001a90535060010161168e565b5060005b8651811015611734578681815181106116f857fe5b602001015160f81c60f81b83838060010194508151811061171557fe5b60200101906001600160f81b031916908160001a9053506001016116e3565b5060005b85518110156117895785818151811061174d57fe5b602001015160f81c60f81b83838060010194508151811061176a57fe5b60200101906001600160f81b031916908160001a905350600101611738565b5060005b84518110156117de578481815181106117a257fe5b602001015160f81c60f81b8383806001019450815181106117bf57fe5b60200101906001600160f81b031916908160001a90535060010161178d565b50909998505050505050505050565b60008060006117fd86878761185b565b90925090506000611814878663ffffffff610f1616565b90506000611828828463ffffffff610ef116565b9050801561184b5760015461184b908b9083908c906001600160a01b0316610f2e565b5091925050505b95945050505050565b60008061187785611872868663ffffffff610f1616565b611883565b91509150935093915050565b60008082841115611899575050808203816118a0565b5060009050825b9250929050565b803561034a81612647565b805161034a81612647565b600082601f8301126118ce57600080fd5b81516118e16118dc8261254f565b612528565b9150818183526020840193506020810190508385602084028201111561190657600080fd5b60005b83811015611932578161191c88826118b2565b8452506020928301929190910190600101611909565b5050505092915050565b600082601f83011261194d57600080fd5b815161195b6118dc8261254f565b9150818183526020840193506020810190508385602084028201111561198057600080fd5b60005b8381101561193257816119968882611b8c565b8452506020928301929190910190600101611983565b805161034a8161265b565b803561034a81612664565b803561034a8161266d565b6000606082840312156119df57600080fd5b6119e96060612528565b905060006119f784846118a7565b8252506020611a08848483016119b7565b6020830152506040611a1c848285016119c2565b60408301525092915050565b60006101008284031215611a3b57600080fd5b50919050565b60006101008284031215611a5457600080fd5b611a5e6080612528565b90506000611a6c84846118a7565b8252506020611a7d848483016119b7565b6020830152506040611a91848285016119cd565b60408301525060a0611aa5848285016119cd565b60608301525092915050565b60006101608284031215611a3b57600080fd5b60006101608284031215611ad757600080fd5b611ae16080612528565b90506000611aef8484611a41565b825250610100611b01848483016119b7565b602083015250610120611b16848285016119b7565b604083015250610140611aa5848285016119b7565b600060608284031215611a3b57600080fd5b600060608284031215611b4f57600080fd5b611b596060612528565b90506000611b678484611b97565b8252506020611b78848483016119b7565b6020830152506040611a1c848285016119b7565b805161034a81612664565b803561034a8161267a565b600060208284031215611bb457600080fd5b6000611bc084846118a7565b949350505050565b600060208284031215611bda57600080fd5b815167ffffffffffffffff811115611bf157600080fd5b611bc0848285016118bd565b600060208284031215611c0f57600080fd5b815167ffffffffffffffff811115611c2657600080fd5b611bc08482850161193c565b600060208284031215611c4457600080fd5b6000611bc084846119ac565b600060208284031215611c6257600080fd5b6000611bc084846119c2565b600060608284031215611c8057600080fd5b6000611bc084846119cd565b60006101008284031215611c9f57600080fd5b6000611bc08484611a28565b60006101008284031215611cbe57600080fd5b6000611bc08484611a41565b60008060008060006102208688031215611ce357600080fd5b6000611cef8888611ab1565b955050610160611d0188828901611b2b565b9450506101c0611d13888289016119b7565b9350506101e0611d25888289016119b7565b925050610200611d37888289016118a7565b9150509295509295909350565b60006101608284031215611d5757600080fd5b6000611bc08484611ac4565b6000806101808385031215611d7757600080fd5b6000611d838585611ac4565b925050610160611d95858286016119b7565b9150509250929050565b600060608284031215611db157600080fd5b6000611bc08484611b3d565b600060208284031215611dcf57600080fd5b6000611bc08484611b8c565b611de4816125ea565b82525050565b611de4816125ae565b611de4816125b9565b611de4816125be565b611de4816125c1565b611de4816125f1565b611de4816125fc565b6000611e2b82612570565b611e358185612574565b9350611e45818560208601612607565b611e4e81612633565b9093019392505050565b6000611e65602483612574565b7f6e6f7420656e6f7567682073746f636b206f66206f7264657220666f7220627581526379696e6760e01b602082015260400192915050565b6000611eab601d83612574565b7f76616c75652073686f756c64206265203120666f72204552432d373231000000815260200192915050565b6000611ee4602683612574565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b6000611f2c601b83612574565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000611f65601383612574565b72696e636f7272656374207369676e617475726560681b815260200192915050565b6000611f94602183612574565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000611fd7602083612574565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000612010602183612574565b7f455448206973206e6f7420737570706f72746564206f6e2073656c6c207369648152606560f81b602082015260400192915050565b600061034a600083612574565b6000612060600c83612574565b6b3737ba1030b71037bbb732b960a11b815260200192915050565b6000612088601383612574565b720746f6b656e49642073686f756c64206265203606c1b815260200192915050565b60006120b7601683612574565b751b5cd9cb9d985b1d59481a5cc81a5b98dbdc9c9958dd60521b815260200192915050565b606082016120ea828061257d565b6120f48482611dea565b50612102602083018361259f565b61210f6020850182611dfc565b5061211d604083018361258c565b61117b6040850182611e17565b8051606083019061213b8482611dea565b50602082015161214e6020850182611dfc565b50604082015161117b6040850182611e17565b6101008201612170828061257d565b61217a8482611dea565b50612188602083018361259f565b6121956020850182611dfc565b506121a3604083018361259b565b6121b060408501826120dc565b506121be60a083018361259b565b61117b60a08501826120dc565b80516101008301906121dd8482611dea565b5060208201516121f06020850182611dfc565b506040820151612203604085018261212a565b50606082015161117b60a085018261212a565b805161016083019061222884826121cb565b50602082015161223c610100850182611dfc565b506040820151612250610120850182611dfc565b50606082015161117b610140850182611dfc565b611de4816125e4565b6020810161034a8284611dea565b608081016122898287611ddb565b6122966020830186611dea565b6122a36040830185611dfc565b6118526060830184611dfc565b6020810161034a8284611df3565b608081016122cc8287611dfc565b6122966020830186612264565b6020810161034a8284611e05565b6020810161034a8284611e0e565b60c081016123038288611e0e565b6123106020830187611dea565b61231d6040830186611dea565b61232a6060830185611dfc565b6123376080830184611dfc565b81810360a083015261234881612046565b979650505050505050565b608081016123618287611e0e565b61236e6020830186611dea565b6122a36040830185611dea565b602080825281016103478184611e20565b6020808252810161032781611e58565b6020808252810161032781611e9e565b6020808252810161032781611ed7565b6020808252810161032781611f1f565b6020808252810161032781611f58565b6020808252810161032781611f87565b6020808252810161032781611fca565b6020808252810161032781612003565b6020808252810161032781612053565b602080825281016103278161207b565b60208082528101610327816120aa565b610120810161244b8285612161565b610eea610100830184611dfc565b610100810161034a82846121cb565b610120810161244b82856121cb565b610160810161034a8284612216565b61018081016124958285612216565b610eea610160830184611dfc565b6020810161034a8284611dfc565b61010081016124c0828b611dfc565b6124cd602083018a611dea565b6124da6040830189611dea565b6124e76060830188611dfc565b6124f46080830187611dfc565b61250160a0830186611dea565b61250e60c0830185611dfc565b61251b60e0830184611dfc565b9998505050505050505050565b60405181810167ffffffffffffffff8111828210171561254757600080fd5b604052919050565b600067ffffffffffffffff82111561256657600080fd5b5060209081020190565b5190565b90815260200190565b600061034760208401846118a7565b600061034760208401846119c2565b5090565b600061034760208401846119b7565b6000610327826125d8565b151590565b90565b6001600160e01b03191690565b8061032a8161263d565b6001600160a01b031690565b60ff1690565b6000610327825b6000610327826125ae565b6000610327826125ce565b60005b8381101561262257818101518382015260200161260a565b8381111561117b5750506000910152565b601f01601f191690565b600581106107ef57fe5b612650816125ae565b81146107ef57600080fd5b612650816125b9565b612650816125be565b600581106107ef57600080fd5b612650816125e456fea365627a7a72315820fe64246338c31ef223c612c5abeea3c6f17dcd52a47ac8da80ca2e63a4cf87ef6c6578706572696d656e74616cf564736f6c63430005110040
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003fded36b6d10d7e0cbdd8847f3f9d76700241271000000000000000000000000672cfe8471922ff3fb8da73bb0ae2c0063cba85000000000000000000000000013594fdc7630942dfbd9b38e0f55e0b23f8332160000000000000000000000008b306028d6a37979692611b5c3f3d6d3e63b9a6800000000000000000000000084035a6b60aceef6c3009d84fc99cfd9e5a4c7f20000000000000000000000007b1908bd786e31db976560071e40556b7ac919690000000000000000000000007b1908bd786e31db976560071e40556b7ac91969
-----Decoded View---------------
Arg [0] : _transferProxy (address): 0x3FdED36b6d10d7e0cBDD8847f3F9d76700241271
Arg [1] : _transferProxyForDeprecated (address): 0x672Cfe8471922Ff3fB8DA73bb0AE2c0063CbA850
Arg [2] : _erc20TransferProxy (address): 0x13594FdC7630942DFbD9B38e0f55E0b23F833216
Arg [3] : _state (address): 0x8B306028D6A37979692611b5c3f3d6d3e63B9a68
Arg [4] : _ordersHolder (address): 0x84035a6b60AcEEF6c3009D84fC99cfD9e5A4C7f2
Arg [5] : _beneficiary (address): 0x7B1908bD786E31Db976560071e40556b7aC91969
Arg [6] : _buyerFeeSigner (address): 0x7B1908bD786E31Db976560071e40556b7aC91969
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000003fded36b6d10d7e0cbdd8847f3f9d76700241271
Arg [1] : 000000000000000000000000672cfe8471922ff3fb8da73bb0ae2c0063cba850
Arg [2] : 00000000000000000000000013594fdc7630942dfbd9b38e0f55e0b23f833216
Arg [3] : 0000000000000000000000008b306028d6a37979692611b5c3f3d6d3e63b9a68
Arg [4] : 00000000000000000000000084035a6b60aceef6c3009d84fc99cfd9e5a4c7f2
Arg [5] : 0000000000000000000000007b1908bd786e31db976560071e40556b7ac91969
Arg [6] : 0000000000000000000000007b1908bd786e31db976560071e40556b7ac91969
Deployed Bytecode Sourcemap
34016:9703:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34948:60;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34948:60:0;;;:::i;:::-;;;;;;;;;;;;;;;;38664:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38664:145:0;;;;;;;;:::i;:::-;;;;;;;;38488:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38488:168:0;;;;;;;;:::i;35764:122::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35764:122:0;;;;;;;;:::i;:::-;;34828:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34828:34:0;;;:::i;:::-;;;;;;;;34869:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34869:29:0;;;:::i;35894:126::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35894:126:0;;;;;;;;:::i;34907:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34907:34:0;;;:::i;12866:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12866:140:0;;;:::i;12055:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12055:79:0;;;:::i;12421:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12421:94:0;;;:::i;:::-;;;;;;;;35101:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35101:42:0;;;:::i;36028:1238::-;;;;;;;;;:::i;35066:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35066:28:0;;;:::i;37493:292::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37493:292:0;;;;;;;;:::i;13161:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13161:109:0;;;;;;;;:::i;35015:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35015:44:0;;;:::i;34948:60::-;;;-1:-1:-1;;;;;34948:60:0;;:::o;38664:145::-;38729:13;38762:39;38783:5;38772:17;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;38772:17:0;;;38762:28;;;;;;:37;:39::i;:::-;38755:46;;38664:145;;;;:::o;38488:168::-;38571:13;38604:44;38625:5;38632:3;38614:22;;;;;;;;;;38604:44;38597:51;;38488:168;;;;;:::o;35764:122::-;12267:9;:7;:9::i;:::-;12259:54;;;;-1:-1:-1;;;12259:54:0;;;;;;;;;;;;;;;;;35850:11;:28;;-1:-1:-1;;;;;;35850:28:0;-1:-1:-1;;;;;35850:28:0;;;;;;;;;;35764:122::o;34828:34::-;;;-1:-1:-1;;;;;34828:34:0;;:::o;34869:29::-;;;-1:-1:-1;;;;;34869:29:0;;:::o;35894:126::-;12267:9;:7;:9::i;:::-;12259:54;;;;-1:-1:-1;;;12259:54:0;;;;;;;;;35978:14;:34;;-1:-1:-1;;;;;;35978:34:0;-1:-1:-1;;;;;35978:34:0;;;;;;;;;;35894:126::o;34907:34::-;;;-1:-1:-1;;;;;34907:34:0;;:::o;12866:140::-;12267:9;:7;:9::i;:::-;12259:54;;;;-1:-1:-1;;;12259:54:0;;;;;;;;;12965:1;12949:6;;12928:40;;-1:-1:-1;;;;;12949:6:0;;;;12928:40;;12965:1;;12928:40;12996:1;12979:19;;-1:-1:-1;;;;;;12979:19:0;;;12866:140::o;12055:79::-;12093:7;12120:6;-1:-1:-1;;;;;12120:6:0;12055:79;:::o;12421:94::-;12461:4;12501:6;;-1:-1:-1;;;;;12501:6:0;12485:12;:10;:12::i;:::-;-1:-1:-1;;;;;12485:22:0;;12478:29;;12421:94;:::o;35101:42::-;;;-1:-1:-1;;;;;35101:42:0;;:::o;36028:1238::-;36246:28;;;;;;;;36263:5;36246:28;;;;;;;;;;36270:3;36246:28;;;:16;:28::i;:::-;36347:11;36361:43;36390:13;;;;36361:24;:12;;;;36378:6;36361:24;:16;:24;:::i;:::-;:28;:43;:28;:43;:::i;:::-;36347:57;-1:-1:-1;36415:63:0;;;;;;;;36445:5;36415:63;;;36456:5;:13;;;36471:6;36415:29;:63::i;:::-;36530:13;36497:29;;;;;;;;;;:46;;;;;;;;;;36489:92;;;;-1:-1:-1;;;36489:92:0;;;;;;;;;36628:13;36596:28;;;;;;;;;;:45;;;;;;;;;36592:115;;;36658:37;36678:6;36686:8;36658:19;:37::i;:::-;36717:15;36735:71;36746:29;;;;;;;;;;36777:28;;;;;;;;;;36735:10;:71::i;:::-;36717:89;-1:-1:-1;;;;;;36821:21:0;;36817:72;;36867:10;36859:18;;36817:72;36899:152;;;;;;;;36927:19;;;36899:152;;;36948:6;36956:15;;;;:5;:15;;;36973:5;36991:12;36980:7;:23;;;;;;;;;37005:8;37015:5;:15;;;37032:5;:9;;:18;;36899:152;;;;;;;;;;;;:27;:152::i;:::-;37062:156;;;;;;;;37090:18;;;37062:156;;;37110:6;37118:10;37130:15;;;;:5;:15;;;37158:11;37147:7;:22;;;;;;;;;37171:5;:15;;;37188:8;37198:5;:9;;:19;;37062:156;;;;;;;;;;;;37229:29;;;;;;;;37237:5;37229:29;;;37244:6;37252:5;37229:7;:29::i;:::-;36028:1238;;;;;;;:::o;35066:28::-;;;-1:-1:-1;;;;;35066:28:0;;:::o;37493:292::-;37573:10;37560:9;;;;:3;:9;;;-1:-1:-1;;;;;37560:23:0;;37552:48;;;;-1:-1:-1;;;37552:48:0;;;;;;;;;37611:5;;:36;;-1:-1:-1;;;37611:36:0;;-1:-1:-1;;;;;37611:5:0;;;;:18;;:36;;37630:3;;-1:-1:-1;;34807:12:0;37611:36;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37611:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;37691:21:0;;;;;;-1:-1:-1;37670:19:0;;37691:13;;;37670:19;;;-1:-1:-1;;;;;37663:114:0;;37714:10;37726:18;;;;:12;;;:18;;;37663:114;;;;;;37746:20;;;;;;37768:8;;;;37663:114;;;;;;;;;;37493:292;:::o;13161:109::-;12267:9;:7;:9::i;:::-;12259:54;;;;-1:-1:-1;;;12259:54:0;;;;;;;;;13234:28;13253:8;13234:18;:28::i;:::-;13161:109;:::o;35015:44::-;;;-1:-1:-1;;;;;35015:44:0;;:::o;28249:375::-;28331:42;;;;;;;;;;;-1:-1:-1;;;28331:42:0;;;;28403:13;;;;;28305;28403;;;;;28305;;;28403;;;;21:6:-1;;104:10;28403:13:0;87:34:-1;135:17;;-1:-1;;28384:32:0;-1:-1:-1;28432:9:0;28427:161;28451:2;28447:1;:6;28427:161;;;28486:8;28513:1;28501:5;28507:1;28501:8;;;;;;;;;;-1:-1:-1;;;;;28501:13:0;;;;28495:20;;28486:30;;;;;;;;;;;;;;;;;;28475:3;28479:1;28481;28479:3;28475:8;;;;;;;;;;;:41;-1:-1:-1;;;;;28475:41:0;;;;;;;;;28544:8;28559:5;28565:1;28559:8;;;;;;;28544:32;;28559:8;;;28570:4;28553:22;;28544:32;;;;;;;;;;;;;;28531:3;28537:1;28539;28537:3;28535:1;:5;28531:10;;;;;;;;;;;:45;-1:-1:-1;;;;;28531:45:0;;;;;;;;-1:-1:-1;28455:3:0;;28427:161;;;-1:-1:-1;28612:3:0;28249:375;-1:-1:-1;;;28249:375:0:o;9040:98::-;9120:10;9040:98;:::o;37793:404::-;37909:5;;:10;;;:35;;;;-1:-1:-1;37923:5:0;;;;:21;37909:35;:60;;;;-1:-1:-1;37948:5:0;;;;:21;37909:60;37905:285;;;37994:12;;:26;;-1:-1:-1;;;37994:26:0;;-1:-1:-1;;;;;37994:12:0;;;;:19;;:26;;38014:5;;37994:26;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37994:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37994: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;37994:26:0;;;;;;;;;37986:58;;;;-1:-1:-1;;;37986:58:0;;;;;;;;;37905:285;;;38139:5;:9;;;:15;;;-1:-1:-1;;;;;38085:69:0;:50;38115:3;:5;;;38122:3;:5;;;38129:3;:5;;;38085:21;38100:5;38085:14;:21::i;:::-;:29;:50;;;:29;:50;:::i;:::-;-1:-1:-1;;;;;38085:69:0;;38077:101;;;;-1:-1:-1;;;38077:101:0;;;;;;;;;37793:404;;:::o;2339:471::-;2397:7;2642:6;2638:47;;-1:-1:-1;2672:1:0;2665:8;;2638:47;2709:5;;;2713:1;2709;:5;:1;2733:5;;;;;:10;2725:56;;;;-1:-1:-1;;;2725:56:0;;;;;;;;3278:132;3336:7;3363:39;3367:1;3370;3363:39;;;;;;;;;;;;;;;;;:3;:39::i;42929:338::-;43053:5;;:23;;-1:-1:-1;;;43053:23:0;;43036:14;;-1:-1:-1;;;;;43053:5:0;;:18;;:23;;43072:3;;43053:23;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43053:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43053: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;43053:23:0;;;;;;;;;43036:40;-1:-1:-1;43087:17:0;43107:21;43036:40;43121:6;43107:21;:13;:21;:::i;:::-;43087:41;;43163:7;43147:12;:23;;43139:72;;;;-1:-1:-1;;;43139:72:0;;;;;;;;;43222:5;;:37;;-1:-1:-1;;;43222:37:0;;-1:-1:-1;;;;;43222:5:0;;;;:18;;:37;;43241:3;;43246:12;;43222:37;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43222:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43222:37:0;;;;42929:338;;;;;:::o;37274:211::-;37355:21;37379:18;:5;37388:8;37379:18;:8;:18;:::i;:::-;37355:42;;37437:13;37429:5;:21;37416:9;:34;37408:69;;;;-1:-1:-1;;;37408:69:0;;;;;;;;;37274:211;;;:::o;43275:441::-;43357:7;43394:16;43382:8;:28;;;;;;;;;:70;;;-1:-1:-1;43426:26:0;43414:8;:38;;;;;;;;;43382:70;43381:159;;;;-1:-1:-1;43482:16:0;43471:7;:27;;;;;;;;;:68;;;-1:-1:-1;43513:26:0;43502:7;:37;;;;;;;;;43471:68;43377:211;;;-1:-1:-1;43564:12:0;43557:19;;43377:211;43624:7;43619:13;;;;;;;;43607:8;43602:14;;;;;;;;:30;43598:81;;;-1:-1:-1;43656:11:0;43649:18;;43598:81;-1:-1:-1;43696:12:0;43275:441;;;;:::o;38817:387::-;39016:6;39011:186;;39039:36;39048:9;39059:5;39066:4;39072:2;39039:8;:36::i;:::-;39011:186;;;39108:77;39125:9;39136:5;39143:4;39149:2;39153:9;39164:8;39174:10;39108:16;:77::i;:::-;38817:387;;;;;;;;:::o;42097:363::-;42218:9;;:19;;;;;:27;;;;;42191:25;;42247:13;;;;42275:15;;42305:18;;;;:24;;42331:26;;;;42359:12;;;;42427:14;;;;;42187:265;;42218:27;;-1:-1:-1;;;;;42187:265:0;;;;;;;;42247:13;;42275:15;;42305:24;;42331:26;42359:12;42386:5;;42406:6;;42427:14;42187:265;;;;;;;;;;42097:363;;;:::o;13376:229::-;-1:-1:-1;;;;;13450:22:0;;13442:73;;;;-1:-1:-1;;;13442:73:0;;;;;;;;;13552:6;;;13531:38;;-1:-1:-1;;;;;13531:38:0;;;;13552:6;;;13531:38;;;13580:6;:17;;-1:-1:-1;;;;;;13580:17:0;-1:-1:-1;;;;;13580:17:0;;;;;;;;;;13376:229::o;26873:469::-;26967:7;26987:21;27017:7;26987:38;;27036:24;27063:211;27084:39;;;;;;;;;;;;;;;;;27144:26;:8;:15;:24;:26::i;:::-;27209:12;;;27219:1;27209:12;;;;;;27223;;;;;;27237;;;;;;27251;;;;;;;;;27186:8;;27209:12;;27063:6;:211::i;:::-;27036:238;;27292:42;27312:11;27302:22;;;;;;27326:1;27329;27332;27292:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;27292:42:0;;-1:-1:-1;;27292:42:0;;;26873:469;-1:-1:-1;;;;;;;;26873:469:0:o;3940:345::-;4026:7;4128:12;4121:5;4113:28;;;;-1:-1:-1;;;4113:28:0;;;;;;;;;;;4152:9;4168:1;4164;:5;;;;;;;-1:-1:-1;;3940:345:0;;;;;;:::o;967:181::-;1025:7;1057:5;;;1081:6;;;;1073:46;;;;-1:-1:-1;;;1073:46:0;;;;;;;;25711:122;25772:4;25796:29;25819:5;25796:18;:5;25806:7;25796:18;:9;:18;:::i;39212:1068::-;39331:13;39312:5;:15;;;:32;;;;;;;;;39308:965;;;39424:25;;39405:2;;-1:-1:-1;;;;;39424:18:0;;;:25;;;;;39443:5;;39361:25;39424;39361;39424;39443:5;39424:18;:25;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39424:25:0;39308:965;;;;39490:15;39471:5;:15;;;:34;;;;;;;;;39467:806;;;39530:13;;;;:18;39522:50;;;;-1:-1:-1;;;39522:50:0;;;;;;;;;39587:18;;39635:11;;39587:78;;-1:-1:-1;;;39587:78:0;;-1:-1:-1;;;;;39587:18:0;;;;:40;;:78;;39649:4;;39655:2;;39659:5;;39587:78;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39587:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39587:78:0;;;;39467:806;;;39706:16;39687:5;:15;;;:35;;;;;;;;;39683:590;;;39747:5;39756:1;39747:10;39739:52;;;;-1:-1:-1;;;39739:52:0;;;;;;;;;39806:13;;39851:11;;39875:13;;;;39806:83;;-1:-1:-1;;;39806:83:0;;-1:-1:-1;;;;;39806:13:0;;;;:36;;:83;;39851:11;;39865:4;;39871:2;;39806:83;;;;39683:590;39930:26;39911:5;:15;;;:45;;;;;;;;;39907:366;;;39981:5;39990:1;39981:10;39973:52;;;;-1:-1:-1;;;39973:52:0;;;;;;;;;40040:26;;;40094:11;;40118:13;;;;40040:92;;-1:-1:-1;;;40040:92:0;;-1:-1:-1;;;;;40040:26:0;;;;:45;;:92;;40094:11;40108:4;;40114:2;;40040:92;;;39907:366;40165:13;;40212:11;;40236:13;;;;40165:96;;-1:-1:-1;;;40165:96:0;;-1:-1:-1;;;;;40165:13:0;;;;:37;;:96;;40212:11;;40226:4;;40232:2;;40251:5;;40165:96;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40165:96:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;39907:366:0;39212:1068;;;;:::o;40288:1310::-;40458:14;40475:69;40500:9;40511:4;40517:5;40524:9;40535:8;40475:24;:69::i;:::-;40458:86;-1:-1:-1;40597:17:0;40573:10;:20;;;:41;;;;;;;;;:109;;;;-1:-1:-1;40627:16:0;;40618:64;;-1:-1:-1;;;40618:64:0;;-1:-1:-1;;;;;40618:44:0;;;;;;:64;;-1:-1:-1;;;40663:18:0;40618:64;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40618:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40618: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;40618:64:0;;;;;;;;;40573:289;;;-1:-1:-1;40724:16:0;40700:10;:20;;;:40;;;;;;;;;:94;;;-1:-1:-1;40768:26:0;40744:10;:20;;;:50;;;;;;;;;40700:94;40699:163;;;;-1:-1:-1;40807:16:0;;40799:63;;-1:-1:-1;;;40799:63:0;;-1:-1:-1;;;;;40799:43:0;;;;;;:63;;-1:-1:-1;;;40843:18:0;40799:63;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40799:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40799: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;40799:63:0;;;;;;;;;40555:919;;;40942:16;;41038:18;;;;41012:45;;-1:-1:-1;;;41012:45:0;;40974:35;;-1:-1:-1;;;;;41012:25:0;;;;;:45;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41012:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41012:45:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;41012:45:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;41012:45:0;;;;;;;;;40974:83;;41072:18;41093:8;-1:-1:-1;;;;;41093:18:0;;41112:10;:18;;;41093:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41093:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41093:38:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;41093:38:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;41093:38:0;;;;;;;;;41072:59;;41169:10;:17;41154:4;:11;:32;41146:41;;;;;;41207:9;41202:261;41226:4;:11;41222:1;:15;41202:261;;;41264:17;41283:12;41299:37;41310:9;41321:5;41328:4;41333:1;41328:7;;;;;;;;;;;;;;41299:10;:37::i;:::-;41263:73;;;;41367:12;41355:24;;41398:49;41407:9;41418:7;41427:4;41433:10;41444:1;41433:13;;;;;;;;;;;;;;41398:8;:49::i;:::-;-1:-1:-1;;41239:3:0;;41202:261;;;;40555:919;;;;41528:2;41543:47;41552:9;41563;41574:4;41528:2;41543:8;:47::i;25238:465::-;25290:13;25320:6;25316:49;;-1:-1:-1;25343:10:0;;;;;;;;;;;;-1:-1:-1;;;25343:10:0;;;;;;25316:49;25384:1;25375:6;25415:69;25422:6;;25415:69;;25445:5;;25470:2;25465:7;;;;25415:69;;;25494:17;25524:3;25514:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;25514:14:0;87:34:-1;135:17;;-1:-1;25514:14:0;-1:-1:-1;25494:34:0;-1:-1:-1;;;25548:7:0;;25566:100;25573:6;;25566:100;;25628:2;25624:1;:6;25619:2;:11;25608:24;;25596:4;25601:3;;;;;;;25596:9;;;;;;;;;;;:36;-1:-1:-1;;;;;25596:36:0;;;;;;;;-1:-1:-1;25652:2:0;25647:7;;;;25566:100;;;-1:-1:-1;25690:4:0;25238:465;-1:-1:-1;;;;25238:465:0:o;27350:864::-;27508:12;27533:24;27642:2;:9;27630:2;:9;27618:2;:9;27606:2;:9;27594:2;:9;27582:2;:9;27570:2;:9;:21;:33;:45;:57;:69;:81;27560:92;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;27560:92:0;87:34:-1;135:17;;-1:-1;27560:92:0;-1:-1:-1;27533:119:0;-1:-1:-1;27663:6:0;;27684:61;27705:2;:9;27701:1;:13;27684:61;;;27740:2;27743:1;27740:5;;;;;;;;;;;;;;;;27721:11;27733:3;;;;;;27721:16;;;;;;;;;;;:24;-1:-1:-1;;;;;27721:24:0;;;;;;;;-1:-1:-1;27716:3:0;;27684:61;;;-1:-1:-1;27761:6:0;27756:61;27777:2;:9;27773:1;:13;27756:61;;;27812:2;27815:1;27812:5;;;;;;;;;;;;;;;;27793:11;27805:3;;;;;;27793:16;;;;;;;;;;;:24;-1:-1:-1;;;;;27793:24:0;;;;;;;;-1:-1:-1;27788:3:0;;27756:61;;;-1:-1:-1;27833:6:0;27828:61;27849:2;:9;27845:1;:13;27828:61;;;27884:2;27887:1;27884:5;;;;;;;;;;;;;;;;27865:11;27877:3;;;;;;27865:16;;;;;;;;;;;:24;-1:-1:-1;;;;;27865:24:0;;;;;;;;-1:-1:-1;27860:3:0;;27828:61;;;-1:-1:-1;27905:6:0;27900:61;27921:2;:9;27917:1;:13;27900:61;;;27956:2;27959:1;27956:5;;;;;;;;;;;;;;;;27937:11;27949:3;;;;;;27937:16;;;;;;;;;;;:24;-1:-1:-1;;;;;27937:24:0;;;;;;;;-1:-1:-1;27932:3:0;;27900:61;;;-1:-1:-1;27977:6:0;27972:61;27993:2;:9;27989:1;:13;27972:61;;;28028:2;28031:1;28028:5;;;;;;;;;;;;;;;;28009:11;28021:3;;;;;;28009:16;;;;;;;;;;;:24;-1:-1:-1;;;;;28009:24:0;;;;;;;;-1:-1:-1;28004:3:0;;27972:61;;;-1:-1:-1;28049:6:0;28044:61;28065:2;:9;28061:1;:13;28044:61;;;28100:2;28103:1;28100:5;;;;;;;;;;;;;;;;28081:11;28093:3;;;;;;28081:16;;;;;;;;;;;:24;-1:-1:-1;;;;;28081:24:0;;;;;;;;-1:-1:-1;28076:3:0;;28044:61;;;-1:-1:-1;28121:6:0;28116:61;28137:2;:9;28133:1;:13;28116:61;;;28172:2;28175:1;28172:5;;;;;;;;;;;;;;;;28153:11;28165:3;;;;;;28153:16;;;;;;;;;;;:24;-1:-1:-1;;;;;28153:24:0;;;;;;;;-1:-1:-1;28148:3:0;;28116:61;;;-1:-1:-1;28195:11:0;;27350:864;-1:-1:-1;;;;;;;;;27350:864:0:o;41606:483::-;41735:4;41753:14;41769:19;41792:35;41803:5;41810;41817:9;41792:10;:35::i;:::-;41752:75;;-1:-1:-1;41752:75:0;-1:-1:-1;41838:18:0;41859;:5;41868:8;41859:18;:8;:18;:::i;:::-;41838:39;-1:-1:-1;41888:19:0;41910:33;41838:39;41928:14;41910:33;:17;:33;:::i;:::-;41888:55;-1:-1:-1;41958:18:0;;41954:101;;42031:11;;41993:50;;42002:5;;42009:14;;42025:4;;-1:-1:-1;;;;;42031:11:0;41993:8;:50::i;:::-;-1:-1:-1;42072:9:0;;-1:-1:-1;;;41606:483:0;;;;;;;;:::o;42468:168::-;42549:13;;42596:32;42603:5;42610:17;:5;42619:7;42610:17;:8;:17;:::i;:::-;42596:6;:32::i;:::-;42589:39;;;;42468:168;;;;;;:::o;42644:277::-;42705:13;42720:12;42757:3;42749:5;:11;42745:169;;;-1:-1:-1;;42788:11:0;;;42796:3;42745:169;;;-1:-1:-1;42871:1:0;;-1:-1:-1;42897:5:0;42745:169;42644: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:842;;;;;;10938:3;10926:9;10917:7;10913:23;10909:33;10906:2;;;10955:1;10952;10945:12;10906:2;10990:1;11007:78;11077:7;11057:9;11007:78;;;10997:88;;10969:122;11122:3;11141:76;11209:7;11200:6;11189:9;11185:22;11141:76;;;11131:86;;11101:122;11254:3;11273:53;11318:7;11309:6;11298:9;11294:22;11273:53;;;11263:63;;11233:99;11363:3;11382:53;11427:7;11418:6;11407:9;11403:22;11382:53;;;11372:63;;11342:99;11472:3;11491:53;11536:7;11527:6;11516:9;11512:22;11491:53;;;11481:63;;11451:99;10900:660;;;;;;;;;11567:288;;11694:3;11682:9;11673:7;11669:23;11665:33;11662:2;;;11711:1;11708;11701:12;11662:2;11746:1;11763:76;11831:7;11811:9;11763:76;;11862:414;;;12006:3;11994:9;11985:7;11981:23;11977:33;11974:2;;;12023:1;12020;12013:12;11974:2;12058:1;12075:76;12143:7;12123:9;12075:76;;;12065:86;;12037:120;12188:3;12207:53;12252:7;12243:6;12232:9;12228:22;12207:53;;;12197:63;;12167:99;11968:308;;;;;;12283:283;;12408:2;12396:9;12387:7;12383:23;12379:32;12376:2;;;12424:1;12421;12414:12;12376:2;12459:1;12476:74;12542:7;12522:9;12476:74;;12573:263;;12688:2;12676:9;12667:7;12663:23;12659:32;12656:2;;;12704:1;12701;12694:12;12656:2;12739:1;12756:64;12812:7;12792:9;12756:64;;12843:142;12934:45;12973:5;12934:45;;;12929:3;12922:58;12916:69;;;12992:137;13091:32;13117:5;13091:32;;13366:104;13443:21;13458:5;13443:21;;13477:113;13560:24;13578:5;13560:24;;13597:110;13678:23;13695:5;13678:23;;13714:178;13823:63;13880:5;13823:63;;15140:140;15225:49;15268:5;15225:49;;15287:347;;15399:39;15432:5;15399:39;;;15450:71;15514:6;15509:3;15450:71;;;15443:78;;15526:52;15571:6;15566:3;15559:4;15552:5;15548:16;15526:52;;;15599:29;15621:6;15599:29;;;15590:39;;;;15379:255;-1:-1;;;15379:255;15642:373;;15802:67;15866:2;15861:3;15802:67;;;15902:34;15882:55;;-1:-1;;;15966:2;15957:12;;15950:28;16006:2;15997:12;;15788:227;-1:-1;;15788:227;16024:329;;16184:67;16248:2;16243:3;16184:67;;;16284:31;16264:52;;16344:2;16335:12;;16170:183;-1:-1;;16170:183;16362:375;;16522:67;16586:2;16581:3;16522:67;;;16622:34;16602:55;;-1:-1;;;16686:2;16677:12;;16670:30;16728:2;16719:12;;16508:229;-1:-1;;16508:229;16746:327;;16906:67;16970:2;16965:3;16906:67;;;17006:29;16986:50;;17064:2;17055:12;;16892:181;-1:-1;;16892:181;17082:319;;17242:67;17306:2;17301:3;17242:67;;;-1:-1;;;17322:42;;17392:2;17383:12;;17228:173;-1:-1;;17228:173;17410:370;;17570:67;17634:2;17629:3;17570:67;;;17670:34;17650:55;;-1:-1;;;17734:2;17725:12;;17718:25;17771:2;17762:12;;17556:224;-1:-1;;17556:224;17789:332;;17949:67;18013:2;18008:3;17949:67;;;18049:34;18029:55;;18112:2;18103:12;;17935:186;-1:-1;;17935:186;18130:370;;18290:67;18354:2;18349:3;18290:67;;;18390:34;18370:55;;-1:-1;;;18454:2;18445:12;;18438:25;18491:2;18482:12;;18276:224;-1:-1;;18276:224;18509:260;;18668:65;18731:1;18726:3;18668:65;;18778:312;;18938:67;19002:2;18997:3;18938:67;;;-1:-1;;;19018:35;;19081:2;19072:12;;18924:166;-1:-1;;18924:166;19099:319;;19259:67;19323:2;19318:3;19259:67;;;-1:-1;;;19339:42;;19409:2;19400:12;;19245:173;-1:-1;;19245:173;19427:322;;19587:67;19651:2;19646:3;19587:67;;;-1:-1;;;19667:45;;19740:2;19731:12;;19573:176;-1:-1;;19573:176;19826:730;19953:4;19944:14;;20020:50;20057:5;;20020:50;;;20076:63;20128:3;20110:12;20076:63;;;19973:172;20204:50;20248:4;20241:5;20237:16;20230:5;20204:50;;;20260:63;20317:4;20312:3;20308:14;20294:12;20260:63;;;20155:174;20390:64;20448:4;20441:5;20437:16;20430:5;20390:64;;;20460:75;20529:4;20524:3;20520:14;20506:12;20460:75;;20632:633;20824:23;;20757:4;20748:14;;;20853:63;20752:3;20824:23;20853:63;;;20777:145;20998:4;20991:5;20987:16;20981:23;21010:63;21067:4;21062:3;21058:14;21044:12;21010:63;;;20932:147;21157:4;21150:5;21146:16;21140:23;21169:75;21238:4;21233:3;21229:14;21215:12;21169:75;;21347:1038;21494:6;21485:16;;21563:50;21600:5;;21563:50;;;21619:63;21671:3;21653:12;21619:63;;;21516:172;21744:50;21788:4;21781:5;21777:16;21770:5;21744:50;;;21800:63;21857:4;21852:3;21848:14;21834:12;21800:63;;;21698:171;21930:71;21995:4;21988:5;21984:16;21977:5;21930:71;;;22007:107;22108:4;22103:3;22099:14;22085:12;22007:107;;;21879:241;22180:71;22245:4;22238:5;22234:16;22227:5;22180:71;;;22257:107;22358:4;22353:3;22349:14;22335:12;22257:107;;22467:882;22681:23;;22612:6;22603:16;;;22710:63;22607:3;22681:23;22710:63;;;22634:145;22852:4;22845:5;22841:16;22835:23;22864:63;22921:4;22916:3;22912:14;22898:12;22864:63;;;22789:144;23011:4;23004:5;23000:16;22994:23;23023:105;23122:4;23117:3;23113:14;23099:12;23023:105;;;22943:191;23211:4;23204:5;23200:16;23194:23;23223:105;23322:4;23317:3;23313:14;23299:12;23223:105;;24375:845;24581:23;;24514:6;24505:16;;;24610:111;24509:3;24581:23;24610:111;;;24536:191;24803:4;24796:5;24792:16;24786:23;24815:65;24872:6;24867:3;24863:16;24849:12;24815:65;;;24737:149;24961:4;24954:5;24950:16;24944:23;24973:65;25030:6;25025:3;25021:16;25007:12;24973:65;;;24896:148;25122:4;25115:5;25111:16;25105:23;25134:65;25191:6;25186:3;25182:16;25168:12;25134:65;;25457:107;25536:22;25552:5;25536:22;;25571:213;25689:2;25674:18;;25703:71;25678:9;25747:6;25703:71;;26043:563;26253:3;26238:19;;26268:79;26242:9;26320:6;26268:79;;;26358:72;26426:2;26415:9;26411:18;26402:6;26358:72;;;26441;26509:2;26498:9;26494:18;26485:6;26441:72;;;26524;26592:2;26581:9;26577:18;26568:6;26524:72;;26613:201;26725:2;26710:18;;26739:65;26714:9;26777:6;26739:65;;26821:539;27019:3;27004:19;;27034:71;27008:9;27078:6;27034:71;;;27116:68;27180:2;27169:9;27165:18;27156:6;27116:68;;27367:209;27483:2;27468:18;;27497:69;27472:9;27539:6;27497:69;;27583:265;27727:2;27712:18;;27741:97;27716:9;27811:6;27741:97;;28405:995;28751:3;28736:19;;28766:87;28740:9;28826:6;28766:87;;;28864:72;28932:2;28921:9;28917:18;28908:6;28864:72;;;28947;29015:2;29004:9;29000:18;28991:6;28947:72;;;29030;29098:2;29087:9;29083:18;29074:6;29030:72;;;29113:73;29181:3;29170:9;29166:19;29157:6;29113:73;;;29235:9;29229:4;29225:20;29219:3;29208:9;29204:19;29197:49;29260:130;29385:4;29260:130;;;29252:138;28722:678;-1:-1;;;;;;;28722:678;29407:575;29623:3;29608:19;;29638:85;29612:9;29696:6;29638:85;;;29734:72;29802:2;29791:9;29787:18;29778:6;29734:72;;;29817;29885:2;29874:9;29870:18;29861:6;29817:72;;31123:301;31261:2;31275:47;;;31246:18;;31336:78;31246:18;31400:6;31336:78;;31431:407;31622:2;31636:47;;;31607:18;;31697:131;31607:18;31697:131;;31845:407;32036:2;32050:47;;;32021:18;;32111:131;32021:18;32111:131;;32259:407;32450:2;32464:47;;;32435:18;;32525:131;32435:18;32525:131;;32673:407;32864:2;32878:47;;;32849:18;;32939:131;32849:18;32939:131;;33087:407;33278:2;33292:47;;;33263:18;;33353:131;33263:18;33353:131;;33501:407;33692:2;33706:47;;;33677:18;;33767:131;33677:18;33767:131;;33915:407;34106:2;34120:47;;;34091:18;;34181:131;34091:18;34181:131;;34329:407;34520:2;34534:47;;;34505:18;;34595:131;34505:18;34595:131;;34743:407;34934:2;34948:47;;;34919:18;;35009:131;34919:18;35009:131;;35157:407;35348:2;35362:47;;;35333:18;;35423:131;35333:18;35423:131;;35571:407;35762:2;35776:47;;;35747:18;;35837:131;35747:18;35837:131;;35985:434;36185:3;36170:19;;36200:125;36174:9;36298:6;36200:125;;;36336:73;36404:3;36393:9;36389:19;36380:6;36336:73;;36426:318;36596:3;36581:19;;36611:123;36585:9;36707:6;36611:123;;36751:430;36949:3;36934:19;;36964:123;36938:9;37060:6;36964:123;;37188:306;37352:3;37337:19;;37367:117;37341:9;37457:6;37367:117;;37501:418;37693:3;37678:19;;37708:117;37682:9;37798:6;37708:117;;;37836:73;37904:3;37893:9;37889:19;37880:6;37836:73;;37926:213;38044:2;38029:18;;38058:71;38033:9;38102:6;38058:71;;38146:995;38460:3;38445:19;;38475:71;38449:9;38519:6;38475:71;;;38557:72;38625:2;38614:9;38610:18;38601:6;38557:72;;;38640;38708:2;38697:9;38693:18;38684:6;38640:72;;;38723;38791:2;38780:9;38776:18;38767:6;38723:72;;;38806:73;38874:3;38863:9;38859:19;38850:6;38806:73;;;38890;38958:3;38947:9;38943:19;38934:6;38890:73;;;38974;39042:3;39031:9;39027:19;39018:6;38974:73;;;39058;39126:3;39115:9;39111:19;39102:6;39058:73;;;38431:710;;;;;;;;;;;;39148:256;39210:2;39204:9;39236:17;;;39311:18;39296:34;;39332:22;;;39293:62;39290:2;;;39368:1;39365;39358:12;39290:2;39384;39377:22;39188:216;;-1:-1;39188:216;39411:312;;39578:18;39570:6;39567:30;39564:2;;;39610:1;39607;39600:12;39564:2;-1:-1;39645:4;39633:17;;;39698:15;;39501:222;40041:122;40129:12;;40100:63;40171:162;40273:19;;;40322:4;40313:14;;40266:67;40514:119;;40588:39;40623:2;40618:3;40614:12;40609:3;40588:39;;40642:147;;40730:53;40779:2;40774:3;40770:12;40765:3;40730:53;;40798:104;-1:-1;40893:3;40877:25;40911:119;;40985:39;41020:2;41015:3;41011:12;41006:3;40985:39;;41038:91;;41100:24;41118:5;41100:24;;41242:85;41308:13;41301:21;;41284:43;41334:72;41396:5;41379:27;41413:144;-1:-1;;;;;;41474:78;;41457:100;41564:134;41640:5;41646:47;41640:5;41646:47;;41705:121;-1:-1;;;;;41767:54;;41750:76;41912:81;41983:4;41972:16;;41955:38;42000:129;;42087:37;42118:5;42136:173;;42241:63;42298:5;42241:63;;44623:134;;44714:38;44746:5;44714:38;;45008:268;45073:1;45080:101;45094:6;45091:1;45088:13;45080:101;;;45161:11;;;45155:18;45142:11;;;45135:39;45116:2;45109:10;45080:101;;;45196:6;45193:1;45190:13;45187:2;;;-1:-1;;45261:1;45243:16;;45236:27;45057:219;45284:97;45372:2;45352:14;-1:-1;;45348:28;;45332:49;45389:105;45472:1;45465:5;45462:12;45452:2;;45478:9;45501:117;45570:24;45588:5;45570:24;;;45563:5;45560:35;45550:2;;45609:1;45606;45599:12;45765:111;45831:21;45846:5;45831:21;;45883:117;45952:24;45970:5;45952:24;;46007:108;46090:1;46083:5;46080:12;46070:2;;46106:1;46103;46096:12;46246:113;46313:22;46329:5;46313:22;
Swarm Source
bzzr://fe64246338c31ef223c612c5abeea3c6f17dcd52a47ac8da80ca2e63a4cf87ef
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.