Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 7 internal transactions
Advanced mode:
Loading...
Loading
Contract Name:
MarketAdapter
Compiler Version
v0.6.8+commit.0bbfe453
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-07-09 */ /** *Submitted for verification at Etherscan.io on 2020-07-07 */ // File: @openzeppelin/contracts/math/SafeMath.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @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. */ 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. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { 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. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ 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(_owner == _msgSender(), "Ownable: caller is not the 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 virtual 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 virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol pragma solidity ^0.6.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.6.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.6.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: contracts/ERC721Holder.sol pragma solidity ^0.6.8; contract ERC721Holder is IERC721Receiver { // Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")). bytes4 internal constant NEW_ERC721_RECEIVED = 0x150b7a02; // Equal to: bytes4(keccak256("onERC721Received(address,uint256,bytes)")); bytes4 internal constant OLD_ERC721_RECEIVED = 0xf0b9e5ba; /** * @dev implements old onERC721Received interface */ function onERC721Received(address, uint256, bytes memory) public pure returns (bytes4) { return OLD_ERC721_RECEIVED; } /** * @dev The ERC721 smart contract calls this function on the recipient * after a {IERC721-safeTransferFrom}. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return NEW_ERC721_RECEIVED; } } // File: contracts/ConverterManager.sol pragma solidity ^0.6.8; contract ConverterManager is Ownable { event SetConverter(address indexed converter); // configured fee converter address public converterAddress; /** * @param _converter address of collected fees burner implementation */ function setConverter(address _converter) public virtual onlyOwner { converterAddress = _converter; emit SetConverter(_converter); } } // File: @openzeppelin/contracts/introspection/IERC165.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.6.2; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transfered from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: contracts/ITransferableRegistry.sol pragma solidity ^0.6.8; interface ITransferableRegistry is IERC721 { function transfer(address _to, uint256 _tokenId) external; } // File: contracts/dex/IConverter.sol pragma solidity ^0.6.8; interface IConverter { function getTrader() external view returns (address); function calcNeededTokensForEther(IERC20 _dstToken, uint256 _etherAmount) external view returns (uint256); function swapEtherToToken(IERC20 _dstToken) external payable returns (uint256); function swapTokenToEther(IERC20 _srcToken, uint256 _srcAmount, uint256 _maxDstAmount) external returns (uint256 dstAmount, uint256 srcRemainder); } // File: contracts/MarketAdapter.sol pragma solidity ^0.6.8; contract MarketAdapter is Ownable, ReentrancyGuard, ERC721Holder, ConverterManager { using SafeMath for uint256; using SafeERC20 for IERC20; event ExecutedOrder( address indexed registry, uint256 indexed tokenId, address indexed marketplace, uint256 orderValue, uint256 orderFees ); event MarketplaceAllowance(address indexed marketplace, bool value); event FeesCollectorChange(address indexed collector); event AdapterFeeChange(uint256 previousFee, uint256 newFee); // Allowed tranfer type enum enum TransferType { safeTransferFrom, transferFrom, transfer } // Allowed map of marketplaces mapping (address => bool) public whitelistedMarkets; // Order execution fee in a 0 - 1000000 basis uint256 public adapterTransactionFee; // Max allowed fee for the adapter uint256 public constant ADAPTER_FEE_MAX = 150000; // 15% uint256 public constant ADAPTER_FEE_PRECISION = 1000000; // MarketFeesCollector address address payable public adapterFeesCollector; // address private allowedEthSender; /** * @dev constructor * @param _converter address for the IConverter * @param _collector address for the Fee Collector contract * @param _adapderFee initial adapter fee */ constructor( address _converter, address payable _collector, uint256 _adapderFee ) Ownable() public { setConverter(_converter); setFeesCollector(_collector); setAdapterFee(_adapderFee); } function setConverter(address _converter) public override onlyOwner { // set allowed eth sender from this converter if (_converter != address(0)) { allowedEthSender = IConverter(_converter).getTrader(); } else { delete allowedEthSender; } super.setConverter(_converter); } /** * @dev Sets whitelisting status for a marketplace * @param _marketplace address * @param _action true if allowed, false otherwise */ function setMarketplaceAllowance( address _marketplace, bool _action ) external onlyOwner { whitelistedMarkets[_marketplace] = _action; emit MarketplaceAllowance(_marketplace, _action); } /** * @dev Sets fees collector for the adapter * @param _collector Address for the fees collector */ function setFeesCollector(address payable _collector) public onlyOwner { adapterFeesCollector = _collector; emit FeesCollectorChange(_collector); } /** * @dev Sets the adapter fees taken from every relayed order * @param _transactionFee in a 0 - ADAPTER_FEE_MAX basis */ function setAdapterFee(uint256 _transactionFee) public onlyOwner { require( ADAPTER_FEE_MAX >= _transactionFee, "MarketAdapter: Invalid transaction fee" ); emit AdapterFeeChange(adapterTransactionFee, _transactionFee); adapterTransactionFee = _transactionFee; } /** * @dev Relays buy marketplace order. Uses the IConverter to * swap erc20 tokens to ethers and call _buy() with the exact ether amount * @param _registry NFT registry address * @param _tokenId listed asset Id. * @param _marketplace whitelisted marketplace listing the asset. * @param _encodedCallData forwarded to whitelisted marketplace. * @param _orderAmount (excluding fees) in ethers for the markeplace order * @param _paymentToken ERC20 address of the token used to pay * @param _transferType choice for calling the ERC721 registry * @param _beneficiary where to send the ERC721 token */ function buy( ITransferableRegistry _registry, uint256 _tokenId, address _marketplace, bytes memory _encodedCallData, uint256 _orderAmount, IERC20 _paymentToken, uint256 _maxPaymentTokenAmount, TransferType _transferType, address _beneficiary ) public nonReentrant { IConverter converter = IConverter(converterAddress); // Calc total needed for this order + adapter fees uint256 orderFees = _calcOrderFees(_orderAmount); uint256 totalOrderAmount = _orderAmount.add(orderFees); // Get amount of srcTokens needed for the exchange uint256 paymentTokenAmount = converter.calcNeededTokensForEther( _paymentToken, totalOrderAmount ); require( paymentTokenAmount > 0, "MarketAdapter: paymentTokenAmount invalid" ); require( paymentTokenAmount <= _maxPaymentTokenAmount, "MarketAdapter: paymentTokenAmount > _maxPaymentTokenAmount" ); // Get Tokens from sender _paymentToken.safeTransferFrom( msg.sender, address(this), paymentTokenAmount ); // allow converter for this paymentTokenAmount transfer _paymentToken.safeApprove(converterAddress, paymentTokenAmount); // Get ethers from converter (uint256 convertedEth, uint256 remainderTokenAmount) = converter.swapTokenToEther( _paymentToken, paymentTokenAmount, totalOrderAmount ); require( convertedEth == totalOrderAmount, "MarketAdapter: invalid ether amount after conversion" ); if (remainderTokenAmount > 0) { _paymentToken.safeTransfer(msg.sender, remainderTokenAmount); } _buy( _registry, _tokenId, _marketplace, _encodedCallData, _orderAmount, orderFees, _transferType, _beneficiary ); } /** * @dev Relays buy marketplace order taking the configured fees * from message value. * @param _registry NFT registry address * @param _tokenId listed asset Id. * @param _marketplace whitelisted marketplace listing the asset. * @param _encodedCallData forwarded to whitelisted marketplace. * @param _orderAmount (excluding fees) in ethers for the markeplace order * @param _transferType choice for calling the ERC721 registry * @param _beneficiary where to send the ERC721 token */ function buy( ITransferableRegistry _registry, uint256 _tokenId, address _marketplace, bytes memory _encodedCallData, uint256 _orderAmount, TransferType _transferType, address _beneficiary ) public payable nonReentrant { // Calc total needed for this order + adapter fees uint256 orderFees = _calcOrderFees(_orderAmount); uint256 totalOrderAmount = _orderAmount.add(orderFees); // Check the order + fees require( msg.value == totalOrderAmount, "MarketAdapter: invalid msg.value != (order + fees)" ); _buy( _registry, _tokenId, _marketplace, _encodedCallData, _orderAmount, orderFees, _transferType, _beneficiary ); } /** * @dev Internal call relays the order to a whitelisted marketplace. * @param _registry NFT registry address * @param _tokenId listed asset Id. * @param _marketplace whitelisted marketplace listing the asset. * @param _encodedCallData forwarded to whitelisted marketplace. * @param _orderAmount (excluding fees) in ethers for the markeplace order * @param _feesAmount in ethers for the order * @param _transferType choice for calling the ERC721 registry * @param _beneficiary where to send the ERC721 token */ function _buy( ITransferableRegistry _registry, uint256 _tokenId, address _marketplace, bytes memory _encodedCallData, uint256 _orderAmount, uint256 _feesAmount, TransferType _transferType, address _beneficiary ) private { require(_orderAmount > 0, "MarketAdapter: invalid order value"); // require( // whitelistedMarkets[_marketplace], // "MarketAdapter: dest market is not whitelisted" // ); // Save contract balance before call to marketplace uint256 preCallBalance = address(this).balance; // execute buy order in destination marketplace (bool success, ) = _marketplace.call{ value: _orderAmount }( _encodedCallData ); require( success, "MarketAdapter: marketplace failed to execute buy order" ); require( address(this).balance == preCallBalance.sub(_orderAmount), "MarketAdapter: postcall balance mismatch" ); require( _registry.ownerOf(_tokenId) == address(this), "MarketAdapter: tokenId not transfered" ); // Send balance to Collector. Reverts on failure if (adapterFeesCollector != address(0) && address(this).balance > 0) { require( adapterFeesCollector.send(address(this).balance), "MarketAdapter: error sending fees to collector" ); } // Transfer tokenId to caller _transferItem( _registry, _tokenId, _transferType, _beneficiary ); // Log succesful executed order emit ExecutedOrder( address(_registry), _tokenId, _marketplace, _orderAmount, _feesAmount ); } /** * @dev Transfer the NFT to the final owner * @param _registry NFT registry address * @param _tokenId listed token Id. * @param _transferType choice for calling the ERC721 registry * @param _beneficiary where to send the ERC721 token */ function _transferItem( ITransferableRegistry _registry, uint256 _tokenId, TransferType _transferType, address _beneficiary ) private { require(_beneficiary != address(this), "MarketAdapter: invalid beneficiary"); if (_transferType == TransferType.safeTransferFrom) { _registry.safeTransferFrom(address(this), _beneficiary, _tokenId); } else if (_transferType == TransferType.transferFrom) { _registry.transferFrom( address(this), _beneficiary, _tokenId ); } else if (_transferType == TransferType.transfer) { _registry.transfer( _beneficiary, _tokenId ); } else { revert('MarketAdapter: Unsopported transferType'); } require( _registry.ownerOf(_tokenId) == _beneficiary, "MarketAdapter: error with asset transfer" ); } /** * @param _orderAmount item value as in the NFT marketplace * @return adapter fees from total order value */ function _calcOrderFees(uint256 _orderAmount) private view returns (uint256) { return _orderAmount .mul(adapterTransactionFee) .div(ADAPTER_FEE_PRECISION); } receive() external payable { require(msg.sender != tx.origin, "MarketAdapter: sender invalid"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_converter","type":"address"},{"internalType":"address payable","name":"_collector","type":"address"},{"internalType":"uint256","name":"_adapderFee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"AdapterFeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"registry","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"marketplace","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"orderFees","type":"uint256"}],"name":"ExecutedOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collector","type":"address"}],"name":"FeesCollectorChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"marketplace","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"MarketplaceAllowance","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"converter","type":"address"}],"name":"SetConverter","type":"event"},{"inputs":[],"name":"ADAPTER_FEE_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADAPTER_FEE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adapterFeesCollector","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adapterTransactionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ITransferableRegistry","name":"_registry","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_marketplace","type":"address"},{"internalType":"bytes","name":"_encodedCallData","type":"bytes"},{"internalType":"uint256","name":"_orderAmount","type":"uint256"},{"internalType":"enum MarketAdapter.TransferType","name":"_transferType","type":"uint8"},{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract ITransferableRegistry","name":"_registry","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_marketplace","type":"address"},{"internalType":"bytes","name":"_encodedCallData","type":"bytes"},{"internalType":"uint256","name":"_orderAmount","type":"uint256"},{"internalType":"contract IERC20","name":"_paymentToken","type":"address"},{"internalType":"uint256","name":"_maxPaymentTokenAmount","type":"uint256"},{"internalType":"enum MarketAdapter.TransferType","name":"_transferType","type":"uint8"},{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"buy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"converterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transactionFee","type":"uint256"}],"name":"setAdapterFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_converter","type":"address"}],"name":"setConverter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_collector","type":"address"}],"name":"setFeesCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketplace","type":"address"},{"internalType":"bool","name":"_action","type":"bool"}],"name":"setMarketplaceAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedMarkets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003a3e38038062003a3e833981810160405260608110156200003757600080fd5b8101908080519060200190929190805190602001909291908051906020019092919050505060006200006e6200014f60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506001808190555062000124836200015760201b60201c565b62000135826200036760201b60201c565b6200014681620004c060201b60201c565b50505062000794565b600033905090565b620001676200014f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000229576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161462000328578073ffffffffffffffffffffffffffffffffffffffff16637df493006040518163ffffffff1660e01b815260040160206040518083038186803b158015620002a557600080fd5b505afa158015620002ba573d6000803e3d6000fd5b505050506040513d6020811015620002d157600080fd5b8101908080519060200190929190505050600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200034e565b600660006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b62000364816200063b60201b62001a931760201c565b50565b620003776200014f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000439576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fba265e20be387f8937b3b82562be8389bc8d09d0342f59413cdbc3dd414e564260405160405180910390a250565b620004d06200014f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000592576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80620249f01015620005f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018062003a186026913960400191505060405180910390fd5b7f552893ff1179f25b1926dceb67fd12d0cc80f321a3ab90033956728e3ab106b960045482604051808381526020018281526020019250505060405180910390a18060048190555050565b6200064b6200014f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146200070d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fc06343c9448e37c4ed257861469b4b35c140991c9cf08a4c38d335a1bc6a75d360405160405180910390a250565b61327480620007a46000396000f3fe6080604052600436106101025760003560e01c806391c0871c11610095578063ce45332611610064578063ce453326146107ed578063e68b495114610844578063f0b9e5ba146108ad578063f2fde38b146109f1578063fd7d4b8f14610a42576101ab565b806391c0871c14610590578063b19337a414610704578063b226791714610755578063ba215f63146107b2576101ab565b806370bbde42116100d157806370bbde42146103bb578063715018a6146103e6578063742e08e3146103fd5780638da5cb5b14610539576101ab565b8063150b7a02146101b05780632c5eadde14610314578063373071f21461033f57806345ce5f1914610390576101ab565b366101ab573273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156101a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d61726b6574416461707465723a2073656e64657220696e76616c696400000081525060200191505060405180910390fd5b005b600080fd5b3480156101bc57600080fd5b506102c0600480360360808110156101d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561023a57600080fd5b82018360208201111561024c57600080fd5b8035906020019184600183028401116401000000008311171561026e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610a99565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34801561032057600080fd5b50610329610aad565b6040518082815260200191505060405180910390f35b34801561034b57600080fd5b5061038e6004803603602081101561036257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ab4565b005b34801561039c57600080fd5b506103a5610c04565b6040518082815260200191505060405180910390f35b3480156103c757600080fd5b506103d0610c0a565b6040518082815260200191505060405180910390f35b3480156103f257600080fd5b506103fb610c11565b005b610537600480360360e081101561041357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561047a57600080fd5b82018360208201111561048c57600080fd5b803590602001918460018302840111640100000000831117156104ae57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d99565b005b34801561054557600080fd5b5061054e610eb8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059c57600080fd5b5061070260048036036101208110156105b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561061b57600080fd5b82018360208201111561062d57600080fd5b8035906020019184600183028401116401000000008311171561064f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ee1565b005b34801561071057600080fd5b506107536004803603602081101561072757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061132c565b005b34801561076157600080fd5b506107b06004803603604081101561077857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611521565b005b3480156107be57600080fd5b506107eb600480360360208110156107d557600080fd5b8101908080359060200190929190505050611697565b005b3480156107f957600080fd5b50610802611807565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561085057600080fd5b506108936004803603602081101561086757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061182d565b604051808215151515815260200191505060405180910390f35b3480156108b957600080fd5b5061099d600480360360608110156108d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561091757600080fd5b82018360208201111561092957600080fd5b8035906020019184600183028401116401000000008311171561094b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061184d565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3480156109fd57600080fd5b50610a4060048036036020811015610a1457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611860565b005b348015610a4e57600080fd5b50610a57611a6d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600063150b7a0260e01b9050949350505050565b620249f081565b610abc611be3565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b7d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fba265e20be387f8937b3b82562be8389bc8d09d0342f59413cdbc3dd414e564260405160405180910390a250565b60045481565b620f424081565b610c19611be3565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cda576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60026001541415610e12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000610e2584611beb565b90506000610e3c8286611c1e90919063ffffffff16565b9050803414610e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061318b6032913960400191505060405180910390fd5b610ea68989898989878a8a611ca6565b50506001808190555050505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60026001541415610f5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000610f9487611beb565b90506000610fab8289611c1e90919063ffffffff16565b905060008373ffffffffffffffffffffffffffffffffffffffff1663b27f823689846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561103457600080fd5b505afa158015611048573d6000803e3d6000fd5b505050506040513d602081101561105e57600080fd5b81019080805190602001909291905050509050600081116110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806131626029913960400191505060405180910390fd5b86811115611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180613066603a913960400191505060405180910390fd5b6111503330838b73ffffffffffffffffffffffffffffffffffffffff16612123909392919063ffffffff16565b61119d600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828a73ffffffffffffffffffffffffffffffffffffffff166122109092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff16633bba21dc8b85876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200193505050506040805180830381600087803b15801561122e57600080fd5b505af1158015611242573d6000803e3d6000fd5b505050506040513d604081101561125857600080fd5b810190808051906020019092919080519060200190929190505050915091508382146112cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806130326034913960400191505060405180910390fd5b60008111156113045761130333828c73ffffffffffffffffffffffffffffffffffffffff166124179092919063ffffffff16565b5b6113148f8f8f8f8f8a8e8e611ca6565b50505050505060018081905550505050505050505050565b611334611be3565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114ef578073ffffffffffffffffffffffffffffffffffffffff16637df493006040518163ffffffff1660e01b815260040160206040518083038186803b15801561146f57600080fd5b505afa158015611483573d6000803e3d6000fd5b505050506040513d602081101561149957600080fd5b8101908080519060200190929190505050600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611515565b600660006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b61151e81611a93565b50565b611529611be3565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167ff7dd1466eecc05f4735e6fdb5c9d192c283b490e767ecbfd047742210c8bbaf782604051808215151515815260200191505060405180910390a25050565b61169f611be3565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611760576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80620249f010156117bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806130a06026913960400191505060405180910390fd5b7f552893ff1179f25b1926dceb67fd12d0cc80f321a3ab90033956728e3ab106b960045482604051808381526020018281526020019250505060405180910390a18060048190555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b600063f0b9e5ba60e01b90509392505050565b611868611be3565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611929576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612f9b6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611a9b611be3565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fc06343c9448e37c4ed257861469b4b35c140991c9cf08a4c38d335a1bc6a75d360405160405180910390a250565b600033905090565b6000611c17620f4240611c09600454856124cf90919063ffffffff16565b61255590919063ffffffff16565b9050919050565b600080828401905083811015611c9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008411611cff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806131bd6022913960400191505060405180910390fd5b600047905060008773ffffffffffffffffffffffffffffffffffffffff1686886040518082805190602001908083835b60208310611d525780518252602082019150602081019050602083039250611d2f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611db4576040519150601f19603f3d011682016040523d82523d6000602084013e611db9565b606091505b5050905080611e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180612f656036913960400191505060405180910390fd5b611e26868361259f90919063ffffffff16565b4714611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612fc16028913960400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16636352211e8b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611ee557600080fd5b505afa158015611ef9573d6000803e3d6000fd5b505050506040513d6020811015611f0f57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614611f8c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806131156025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015611feb5750600047115b1561209d57600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061209c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806130c6602e913960400191505060405180910390fd5b5b6120a98a8a86866125e9565b8773ffffffffffffffffffffffffffffffffffffffff16898b73ffffffffffffffffffffffffffffffffffffffff167f41db66efa207667201b031e90bc1ac58c2af27431cb9961a9391c8d9485c1c5b8989604051808381526020018281526020019250505060405180910390a450505050505050505050565b61220a846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a86565b50505050565b600081148061230a575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156122cd57600080fd5b505afa1580156122e1573d6000803e3d6000fd5b505050506040513d60208110156122f757600080fd5b8101908080519060200190929190505050145b61235f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806132096036913960400191505060405180910390fd5b6124128363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a86565b505050565b6124ca8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a86565b505050565b6000808314156124e2576000905061254f565b60008284029050828482816124f357fe5b041461254a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806130f46021913960400191505060405180910390fd5b809150505b92915050565b600061259783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b75565b905092915050565b60006125e183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c3b565b905092915050565b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561266e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180612fe96022913960400191505060405180910390fd5b6000600281111561267b57fe5b82600281111561268757fe5b1415612765578373ffffffffffffffffffffffffffffffffffffffff166342842e0e3083866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561274857600080fd5b505af115801561275c573d6000803e3d6000fd5b50505050612971565b6001600281111561277257fe5b82600281111561277e57fe5b141561285c578373ffffffffffffffffffffffffffffffffffffffff166323b872dd3083866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561283f57600080fd5b505af1158015612853573d6000803e3d6000fd5b50505050612970565b60028081111561286857fe5b82600281111561287457fe5b141561291e578373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561290157600080fd5b505af1158015612915573d6000803e3d6000fd5b5050505061296f565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061300b6027913960400191505060405180910390fd5b5b5b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156129d957600080fd5b505afa1580156129ed573d6000803e3d6000fd5b505050506040513d6020811015612a0357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614612a80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061313a6028913960400191505060405180910390fd5b50505050565b6060612ae8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612cfb9092919063ffffffff16565b9050600081511115612b7057808060200190516020811015612b0957600080fd5b8101908080519060200190929190505050612b6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806131df602a913960400191505060405180910390fd5b5b505050565b60008083118290612c21576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612be6578082015181840152602081019050612bcb565b50505050905090810190601f168015612c135780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612c2d57fe5b049050809150509392505050565b6000838311158290612ce8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612cad578082015181840152602081019050612c92565b50505050905090810190601f168015612cda5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6060612d0a8484600085612d13565b90509392505050565b6060612d1e85612f19565b612d90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310612de05780518252602082019150602081019050602083039250612dbd565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612e42576040519150601f19603f3d011682016040523d82523d6000602084013e612e47565b606091505b50915091508115612e5c578092505050612f11565b600081511115612e6f5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612ed6578082015181840152602081019050612ebb565b50505050905090810190601f168015612f035780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015612f5b57506000801b8214155b9250505091905056fe4d61726b6574416461707465723a206d61726b6574706c616365206661696c656420746f206578656375746520627579206f726465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734d61726b6574416461707465723a20706f737463616c6c2062616c616e6365206d69736d617463684d61726b6574416461707465723a20696e76616c69642062656e65666963696172794d61726b6574416461707465723a20556e736f70706f72746564207472616e73666572547970654d61726b6574416461707465723a20696e76616c696420657468657220616d6f756e7420616674657220636f6e76657273696f6e4d61726b6574416461707465723a207061796d656e74546f6b656e416d6f756e74203e205f6d61785061796d656e74546f6b656e416d6f756e744d61726b6574416461707465723a20496e76616c6964207472616e73616374696f6e206665654d61726b6574416461707465723a206572726f722073656e64696e67206665657320746f20636f6c6c6563746f72536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774d61726b6574416461707465723a20746f6b656e4964206e6f74207472616e7366657265644d61726b6574416461707465723a206572726f722077697468206173736574207472616e736665724d61726b6574416461707465723a207061796d656e74546f6b656e416d6f756e7420696e76616c69644d61726b6574416461707465723a20696e76616c6964206d73672e76616c756520213d20286f72646572202b2066656573294d61726b6574416461707465723a20696e76616c6964206f726465722076616c75655361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212208ef17bd5cc1425db1573db16cbd4e92ab5cce3af2f085131cd462335d80ab41a64736f6c634300060800334d61726b6574416461707465723a20496e76616c6964207472616e73616374696f6e206665650000000000000000000000002859581da59bd4e16a866dd06b461b76d8e489a400000000000000000000000093a7c46443901c2ea2fc1263a4d076f470695d3a0000000000000000000000000000000000000000000000000000000000002710
Deployed Bytecode
0x6080604052600436106101025760003560e01c806391c0871c11610095578063ce45332611610064578063ce453326146107ed578063e68b495114610844578063f0b9e5ba146108ad578063f2fde38b146109f1578063fd7d4b8f14610a42576101ab565b806391c0871c14610590578063b19337a414610704578063b226791714610755578063ba215f63146107b2576101ab565b806370bbde42116100d157806370bbde42146103bb578063715018a6146103e6578063742e08e3146103fd5780638da5cb5b14610539576101ab565b8063150b7a02146101b05780632c5eadde14610314578063373071f21461033f57806345ce5f1914610390576101ab565b366101ab573273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156101a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d61726b6574416461707465723a2073656e64657220696e76616c696400000081525060200191505060405180910390fd5b005b600080fd5b3480156101bc57600080fd5b506102c0600480360360808110156101d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561023a57600080fd5b82018360208201111561024c57600080fd5b8035906020019184600183028401116401000000008311171561026e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610a99565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34801561032057600080fd5b50610329610aad565b6040518082815260200191505060405180910390f35b34801561034b57600080fd5b5061038e6004803603602081101561036257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ab4565b005b34801561039c57600080fd5b506103a5610c04565b6040518082815260200191505060405180910390f35b3480156103c757600080fd5b506103d0610c0a565b6040518082815260200191505060405180910390f35b3480156103f257600080fd5b506103fb610c11565b005b610537600480360360e081101561041357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561047a57600080fd5b82018360208201111561048c57600080fd5b803590602001918460018302840111640100000000831117156104ae57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d99565b005b34801561054557600080fd5b5061054e610eb8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059c57600080fd5b5061070260048036036101208110156105b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561061b57600080fd5b82018360208201111561062d57600080fd5b8035906020019184600183028401116401000000008311171561064f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ee1565b005b34801561071057600080fd5b506107536004803603602081101561072757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061132c565b005b34801561076157600080fd5b506107b06004803603604081101561077857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611521565b005b3480156107be57600080fd5b506107eb600480360360208110156107d557600080fd5b8101908080359060200190929190505050611697565b005b3480156107f957600080fd5b50610802611807565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561085057600080fd5b506108936004803603602081101561086757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061182d565b604051808215151515815260200191505060405180910390f35b3480156108b957600080fd5b5061099d600480360360608110156108d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561091757600080fd5b82018360208201111561092957600080fd5b8035906020019184600183028401116401000000008311171561094b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061184d565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3480156109fd57600080fd5b50610a4060048036036020811015610a1457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611860565b005b348015610a4e57600080fd5b50610a57611a6d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600063150b7a0260e01b9050949350505050565b620249f081565b610abc611be3565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b7d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fba265e20be387f8937b3b82562be8389bc8d09d0342f59413cdbc3dd414e564260405160405180910390a250565b60045481565b620f424081565b610c19611be3565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cda576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60026001541415610e12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000610e2584611beb565b90506000610e3c8286611c1e90919063ffffffff16565b9050803414610e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061318b6032913960400191505060405180910390fd5b610ea68989898989878a8a611ca6565b50506001808190555050505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60026001541415610f5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000610f9487611beb565b90506000610fab8289611c1e90919063ffffffff16565b905060008373ffffffffffffffffffffffffffffffffffffffff1663b27f823689846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561103457600080fd5b505afa158015611048573d6000803e3d6000fd5b505050506040513d602081101561105e57600080fd5b81019080805190602001909291905050509050600081116110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806131626029913960400191505060405180910390fd5b86811115611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180613066603a913960400191505060405180910390fd5b6111503330838b73ffffffffffffffffffffffffffffffffffffffff16612123909392919063ffffffff16565b61119d600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828a73ffffffffffffffffffffffffffffffffffffffff166122109092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff16633bba21dc8b85876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200193505050506040805180830381600087803b15801561122e57600080fd5b505af1158015611242573d6000803e3d6000fd5b505050506040513d604081101561125857600080fd5b810190808051906020019092919080519060200190929190505050915091508382146112cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806130326034913960400191505060405180910390fd5b60008111156113045761130333828c73ffffffffffffffffffffffffffffffffffffffff166124179092919063ffffffff16565b5b6113148f8f8f8f8f8a8e8e611ca6565b50505050505060018081905550505050505050505050565b611334611be3565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114ef578073ffffffffffffffffffffffffffffffffffffffff16637df493006040518163ffffffff1660e01b815260040160206040518083038186803b15801561146f57600080fd5b505afa158015611483573d6000803e3d6000fd5b505050506040513d602081101561149957600080fd5b8101908080519060200190929190505050600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611515565b600660006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b61151e81611a93565b50565b611529611be3565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167ff7dd1466eecc05f4735e6fdb5c9d192c283b490e767ecbfd047742210c8bbaf782604051808215151515815260200191505060405180910390a25050565b61169f611be3565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611760576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80620249f010156117bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806130a06026913960400191505060405180910390fd5b7f552893ff1179f25b1926dceb67fd12d0cc80f321a3ab90033956728e3ab106b960045482604051808381526020018281526020019250505060405180910390a18060048190555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b600063f0b9e5ba60e01b90509392505050565b611868611be3565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611929576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612f9b6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611a9b611be3565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fc06343c9448e37c4ed257861469b4b35c140991c9cf08a4c38d335a1bc6a75d360405160405180910390a250565b600033905090565b6000611c17620f4240611c09600454856124cf90919063ffffffff16565b61255590919063ffffffff16565b9050919050565b600080828401905083811015611c9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008411611cff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806131bd6022913960400191505060405180910390fd5b600047905060008773ffffffffffffffffffffffffffffffffffffffff1686886040518082805190602001908083835b60208310611d525780518252602082019150602081019050602083039250611d2f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611db4576040519150601f19603f3d011682016040523d82523d6000602084013e611db9565b606091505b5050905080611e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180612f656036913960400191505060405180910390fd5b611e26868361259f90919063ffffffff16565b4714611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612fc16028913960400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16636352211e8b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611ee557600080fd5b505afa158015611ef9573d6000803e3d6000fd5b505050506040513d6020811015611f0f57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614611f8c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806131156025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015611feb5750600047115b1561209d57600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061209c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806130c6602e913960400191505060405180910390fd5b5b6120a98a8a86866125e9565b8773ffffffffffffffffffffffffffffffffffffffff16898b73ffffffffffffffffffffffffffffffffffffffff167f41db66efa207667201b031e90bc1ac58c2af27431cb9961a9391c8d9485c1c5b8989604051808381526020018281526020019250505060405180910390a450505050505050505050565b61220a846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a86565b50505050565b600081148061230a575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156122cd57600080fd5b505afa1580156122e1573d6000803e3d6000fd5b505050506040513d60208110156122f757600080fd5b8101908080519060200190929190505050145b61235f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806132096036913960400191505060405180910390fd5b6124128363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a86565b505050565b6124ca8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a86565b505050565b6000808314156124e2576000905061254f565b60008284029050828482816124f357fe5b041461254a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806130f46021913960400191505060405180910390fd5b809150505b92915050565b600061259783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b75565b905092915050565b60006125e183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c3b565b905092915050565b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561266e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180612fe96022913960400191505060405180910390fd5b6000600281111561267b57fe5b82600281111561268757fe5b1415612765578373ffffffffffffffffffffffffffffffffffffffff166342842e0e3083866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561274857600080fd5b505af115801561275c573d6000803e3d6000fd5b50505050612971565b6001600281111561277257fe5b82600281111561277e57fe5b141561285c578373ffffffffffffffffffffffffffffffffffffffff166323b872dd3083866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561283f57600080fd5b505af1158015612853573d6000803e3d6000fd5b50505050612970565b60028081111561286857fe5b82600281111561287457fe5b141561291e578373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561290157600080fd5b505af1158015612915573d6000803e3d6000fd5b5050505061296f565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061300b6027913960400191505060405180910390fd5b5b5b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156129d957600080fd5b505afa1580156129ed573d6000803e3d6000fd5b505050506040513d6020811015612a0357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614612a80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061313a6028913960400191505060405180910390fd5b50505050565b6060612ae8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612cfb9092919063ffffffff16565b9050600081511115612b7057808060200190516020811015612b0957600080fd5b8101908080519060200190929190505050612b6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806131df602a913960400191505060405180910390fd5b5b505050565b60008083118290612c21576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612be6578082015181840152602081019050612bcb565b50505050905090810190601f168015612c135780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612c2d57fe5b049050809150509392505050565b6000838311158290612ce8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612cad578082015181840152602081019050612c92565b50505050905090810190601f168015612cda5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6060612d0a8484600085612d13565b90509392505050565b6060612d1e85612f19565b612d90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310612de05780518252602082019150602081019050602083039250612dbd565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612e42576040519150601f19603f3d011682016040523d82523d6000602084013e612e47565b606091505b50915091508115612e5c578092505050612f11565b600081511115612e6f5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612ed6578082015181840152602081019050612ebb565b50505050905090810190601f168015612f035780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015612f5b57506000801b8214155b9250505091905056fe4d61726b6574416461707465723a206d61726b6574706c616365206661696c656420746f206578656375746520627579206f726465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734d61726b6574416461707465723a20706f737463616c6c2062616c616e6365206d69736d617463684d61726b6574416461707465723a20696e76616c69642062656e65666963696172794d61726b6574416461707465723a20556e736f70706f72746564207472616e73666572547970654d61726b6574416461707465723a20696e76616c696420657468657220616d6f756e7420616674657220636f6e76657273696f6e4d61726b6574416461707465723a207061796d656e74546f6b656e416d6f756e74203e205f6d61785061796d656e74546f6b656e416d6f756e744d61726b6574416461707465723a20496e76616c6964207472616e73616374696f6e206665654d61726b6574416461707465723a206572726f722073656e64696e67206665657320746f20636f6c6c6563746f72536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774d61726b6574416461707465723a20746f6b656e4964206e6f74207472616e7366657265644d61726b6574416461707465723a206572726f722077697468206173736574207472616e736665724d61726b6574416461707465723a207061796d656e74546f6b656e416d6f756e7420696e76616c69644d61726b6574416461707465723a20696e76616c6964206d73672e76616c756520213d20286f72646572202b2066656573294d61726b6574416461707465723a20696e76616c6964206f726465722076616c75655361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212208ef17bd5cc1425db1573db16cbd4e92ab5cce3af2f085131cd462335d80ab41a64736f6c63430006080033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002859581da59bd4e16a866dd06b461b76d8e489a400000000000000000000000093a7c46443901c2ea2fc1263a4d076f470695d3a0000000000000000000000000000000000000000000000000000000000002710
-----Decoded View---------------
Arg [0] : _converter (address): 0x2859581da59BD4e16a866Dd06b461b76d8E489a4
Arg [1] : _collector (address): 0x93A7C46443901c2eA2fc1263a4d076F470695d3A
Arg [2] : _adapderFee (uint256): 10000
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000002859581da59bd4e16a866dd06b461b76d8e489a4
Arg [1] : 00000000000000000000000093a7c46443901c2ea2fc1263a4d076f470695d3a
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002710
Deployed Bytecode Sourcemap
32968:11893:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44807:9;44793:23;;:10;:23;;;;44785:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32968:11893;;12:1:-1;9;2:12;25911:210:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25911:210:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25911:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;14;11:28;8:2;;;52:1;49;42:12;8:2;25911:210:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25911:210:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;25911:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;25911:210:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;33883:48;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33883:48:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35536:170;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35536:170:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;35536:170:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;33798:36;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33798:36:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33945:55;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33945:55:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8199:148;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8199:148:0;;;:::i;:::-;;39581:909;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;39581:909:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;14;11:28;8:2;;;52:1;49;42:12;8:2;39581:909:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;39581:909:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;39581:909:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;39581:909:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;7557:79;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7557:79:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36864:2158;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36864:2158:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;36864:2158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;14;11:28;8:2;;;52:1;49;42:12;8:2;36864:2158:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;36864:2158:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;36864:2158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;36864:2158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34629:354;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34629:354:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34629:354:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;35157:247;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35157:247:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;35157:247:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35860:328;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35860:328:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;35860:328:0;;;;;;;;;;;;;;;;;:::i;:::-;;26337:31;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26337:31:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33687:51;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33687:51:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;33687:51:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25632:132;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25632:132:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;25632:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;14;11:28;8:2;;;52:1;49;42:12;8:2;25632:132:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25632:132:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;25632:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;25632:132:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;8502:244;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8502:244:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;8502:244:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;34045:43;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34045:43:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25911:210;26063:6;25394:10;26094:19;;26087:26;;25911:210;;;;;;:::o;33883:48::-;33925:6;33883:48;:::o;35536:170::-;7779:12;:10;:12::i;:::-;7769:22;;:6;;;;;;;;;;;:22;;;7761:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35641:10:::1;35618:20;;:33;;;;;;;;;;;;;;;;;;35687:10;35667:31;;;;;;;;;;;;35536:170:::0;:::o;33798:36::-;;;;:::o;33945:55::-;33993:7;33945:55;:::o;8199:148::-;7779:12;:10;:12::i;:::-;7769:22;;:6;;;;;;;;;;;:22;;;7761:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8306:1:::1;8269:40;;8290:6;::::0;::::1;;;;;;;;;8269:40;;;;;;;;;;;;8337:1;8320:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;8199:148::o:0;39581:909::-;10488:1;11094:7;;:19;;11086:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10488:1;11227:7;:18;;;;39953:17:::1;39973:28;39988:12;39973:14;:28::i;:::-;39953:48;;40012:24;40039:27;40056:9;40039:12;:16;;:27;;;;:::i;:::-;40012:54;;40149:16;40136:9;:29;40114:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40256:226;40275:9;40299:8;40322:12;40349:16;40380:12;40407:9;40431:13;40459:12;40256:4;:226::i;:::-;11258:1;;10444::::0;11406:7;:22;;;;39581:909;;;;;;;:::o;7557:79::-;7595:7;7622:6;;;;;;;;;;;7615:13;;7557:79;:::o;36864:2158::-;10488:1;11094:7;;:19;;11086:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10488:1;11227:7;:18;;;;37240:20:::1;37274:16;;;;;;;;;;;37240:51;;37364:17;37384:28;37399:12;37384:14;:28::i;:::-;37364:48;;37423:24;37450:27;37467:9;37450:12;:16;;:27;;;;:::i;:::-;37423:54;;37550:26;37579:9;:34;;;37628:13;37656:16;37579:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;37579:104:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;37579:104:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;37579:104:0;;;;;;;;;;;;;;;;37550:133;;37739:1;37718:18;:22;37696:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37866:22;37844:18;:44;;37822:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38022:101;38067:10;38087:4;38094:18;38022:13;:30;;;;:101;;;;;;:::i;:::-;38201:63;38227:16;;;;;;;;;;;38245:18;38201:13;:25;;;;:63;;;;;:::i;:::-;38316:20;38338:28:::0;38370:9:::1;:26;;;38411:13;38439:18;38472:16;38370:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;38370:129:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;38370:129:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;38370:129:0;;;;;;;;;;;;;;;;;;;;;;;;;38315:184;;;;38550:16;38534:12;:32;38512:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38686:1;38663:20;:24;38659:117;;;38704:60;38731:10;38743:20;38704:13;:26;;;;:60;;;;;:::i;:::-;38659:117;38788:226;38807:9;38831:8;38854:12;38881:16;38912:12;38939:9;38963:13;38991:12;38788:4;:226::i;:::-;11258:1;;;;;;10444::::0;11406:7;:22;;;;36864:2158;;;;;;;;;:::o;34629:354::-;7779:12;:10;:12::i;:::-;7769:22;;:6;;;;;;;;;;;:22;;;7761:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34791:1:::1;34769:24;;:10;:24;;;34765:168;;34840:10;34829:32;;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;34829:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34829:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;34829:34:0;;;;;;;;;;;;;;;;34810:16;;:53;;;;;;;;;;;;;;;;;;34765:168;;;34905:16;;34898:23;;;;;;;;;;;34765:168;34945:30;34964:10;34945:18;:30::i;:::-;34629:354:::0;:::o;35157:247::-;7779:12;:10;:12::i;:::-;7769:22;;:6;;;;;;;;;;;:22;;;7761:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35330:7:::1;35295:18;:32;35314:12;35295:32;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;35374:12;35353:43;;;35388:7;35353:43;;;;;;;;;;;;;;;;;;;;;;35157:247:::0;;:::o;35860:328::-;7779:12;:10;:12::i;:::-;7769:22;;:6;;;;;;;;;;;:22;;;7761:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35977:15:::1;33925:6;35958:34;;35936:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36074:56;36091:21;;36114:15;36074:56;;;;;;;;;;;;;;;;;;;;;;;;36165:15;36141:21;:39;;;;35860:328:::0;:::o;26337:31::-;;;;;;;;;;;;;:::o;33687:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;25632:132::-;25711:6;25540:10;25737:19;;25730:26;;25632:132;;;;;:::o;8502:244::-;7779:12;:10;:12::i;:::-;7769:22;;:6;;;;;;;;;;;:22;;;7761:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8611:1:::1;8591:22;;:8;:22;;;;8583:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8701:8;8672:38;;8693:6;::::0;::::1;;;;;;;;;8672:38;;;;;;;;;;;;8730:8;8721:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;8502:244:::0;:::o;34045:43::-;;;;;;;;;;;;;:::o;26469:155::-;7779:12;:10;:12::i;:::-;7769:22;;:6;;;;;;;;;;;:22;;;7761:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26566:10:::1;26547:16;;:29;;;;;;;;;;;;;;;;;;26605:10;26592:24;;;;;;;;;;;;26469:155:::0;:::o;6111:106::-;6164:15;6199:10;6192:17;;6111:106;:::o;44542:197::-;44610:7;44637:94;33993:7;44637:53;44668:21;;44637:12;:30;;:53;;;;:::i;:::-;:71;;:94;;;;:::i;:::-;44630:101;;44542:197;;;:::o;1027:181::-;1085:7;1105:9;1121:1;1117;:5;1105:17;;1146:1;1141;:6;;1133:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1199:1;1192:8;;;1027:181;;;;:::o;41076:1984::-;41422:1;41407:12;:16;41399:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41688:22;41713:21;41688:46;;41805:12;41823;:17;;41849:12;41878:16;41823:82;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;41823:82:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;41804:101:0;;;41940:7;41918:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42089:32;42108:12;42089:14;:18;;:32;;;;:::i;:::-;42064:21;:57;42042:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42263:4;42224:44;;:9;:17;;;42242:8;42224:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42224:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42224:27:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;42224:27:0;;;;;;;;;;;;;;;;:44;;;42202:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42440:1;42408:34;;:20;;;;;;;;;;;:34;;;;:63;;;;;42470:1;42446:21;:25;42408:63;42404:252;;;42514:20;;;;;;;;;;;:25;;:48;42540:21;42514:48;;;;;;;;;;;;;;;;;;;;;;;42488:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42404:252;42707:126;42735:9;42759:8;42782:13;42810:12;42707:13;:126::i;:::-;42976:12;42892:160;;42953:8;42928:9;42892:160;;;43003:12;43030:11;42892:160;;;;;;;;;;;;;;;;;;;;;;;;41076:1984;;;;;;;;;;:::o;21327:205::-;21428:96;21448:5;21478:27;;;21507:4;21513:2;21517:5;21455:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;21455:68:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;21455:68:0;21428:19;:96::i;:::-;21327:205;;;;:::o;21801:622::-;22180:1;22171:5;:10;22170:62;;;;22230:1;22187:5;:15;;;22211:4;22218:7;22187:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22187:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22187:39:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;22187:39:0;;;;;;;;;;;;;;;;:44;22170:62;22162:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22325:90;22345:5;22375:22;;;22399:7;22408:5;22352:62;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;22352:62:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;22352:62:0;22325:19;:90::i;:::-;21801:622;;;:::o;21142:177::-;21225:86;21245:5;21275:23;;;21300:2;21304:5;21252:58;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;21252:58:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;21252:58:0;21225:19;:86::i;:::-;21142:177;;;:::o;2381:471::-;2439:7;2689:1;2684;:6;2680:47;;;2714:1;2707:8;;;;2680:47;2739:9;2755:1;2751;:5;2739:17;;2784:1;2779;2775;:5;;;;;;:10;2767:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2843:1;2836:8;;;2381:471;;;;;:::o;3328:132::-;3386:7;3413:39;3417:1;3420;3413:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3406:46;;3328:132;;;;:::o;1491:136::-;1549:7;1576:43;1580:1;1583;1576:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1569:50;;1491:136;;;;:::o;43349:1050::-;43581:4;43557:29;;:12;:29;;;;43549:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43659:29;43642:46;;;;;;;;:13;:46;;;;;;;;;43638:608;;;43705:9;:26;;;43740:4;43747:12;43761:8;43705:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43705:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43705:65:0;;;;43638:608;;;43811:25;43794:42;;;;;;;;:13;:42;;;;;;;;;43790:456;;;43853:9;:22;;;43902:4;43926:12;43957:8;43853:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43853:127:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43853:127:0;;;;43790:456;;;44021:21;44004:38;;;;;;;;:13;:38;;;;;;;;;44000:246;;;44059:9;:18;;;44096:12;44127:8;44059:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44059:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44059:91:0;;;;44000:246;;;44185:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44000:246;43790:456;43638:608;44311:12;44280:43;;:9;:17;;;44298:8;44280:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44280:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44280:27:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;44280:27:0;;;;;;;;;;;;;;;;:43;;;44258:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43349:1050;;;;:::o;23447:761::-;23871:23;23897:69;23925:4;23897:69;;;;;;;;;;;;;;;;;23905:5;23897:27;;;;:69;;;;;:::i;:::-;23871:95;;24001:1;23981:10;:17;:21;23977:224;;;24123:10;24112:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;24112:30:0;;;;;;;;;;;;;;;;24104:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23977:224;23447:761;;;:::o;3956:278::-;4042:7;4074:1;4070;:5;4077:12;4062:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4062:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4101:9;4117:1;4113;:5;;;;;;4101:17;;4225:1;4218:8;;;3956:278;;;;;:::o;1930:192::-;2016:7;2049:1;2044;:6;;2052:12;2036:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2036:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2076:9;2092:1;2088;:5;2076:17;;2113:1;2106:8;;;1930:192;;;;;:::o;18123:196::-;18226:12;18258:53;18281:6;18289:4;18295:1;18298:12;18258:22;:53::i;:::-;18251:60;;18123:196;;;;;:::o;19500:979::-;19630:12;19663:18;19674:6;19663:10;:18::i;:::-;19655:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19789:12;19803:23;19830:6;:11;;19850:8;19861:4;19830:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;19830:36:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;19788:78:0;;;;19881:7;19877:595;;;19912:10;19905:17;;;;;;19877:595;20046:1;20026:10;:17;:21;20022:439;;;20289:10;20283:17;20350:15;20337:10;20333:2;20329:19;20322:44;20237:148;20432:12;20425:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20425:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19500:979;;;;;;;:::o;15008:619::-;15068:4;15330:16;15357:19;15379:66;15357:88;;;;15548:7;15536:20;15524:32;;15588:11;15576:8;:23;;:42;;;;;15615:3;15603:15;;:8;:15;;15576:42;15568:51;;;;15008:619;;;:::o
Swarm Source
ipfs://8ef17bd5cc1425db1573db16cbd4e92ab5cce3af2f085131cd462335d80ab41a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.