More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0xcdb8747513d507085f3e85cca799f1016a3fe815fc165ec229b374bd279a3a91 | Claim On Chain | (pending) | 3 days ago | IN | 0 ETH | (Pending) | |||
Claim On Chain | 20000212 | 1 hr ago | IN | 0 ETH | 0.00103624 | ||||
Claim On Chain | 19984592 | 2 days ago | IN | 0 ETH | 0.00266092 | ||||
Claim On Chain | 19977120 | 3 days ago | IN | 0 ETH | 0.00224609 | ||||
Claim On Chain | 19972413 | 3 days ago | IN | 0 ETH | 0.0012903 | ||||
Claim On Chain | 19966781 | 4 days ago | IN | 0 ETH | 0.00325548 | ||||
Claim On Chain | 19965848 | 4 days ago | IN | 0 ETH | 0.00201851 | ||||
Claim On Chain | 19965127 | 4 days ago | IN | 0 ETH | 0.00218042 | ||||
Claim On Chain | 19965113 | 4 days ago | IN | 0 ETH | 0.00198582 | ||||
Claim On Chain | 19965105 | 4 days ago | IN | 0 ETH | 0.00190578 | ||||
Claim On Chain | 19959872 | 5 days ago | IN | 0 ETH | 0.00141894 | ||||
Claim On Chain | 19958605 | 5 days ago | IN | 0 ETH | 0.00101756 | ||||
Claim On Chain | 19958543 | 5 days ago | IN | 0 ETH | 0.00126323 | ||||
Claim On Chain | 19958478 | 5 days ago | IN | 0 ETH | 0.00104702 | ||||
Claim On Chain | 19958338 | 5 days ago | IN | 0 ETH | 0.00129499 | ||||
Claim On Chain | 19956997 | 6 days ago | IN | 0 ETH | 0.00075643 | ||||
Claim On Chain | 19950750 | 6 days ago | IN | 0 ETH | 0.00052306 | ||||
Claim On Chain | 19948214 | 7 days ago | IN | 0 ETH | 0.00108728 | ||||
Claim On Chain | 19945821 | 7 days ago | IN | 0 ETH | 0.00075952 | ||||
Claim On Chain | 19945813 | 7 days ago | IN | 0 ETH | 0.00075046 | ||||
Claim On Chain | 19945801 | 7 days ago | IN | 0 ETH | 0.00072913 | ||||
Claim On Chain | 19945789 | 7 days ago | IN | 0 ETH | 0.00068235 | ||||
Claim On Chain | 19945757 | 7 days ago | IN | 0 ETH | 0.00076898 | ||||
Claim On Chain | 19945729 | 7 days ago | IN | 0 ETH | 0.00077091 | ||||
Claim On Chain | 19945699 | 7 days ago | IN | 0 ETH | 0.00065958 |
Loading...
Loading
Contract Name:
VaultHandlerV7a
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 1 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/** *Submitted for verification at Etherscan.io on 2021-07-14 */ // ___________ ___. .__ // \_ _____/ _____\_ |__ | | ____ _____ // | __)_ / \| __ \| | _/ __ \ / \ // | \ Y Y \ \_\ \ |_\ ___/| Y Y \ // /_______ /__|_| /___ /____/\___ >__|_| / // \/ \/ \/ \/ \/ // ____ ____ .__ __ // \ \ / /____ __ __| |_/ |_ // \ Y /\__ \ | | \ |\ __\ // \ / / __ \| | / |_| | // \___/ (____ /____/|____/__| // \/ // ___ ___ .___.__ _________ a // / | \_____ ____ __| _/| | ___________ ___ __ | ____ / // / ~ \__ \ / \ / __ | | | _/ __ \_ __ \ \ \/ / / / // \ Y // __ \| | \/ /_/ | | |_\ ___/| | \/ \ / / / // \___|_ /(____ /___| /\____ | |____/\___ >__| \_/ /_/ // \/ \/ \/ \/ \/ // File: browser/ReentrancyGuard.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** * @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 () { _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: browser/IERC20Token.sol pragma solidity ^0.8.4; interface IERC20Token { function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } // File: browser/SafeMath.sol pragma solidity ^0.8.4; /** * @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: browser/VaultHandler_v4.sol pragma solidity ^0.8.4; interface IClaimed { function isClaimed(address nftAddress, uint tokenId, bytes32[] calldata proof) external returns(bool); function claim(address nftAddress, uint tokenId, address _claimedBy) external; } pragma experimental ABIEncoderV2; pragma solidity ^0.8.4; interface IERC721 { function burn(uint256 tokenId) external; function transferFrom(address from, address to, uint256 tokenId) external; function mint( address _to, uint256 _tokenId, string calldata _uri, string calldata _payload) external; function changeName(string calldata name, string calldata symbol) external; function updateTokenUri(uint256 _tokenId,string memory _uri) external; function tokenPayload(uint256 _tokenId) external view returns (string memory); function ownerOf(uint256 _tokenId) external returns (address _owner); function getApproved(uint256 _tokenId) external returns (address); function safeTransferFrom(address _from, address _to, uint256 _tokenId) external; } interface Ownable { function transferOwnership(address newOwner) external; } interface BasicERC20 { function burn(uint256 value) external; function mint(address account, uint256 amount) external; function decimals() external view returns (uint8); } contract Context { constructor() {} // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return payable(msg.sender); } } contract Bridged is Context { using SafeMath for uint256; using SafeMath for uint8; using SafeMath for uint; address public paymentAddress; mapping(uint => bool) public chainIds; mapping(uint => uint256) public chainBalances; constructor () { chainIds[1] = true; chainBalances[1] = 200000000000000000; chainIds[137] = true; chainBalances[137] = 200000000000000000; chainIds[80001] = true; chainBalances[80001] = 200000000000000000; chainIds[100] = true; chainBalances[100] = 200000000000000000; chainIds[56] = true; chainBalances[56] = 200000000000000000; chainIds[250] = true; chainBalances[250] = 200000000000000000; } function transferToChain(uint chainId, uint256 amount) public returns (bool) { require(chainIds[chainId], 'Invalid Chain ID'); IERC20Token paymentToken = IERC20Token(paymentAddress); require(paymentToken.allowance(_msgSender(), address(this)) >= amount, 'Handler unable to spend '); require(paymentToken.transferFrom(_msgSender(), address(this), amount), 'Transfer ERROR'); BasicERC20(paymentAddress).burn(amount); chainBalances[chainId] = chainBalances[chainId].add(amount); emit BridgeDeposit(_msgSender(), amount, chainId); return true; } function _transferFromChain(address _to, uint chainId, uint256 amount) internal returns (bool) { require(chainBalances[chainId] >= amount, 'Can not transfer more than deposited'); require(chainIds[chainId], 'Invalid Chain ID'); BasicERC20 paymentToken = BasicERC20(paymentAddress); paymentToken.mint(_to, amount); chainBalances[chainId] = chainBalances[chainId].sub(amount); emit BridgeWithdrawal(_msgSender(), amount, chainId); return true; } event BridgeDeposit(address indexed sender, uint256 indexed amount, uint chainId); event BridgeWithdrawal(address indexed sender, uint256 indexed amount, uint chainId); function _addChainId(uint chainId) internal returns (bool) { chainIds[chainId] = true; return true; } function _removeChainId(uint chainId) internal returns (bool) { chainIds[chainId] = false; return true; } } contract VaultHandlerV7a is ReentrancyGuard, Bridged { using SafeMath for uint256; using SafeMath for uint8; address payable private owner; string public metadataBaseUri; bool public initialized; address public nftAddress; address public recipientAddress; address public claimAddress; uint256 public price; bool public shouldBurn = false; uint internal blockWindow = 3; struct PreMint { string payload; bytes32 preImage; } struct PreTransfer { string payload; bytes32 preImage; address _from; } struct Offer { uint tokenId; address _from; } mapping(address => mapping(uint => PreMint)) preMints; mapping(address => mapping(uint => PreMint)) preMintsByIndex; mapping(address => uint) preMintCounts; mapping(uint => PreTransfer) preTransfers; mapping(uint => mapping(uint => PreTransfer)) preTransfersByIndex; mapping(uint => uint) preTransferCounts; mapping(uint => Offer[]) offers; mapping(uint => Offer[]) rejected; mapping(address => mapping(uint => Offer)) offered; mapping(address => bool) public blacklisted; mapping(address => bool) public witnesses; mapping(uint256 => bool) usedNonces; mapping(uint256 => bool) public usedTokenIds; // event for EVM logging event OwnerSet(address indexed oldOwner, address indexed newOwner); // modifier to check if caller is owner modifier isOwner() { // If the first argument of 'require' evaluates to 'false', execution terminates and all // changes to the state and to Ether balances are reverted. // This used to consume all gas in old EVM versions, but not anymore. // It is often a good idea to use 'require' to check if functions are called correctly. // As a second argument, you can also provide an explanation about what went wrong. require(msg.sender == owner, "Caller is not owner"); _; } // modifier to check if caller blacklisted modifier notBlacklisted() { require(!blacklisted[msg.sender], "Caller is blacklisted"); _; } /** * @dev Change owner * @param newOwner address of new owner */ function transferOwnership(address payable newOwner) public isOwner { emit OwnerSet(owner, newOwner); owner = newOwner; } /** * @dev Return owner address * @return address of owner */ function getOwner() external view returns (address) { return owner; } constructor(address _nftAddress, address _paymentAddress, address _recipientAddress, uint256 _price) { owner = _msgSender(); // 'msg.sender' is sender of current call, contract deployer for a constructor emit OwnerSet(address(0), owner); addWitness(owner); metadataBaseUri = "https://api.emblemvault.io/s:evmetadata/meta/"; nftAddress = _nftAddress; paymentAddress = _paymentAddress; recipientAddress = _recipientAddress; initialized = true; uint decimals = BasicERC20(paymentAddress).decimals(); price = _price * 10 ** decimals; } function claim(uint256 tokenId) public isOwner { bytes32[] memory proof; IClaimed claimer = IClaimed(claimAddress); require(!claimer.isClaimed(nftAddress, tokenId, proof), "Already Claimed"); IERC721 token = IERC721(nftAddress); token.burn(tokenId); } function claimOnChain(uint256 tokenId) public nonReentrant notBlacklisted { bytes32[] memory proof; IClaimed claimer = IClaimed(claimAddress); require(!claimer.isClaimed(nftAddress, tokenId, proof), "Already Claimed"); IERC721 token = IERC721(nftAddress); require(token.ownerOf(tokenId) == _msgSender(), "Not Token Owner"); token.burn(tokenId); claimer.claim(nftAddress, tokenId, _msgSender()); } function addClaimAddress(address _address) public isOwner { claimAddress = _address; } function toggleBlacklist(address _address) public isOwner { blacklisted[_address] = !blacklisted[_address]; } function adjustBlockWindow(uint size) public isOwner { blockWindow = size; } function buyWithSignature2(address _to, uint256 _tokenId, string calldata _payload, uint256 _nonce, uint signedBlock, bytes calldata _signature) public payable notBlacklisted { bytes32[] memory proof; require(signedBlock.add(blockWindow) > block.number, 'Signature expired'); require(!IClaimed(claimAddress).isClaimed(nftAddress, _tokenId, proof) && !usedTokenIds[_tokenId], "Already claimed"); IERC721 nftToken = IERC721(nftAddress); if (shouldBurn) { require(IERC20Token(paymentAddress).transferFrom(msg.sender, address(this), price), 'Transfer ERROR'); // Payment sent to recipient BasicERC20(paymentAddress).burn(price); } else { require(IERC20Token(paymentAddress).transferFrom(msg.sender, address(recipientAddress), price), 'Transfer ERROR'); // Payment sent to recipient } address signer = getAddressFromSignature(_tokenId, _nonce, _payload, signedBlock, _signature); require(witnesses[signer], 'Not Witnessed'); usedNonces[_nonce] = true; string memory _uri = concat(metadataBaseUri, uintToStr(_tokenId)); nftToken.mint(_to, _tokenId, _uri, _payload); usedTokenIds[_tokenId] = true; } function buyWithSignature(address _to, uint256 _tokenId, string calldata _payload, uint256 _nonce, bytes calldata _signature) public isOwner payable { IERC20Token paymentToken = IERC20Token(paymentAddress); IERC721 nftToken = IERC721(nftAddress); if (shouldBurn) { require(paymentToken.transferFrom(msg.sender, address(this), price), 'Transfer ERROR'); // Payment sent to recipient BasicERC20(paymentAddress).burn(price); } else { require(paymentToken.transferFrom(msg.sender, address(recipientAddress), price), 'Transfer ERROR'); // Payment sent to recipient } address signer = getAddressFromSignature(_tokenId, _nonce, _payload, _signature); require(witnesses[signer], 'Not Witnessed'); usedNonces[_nonce] = true; string memory _uri = concat(metadataBaseUri, uintToStr(_tokenId)); nftToken.mint(_to, _tokenId, _uri, _payload); } function addPreMint(address _for, string calldata _payload, uint256 _tokenId, bytes32 preImage) public isOwner { try IERC721(nftAddress).tokenPayload(_tokenId) returns (string memory) { revert('NFT Exists with this ID'); } catch { require(!_duplicatePremint(_for, _tokenId), 'Duplicate PreMint'); preMintCounts[_for] = preMintCounts[_for].add(1); preMints[_for][_tokenId] = PreMint(_payload, preImage); preMintsByIndex[_for][preMintCounts[_for]] = preMints[_for][_tokenId]; } } function _duplicatePremint(address _for, uint256 _tokenId) internal view returns (bool) { string memory data = preMints[_for][_tokenId].payload; bytes32 NULL = keccak256(bytes('')); return keccak256(bytes(data)) != NULL; } function deletePreMint(address _for, uint256 _tokenId) public isOwner { delete preMintsByIndex[_for][preMintCounts[_for]]; preMintCounts[_for] = preMintCounts[_for].sub(1); delete preMints[_for][_tokenId]; } function getPreMint(address _for, uint256 _tokenId) public view returns (PreMint memory) { return preMints[_for][_tokenId]; } function checkPreMintImage(string memory image, bytes32 preImage) public pure returns (bytes32, bytes32, bool) { bytes32 calculated = sha256(abi.encodePacked(image)); bytes32 preBytes = preImage; return (calculated, preBytes, calculated == preBytes); } function getPreMintCount(address _for) public view returns (uint length) { return preMintCounts[_for]; } function getPreMintByIndex(address _for, uint index) public view returns (PreMint memory) { return preMintsByIndex[_for][index]; } function toggleShouldBurn() public isOwner { shouldBurn = !shouldBurn; } /* Transfer with code */ function addWitness(address _witness) public isOwner { witnesses[_witness] = true; } function removeWitness(address _witness) public isOwner { witnesses[_witness] = false; } function getAddressFromSignature(uint256 _tokenId, uint256 _nonce, bytes memory signature) public view returns (address) { require(!usedNonces[_nonce]); bytes32 hash = keccak256(abi.encodePacked(concat(uintToStr(_tokenId), uintToStr(_nonce)))); address addressFromSig = recoverSigner(hash, signature); return addressFromSig; } function getAddressFromSignature(uint256 _tokenId, uint256 _nonce, string calldata payload, bytes memory signature) public view returns (address) { require(!usedNonces[_nonce]); string memory combined = concat(uintToStr(_tokenId), payload); bytes32 hash = keccak256(abi.encodePacked(concat(combined, uintToStr(_nonce)))); address addressFromSig = recoverSigner(hash, signature); return addressFromSig; } function getAddressFromSignature(uint256 _tokenId, uint256 _nonce, string calldata payload, uint blockNumber, bytes memory signature) public view returns (address) { require(!usedNonces[_nonce]); string memory combined = concat(concat(uintToStr(_tokenId), payload), uintToStr(blockNumber)); bytes32 hash = keccak256(abi.encodePacked(concat(combined, uintToStr(_nonce)))); address addressFromSig = recoverSigner(hash, signature); return addressFromSig; } function getAddressFromSignature(bytes32 _hash, bytes calldata signature) public pure returns (address) { address addressFromSig = recoverSigner(_hash, signature); return addressFromSig; } function getHash(string calldata _payload) public pure returns (bytes32) { bytes32 hash = keccak256(abi.encodePacked(_payload)); return hash; } function transferWithCode(uint256 _tokenId, string calldata code, address _to, uint256 _nonce, bytes memory signature) public payable notBlacklisted { require(witnesses[getAddressFromSignature(_tokenId, _nonce, signature)], 'Not Witnessed'); IERC721 nftToken = IERC721(nftAddress); PreTransfer memory preTransfer = preTransfers[_tokenId]; require(preTransfer.preImage == sha256(abi.encodePacked(code)), 'Code does not match'); // Payload should match nftToken.transferFrom(preTransfer._from, _to, _tokenId); delete preTransfers[_tokenId]; delete preTransfersByIndex[_tokenId][preTransferCounts[_tokenId]]; preTransferCounts[_tokenId] = preTransferCounts[_tokenId].sub(1); usedNonces[_nonce] = true; } function addPreTransfer(uint256 _tokenId, bytes32 preImage) public { require(!_duplicatePretransfer(_tokenId), 'Duplicate PreTransfer'); preTransferCounts[_tokenId] = preTransferCounts[_tokenId].add(1); preTransfers[_tokenId] = PreTransfer("payload", preImage, msg.sender); preTransfersByIndex[_tokenId][preTransferCounts[_tokenId]] = preTransfers[_tokenId]; } function _duplicatePretransfer(uint256 _tokenId) internal view returns (bool) { string memory data = preTransfers[_tokenId].payload; bytes32 NULL = keccak256(bytes('')); return keccak256(bytes(data)) != NULL; } function deletePreTransfer(uint256 _tokenId) public { require(preTransfers[_tokenId]._from == msg.sender, 'PreTransfer does not belong to sender'); delete preTransfersByIndex[_tokenId][preTransferCounts[_tokenId]]; preTransferCounts[_tokenId] = preTransferCounts[_tokenId].sub(1); delete preTransfers[_tokenId]; } function getPreTransfer(uint256 _tokenId) public view returns (PreTransfer memory) { return preTransfers[_tokenId]; } function checkPreTransferImage(string memory image, bytes32 preImage) public pure returns (bytes32, bytes32, bool) { bytes32 calculated = sha256(abi.encodePacked(image)); bytes32 preBytes = preImage; return (calculated, preBytes, calculated == preBytes); } function getPreTransferCount(uint256 _tokenId) public view returns (uint length) { return preTransferCounts[_tokenId]; } function getPreTransferByIndex(uint256 _tokenId, uint index) public view returns (PreTransfer memory) { return preTransfersByIndex[_tokenId][index]; } function changeMetadataBaseUri(string calldata _uri) public isOwner { metadataBaseUri = _uri; } function transferPaymentOwnership(address newOwner) external isOwner { Ownable paymentToken = Ownable(paymentAddress); paymentToken.transferOwnership(newOwner); } function transferNftOwnership(address newOwner) external isOwner { Ownable nftToken = Ownable(nftAddress); nftToken.transferOwnership(newOwner); } function mint( address _to, uint256 _tokenId, string calldata _uri, string calldata _payload) external isOwner { IERC721 nftToken = IERC721(nftAddress); nftToken.mint(_to, _tokenId, _uri, _payload); } function changeName(string calldata name, string calldata symbol) external isOwner { IERC721 nftToken = IERC721(nftAddress); nftToken.changeName(name, symbol); } function updateTokenUri(uint256 _tokenId,string memory _uri) external isOwner { IERC721 nftToken = IERC721(nftAddress); nftToken.updateTokenUri(_tokenId, _uri); } function getPaymentDecimals() public view returns (uint8){ BasicERC20 token = BasicERC20(paymentAddress); return token.decimals(); } function changePayment(address payment) public isOwner { paymentAddress = payment; } // function changeCoupon(address coupon) public isOwner { // couponAddress = coupon; // } function changeRecipient(address _recipient) public isOwner { recipientAddress = _recipient; } function changeNft(address token) public isOwner { nftAddress = token; } function changePrice(uint256 _price) public isOwner { uint decimals = BasicERC20(paymentAddress).decimals(); price = _price * 10 ** decimals; } // function changeOfferPrice(uint256 _price) public isOwner { // uint decimals = BasicERC20(couponAddress).decimals(); // offerPrice = _price * 10 ** decimals; // } function addChainId(uint chainId) public isOwner returns (bool) { return (_addChainId(chainId)); } function removeChainId(uint chainId) public isOwner returns (bool) { return (_removeChainId(chainId)); } function transferFromChain(address _to, uint chainId, uint256 amount) public isOwner returns (bool) { return _transferFromChain(_to, chainId, amount); } function concat(string memory a, string memory b) internal pure returns (string memory) { return string(abi.encodePacked(a, b)); } /** * @dev Recover signer address from a message by using their signature * @param hash bytes32 message, the hash is the signed message. What is recovered is the signer address. * @param sig bytes signature, the signature is generated using web3.eth.sign(). Inclusive "0x..." */ function recoverSigner(bytes32 hash, bytes memory sig) internal pure returns (address) { require(sig.length == 65, "Require correct length"); bytes32 r; bytes32 s; uint8 v; // Divide the signature in r, s and v variables assembly { r := mload(add(sig, 32)) s := mload(add(sig, 64)) v := byte(0, mload(add(sig, 96))) } // Version of signature should be 27 or 28, but 0 and 1 are also possible versions if (v < 27) { v += 27; } require(v == 27 || v == 28, "Signature version not match"); return recoverSigner2(hash, v, r, s); } function recoverSigner2(bytes32 h, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { bytes memory prefix = "\x19Ethereum Signed Message:\n32"; bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, h)); address addr = ecrecover(prefixedHash, v, r, s); return addr; } function uintToStr(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } function stringToBytes32(string memory source) internal pure returns (bytes32 result) { bytes memory tempEmptyStringTest = bytes(source); if (tempEmptyStringTest.length == 0) { return 0x0; } assembly { result := mload(add(source, 32)) } } function bytes32ToStr(bytes32 _bytes32) internal pure returns (string memory) { // string memory str = string(_bytes32); // TypeError: Explicit type conversion not allowed from "bytes32" to "string storage pointer" // thus we should fist convert bytes32 to bytes (to dynamically-sized byte array) bytes memory bytesArray = new bytes(32); for (uint256 i; i < 32; i++) { bytesArray[i] = _bytes32[i]; } return string(bytesArray); } function asciiToInteger(bytes32 x) public pure returns (uint256) { uint256 y; for (uint256 i = 0; i < 32; i++) { uint256 c = (uint256(x) >> (i * 8)) & 0xff; if (48 <= c && c <= 57) y += (c - 48) * 10 ** i; else break; } return y; } function toString(address account) public pure returns(string memory) { return toString(abi.encodePacked(account)); } function toString(uint256 value) public pure returns(string memory) { return toString(abi.encodePacked(value)); } function toString(bytes32 value) public pure returns(string memory) { return toString(abi.encodePacked(value)); } function toString(bytes memory data) public pure returns(string memory) { bytes memory alphabet = "0123456789abcdef"; bytes memory str = new bytes(2 + data.length * 2); str[0] = "0"; str[1] = "x"; for (uint i = 0; i < data.length; i++) { str[2+i*2] = alphabet[uint(uint8(data[i] >> 4))]; str[3+i*2] = alphabet[uint(uint8(data[i] & 0x0f))]; } return string(str); } }
{ "optimizer": { "enabled": true, "runs": 1 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"},{"internalType":"address","name":"_paymentAddress","type":"address"},{"internalType":"address","name":"_recipientAddress","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"BridgeDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"BridgeWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerSet","type":"event"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"addChainId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addClaimAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"string","name":"_payload","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes32","name":"preImage","type":"bytes32"}],"name":"addPreMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes32","name":"preImage","type":"bytes32"}],"name":"addPreTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_witness","type":"address"}],"name":"addWitness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"size","type":"uint256"}],"name":"adjustBlockWindow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"x","type":"bytes32"}],"name":"asciiToInteger","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_payload","type":"string"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"buyWithSignature","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_payload","type":"string"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint256","name":"signedBlock","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"buyWithSignature2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"chainBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"chainIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"changeMetadataBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"changeNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"payment","type":"address"}],"name":"changePayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"changeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"image","type":"string"},{"internalType":"bytes32","name":"preImage","type":"bytes32"}],"name":"checkPreMintImage","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"image","type":"string"},{"internalType":"bytes32","name":"preImage","type":"bytes32"}],"name":"checkPreTransferImage","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimOnChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"deletePreMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"deletePreTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"string","name":"payload","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"getAddressFromSignature","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"string","name":"payload","type":"string"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"getAddressFromSignature","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"getAddressFromSignature","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"getAddressFromSignature","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_payload","type":"string"}],"name":"getHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPaymentDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getPreMint","outputs":[{"components":[{"internalType":"string","name":"payload","type":"string"},{"internalType":"bytes32","name":"preImage","type":"bytes32"}],"internalType":"struct VaultHandlerV7a.PreMint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPreMintByIndex","outputs":[{"components":[{"internalType":"string","name":"payload","type":"string"},{"internalType":"bytes32","name":"preImage","type":"bytes32"}],"internalType":"struct VaultHandlerV7a.PreMint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"}],"name":"getPreMintCount","outputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getPreTransfer","outputs":[{"components":[{"internalType":"string","name":"payload","type":"string"},{"internalType":"bytes32","name":"preImage","type":"bytes32"},{"internalType":"address","name":"_from","type":"address"}],"internalType":"struct VaultHandlerV7a.PreTransfer","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPreTransferByIndex","outputs":[{"components":[{"internalType":"string","name":"payload","type":"string"},{"internalType":"bytes32","name":"preImage","type":"bytes32"},{"internalType":"address","name":"_from","type":"address"}],"internalType":"struct VaultHandlerV7a.PreTransfer","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getPreTransferCount","outputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataBaseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"string","name":"_payload","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nftAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recipientAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"removeChainId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_witness","type":"address"}],"name":"removeWitness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shouldBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"toString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"toString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"toString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"toString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"toggleBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleShouldBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFromChain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferNftOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferPaymentOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferToChain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"code","type":"string"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"transferWithCode","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"updateTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedTokenIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"witnesses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600a805460ff191690556003600b553480156200002057600080fd5b50604051620053ff380380620053ff8339810160408190526200004391620004f3565b600160008181557fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0805460ff1990811684179091556702c68af0bb1400007fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c8190557f0cb0be258cd4e0f89ef5514ec447dd8846b0cf865c7d0d8ea82ff58a1eae81a180548316851790557f0f7c2a22036bfa20acc9ee73aa9ab92bebf1413ecc0991a7c2b4d6178e9838ed8190557f2af04f721798314fc694a46b3db9f8005ee5d928ceb0c93e438e01e3ac240ed480548316851790557fdcb06883458ea50914626defda05e41b08347a7ab71dc9fa1dc89dada3554b9c8190557f7673bcbb3401a7cbae68f81d40eea2cf35afdaf7ecd016ebf3f02857fcc1260a80548316851790557f6b16ef514f22b74729cbea5cc7babfecbdc2309e530ca716643d11fe929eed2e8190557f7235287a5cb1908d23369905908658187d8d258d18d7ad15bcb288795998bcba80548316851790557f22848320af6c4894685e387cf97d56ba798f5dabcd8f3a2db70374776f0f2f9381905560fa83527f2246e3a745c1df3cc2a1c7eecb7d02c255de440492ab220c839a47c0ff0ff61f8054909216909317905560036020527fd1a8b09c64a23b2afda8cd351fe2756c44d7cad4fe3cb981d9b54c00cc07ebbc91909155600480546001600160a01b031916339081179091556040519091907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735908290a360045462000289906001600160a01b0316620003ad565b6040518060600160405280602d8152602001620053d2602d91398051620002b99160059160209091019062000430565b5060068054600180546001600160a01b03199081166001600160a01b03888116918217845560078054909316888216179092556001600160a81b03199093166101009189169190910260ff191617179091556040805163313ce56760e01b815290516000929163313ce567916004808301926020929190829003018186803b1580156200034557600080fd5b505afa1580156200035a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000380919062000544565b60ff1690506200039281600a620005b7565b6200039e908362000675565b60095550620006ea9350505050565b6004546001600160a01b031633146200040c5760405162461bcd60e51b815260206004820152601360248201527f43616c6c6572206973206e6f74206f776e657200000000000000000000000000604482015260640160405180910390fd5b6001600160a01b03166000908152601660205260409020805460ff19166001179055565b8280546200043e9062000697565b90600052602060002090601f016020900481019282620004625760008555620004ad565b82601f106200047d57805160ff1916838001178555620004ad565b82800160010185558215620004ad579182015b82811115620004ad57825182559160200191906001019062000490565b50620004bb929150620004bf565b5090565b5b80821115620004bb5760008155600101620004c0565b80516001600160a01b0381168114620004ee57600080fd5b919050565b6000806000806080858703121562000509578384fd5b6200051485620004d6565b93506200052460208601620004d6565b92506200053460408601620004d6565b6060959095015193969295505050565b60006020828403121562000556578081fd5b815160ff8116811462000567578182fd5b9392505050565b600181815b80851115620005af578160001904821115620005935762000593620006d4565b80851615620005a157918102915b93841c939080029062000573565b509250929050565b6000620005678383600082620005d0575060016200066f565b81620005df575060006200066f565b8160018114620005f85760028114620006035762000623565b60019150506200066f565b60ff841115620006175762000617620006d4565b50506001821b6200066f565b5060208310610133831016604e8410600b841016171562000648575081810a6200066f565b6200065483836200056e565b80600019048211156200066b576200066b620006d4565b0290505b92915050565b6000816000190483118215151615620006925762000692620006d4565b500290565b600181811c90821680620006ac57607f821691505b60208210811415620006ce57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b614cd880620006fa6000396000f3fe6080604052600436106102c85760003560e01c806305691ec8146102cd5780630d7def9514610303578063158ef93e1461031a57806321d93090146103445780632754902f146103745780632e16a69e146103875780632fb102cf146103a757806330e6822c146103c757806331726da1146103e757806331b4805514610407578063321c3cf61461042157806332ca2c001461045157806336864adb1461047e578063379607f5146104a057806339f6c85e146104c05780633b442cdb146104fd5780633debbbc01461051d578063528204d01461053d5780635622bf121461055d57806356ca623e1461057d57806357cb93d91461059d578063582f1da2146105cd57806359e26be1146105ed5780635aaf27b71461060d5780635aff59991461062d5780635b6beeb91461064d5780635bf8633a1461067b5780635e1bd52a146106a0578063633423be146106c05780636900a3ae146106e057806371aad10d146107005780637224bb921461072057806373d0ffe01461074d57806379d336061461076d57806386575e401461078d578063893d20e8146107ad5780638ddc2020146107cb57806392c2bcb4146107eb578063945cfe1f1461080b57806399b2c1c71461082b5780639d75afc71461084b5780639d98eda91461086b5780639eaa56261461087e578063a035b1fe1461089e578063a111fbae146108b4578063a2b40d19146108e1578063ae2a489f14610901578063af62050014610921578063b11a19e8146106e0578063bc2bf73e14610941578063bd54c89c1461096e578063c5eeb8af1461098e578063d02b1153146109ae578063d0569c22146109ce578063d2b6447214610a04578063d31af48414610a2b578063d81fba16146104c0578063dbac26e914610a4b578063df4a529d14610a7b578063e94b770614610a9b578063ee2f13cd14610aae578063f2fde38b14610ace578063fc9a85b114610aee575b600080fd5b3480156102d957600080fd5b506008546102ed906001600160a01b031681565b6040516102fa91906146dd565b60405180910390f35b34801561030f57600080fd5b50610318610b0e565b005b34801561032657600080fd5b506006546103349060ff1681565b60405190151581526020016102fa565b34801561035057600080fd5b5061033461035f3660046141cf565b60026020526000908152604090205460ff1681565b6103186103823660046143ed565b610b55565b34801561039357600080fd5b506103186103a2366004613eff565b610e8e565b3480156103b357600080fd5b506103186103c2366004613fc6565b610ee1565b3480156103d357600080fd5b506103346103e236600461417b565b610f86565b3480156103f357600080fd5b50610318610402366004613eff565b610fc6565b34801561041357600080fd5b50600a546103349060ff1681565b34801561042d57600080fd5b5061033461043c366004613eff565b60166020526000908152604090205460ff1681565b34801561045d57600080fd5b5061047161046c3660046141cf565b611058565b6040516102fa9190614968565b34801561048a57600080fd5b5061049361112e565b6040516102fa9190614825565b3480156104ac57600080fd5b506103186104bb3660046141cf565b6111bc565b3480156104cc57600080fd5b506104e06104db36600461438a565b611300565b6040805193845260208401929092521515908201526060016102fa565b34801561050957600080fd5b506102ed61051836600461450a565b611382565b34801561052957600080fd5b50610318610538366004613eff565b61143f565b34801561054957600080fd5b506103186105583660046143cc565b61149f565b34801561056957600080fd5b506102ed610578366004614583565b611611565b34801561058957600080fd5b50610493610598366004613eff565b6116d6565b3480156105a957600080fd5b506103346105b83660046141cf565b60186020526000908152604090205460ff1681565b3480156105d957600080fd5b506103346105e83660046141cf565b611710565b3480156105f957600080fd5b50610318610608366004613eff565b61175e565b34801561061957600080fd5b50610318610628366004613eff565b6117ac565b34801561063957600080fd5b506007546102ed906001600160a01b031681565b34801561065957600080fd5b5061066d61066836600461427a565b6117f8565b6040519081526020016102fa565b34801561068757600080fd5b506006546102ed9061010090046001600160a01b031681565b3480156106ac57600080fd5b506103346106bb3660046143cc565b61182e565b3480156106cc57600080fd5b506001546102ed906001600160a01b031681565b3480156106ec57600080fd5b506104936106fb3660046141cf565b611aa8565b34801561070c57600080fd5b5061049361071b366004614248565b611ac0565b34801561072c57600080fd5b5061066d61073b3660046141cf565b60036020526000908152604090205481565b34801561075957600080fd5b50610318610768366004613eff565b611d56565b34801561077957600080fd5b506102ed6107883660046141ff565b611da2565b34801561079957600080fd5b506103186107a83660046142b9565b611dee565b3480156107b957600080fd5b506004546001600160a01b03166102ed565b3480156107d757600080fd5b506103186107e6366004613eff565b611e8d565b3480156107f757600080fd5b50610318610806366004613eff565b611edf565b34801561081757600080fd5b506104716108263660046143cc565b611f2b565b34801561083757600080fd5b5061066d6108463660046141cf565b61200d565b34801561085757600080fd5b50610318610866366004613f9b565b61209c565b6103186108793660046140e0565b61216c565b34801561088a57600080fd5b506102ed6108993660046144bd565b612678565b3480156108aa57600080fd5b5061066d60095481565b3480156108c057600080fd5b5061066d6108cf3660046141cf565b60009081526011602052604090205490565b3480156108ed57600080fd5b506103186108fc3660046141cf565b6126e0565b34801561090d57600080fd5b5061031861091c3660046141cf565b6127a8565b34801561092d57600080fd5b5061031861093c3660046141cf565b612a94565b34801561094d57600080fd5b5061096161095c366004613f9b565b612ac3565b6040516102fa9190614936565b34801561097a57600080fd5b5061031861098936600461427a565b612b9b565b34801561099a57600080fd5b506103346109a93660046141cf565b612bd6565b3480156109ba57600080fd5b506103186109c9366004613f37565b612c20565b3480156109da57600080fd5b5061066d6109e9366004613eff565b6001600160a01b03166000908152600e602052604090205490565b348015610a1057600080fd5b50610a19612e86565b60405160ff90911681526020016102fa565b348015610a3757600080fd5b50610318610a46366004614479565b612f0c565b348015610a5757600080fd5b50610334610a66366004613eff565b60156020526000908152604090205460ff1681565b348015610a8757600080fd5b50610318610a963660046141cf565b612fa5565b610318610aa936600461404e565b6130be565b348015610aba57600080fd5b50610318610ac9366004613eff565b613468565b348015610ada57600080fd5b50610318610ae9366004613eff565b6134b3565b348015610afa57600080fd5b50610961610b09366004613f9b565b613539565b6004546001600160a01b03163314610b415760405162461bcd60e51b8152600401610b3890614862565b60405180910390fd5b600a805460ff19811660ff90911615179055565b3360009081526015602052604090205460ff1615610b855760405162461bcd60e51b8152600401610b3890614907565b60166000610b94888585612678565b6001600160a01b0316815260208101919091526040016000205460ff16610bcd5760405162461bcd60e51b8152600401610b389061488f565b6006546000878152600f602052604080822081516060810190925280546101009094046001600160a01b03169382908290610c0790614bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3390614bc1565b8015610c805780601f10610c5557610100808354040283529160200191610c80565b820191906000526020600020905b815481529060010190602001808311610c6357829003601f168201915b505050918352505060018201546020808301919091526002928301546001600160a01b031660409283015290519293509091610cc0918a918a910161469e565b60408051601f1981840301815290829052610cda91614660565b602060405180830381855afa158015610cf7573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610d1a91906141e7565b816020015114610d625760405162461bcd60e51b8152602060048201526013602482015272086dec8ca40c8decae640dcdee840dac2e8c6d606b1b6044820152606401610b38565b60408082015190516323b872dd60e01b81526001600160a01b038416916323b872dd91610d96919089908d906004016146f1565b600060405180830381600087803b158015610db057600080fd5b505af1158015610dc4573d6000803e3d6000fd5b5050506000898152600f602052604081209150610de18282613c6b565b50600060018201819055600290910180546001600160a01b031916905588815260106020908152604080832060118352818420548452909152812090610e278282613c6b565b5060006001828101829055600290920180546001600160a01b031916905589815260116020526040902054610e5b9161357d565b6000988952601160209081526040808b20929092559489526017909452505050909320805460ff19166001179055505050565b6004546001600160a01b03163314610eb85760405162461bcd60e51b8152600401610b3890614862565b6001600160a01b03166000908152601560205260409020805460ff19811660ff90911615179055565b6004546001600160a01b03163314610f0b5760405162461bcd60e51b8152600401610b3890614862565b600654604051632fb102cf60e01b81526101009091046001600160a01b0316908190632fb102cf90610f4b908a908a908a908a908a908a90600401614772565b600060405180830381600087803b158015610f6557600080fd5b505af1158015610f79573d6000803e3d6000fd5b5050505050505050505050565b6004546000906001600160a01b03163314610fb35760405162461bcd60e51b8152600401610b3890614862565b610fbe8484846135c6565b949350505050565b6004546001600160a01b03163314610ff05760405162461bcd60e51b8152600401610b3890614862565b60015460405163f2fde38b60e01b81526001600160a01b0390911690819063f2fde38b906110229085906004016146dd565b600060405180830381600087803b15801561103c57600080fd5b505af1158015611050573d6000803e3d6000fd5b505050505050565b611060613ca8565b6000828152600f60205260409081902081516060810190925280548290829061108890614bc1565b80601f01602080910402602001604051908101604052809291908181526020018280546110b490614bc1565b80156111015780601f106110d657610100808354040283529160200191611101565b820191906000526020600020905b8154815290600101906020018083116110e457829003601f168201915b5050509183525050600182015460208201526002909101546001600160a01b031660409091015292915050565b6005805461113b90614bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461116790614bc1565b80156111b45780601f10611189576101008083540402835291602001916111b4565b820191906000526020600020905b81548152906001019060200180831161119757829003601f168201915b505050505081565b6004546001600160a01b031633146111e65760405162461bcd60e51b8152600401610b3890614862565b6008546006546040516305fbdf1560e21b81526060926001600160a01b039081169283926317ef7c5492611227926101009004169087908790600401614715565b602060405180830381600087803b15801561124157600080fd5b505af1158015611255573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127991906141af565b156112965760405162461bcd60e51b8152600401610b38906148de565b600654604051630852cd8d60e31b8152600481018590526101009091046001600160a01b03169081906342966c6890602401600060405180830381600087803b1580156112e257600080fd5b505af11580156112f6573d6000803e3d6000fd5b5050505050505050565b6000806000806002866040516020016113199190614660565b60408051601f198184030181529082905261133391614660565b602060405180830381855afa158015611350573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061137391906141e7565b96949550505083851492915050565b60008481526017602052604081205460ff161561139e57600080fd5b60006113e86113ac8861373d565b86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061385692505050565b905060006113fe826113f98961373d565b613856565b60405160200161140e9190614660565b60405160208183030381529060405280519060200120905060006114328286613882565b9998505050505050505050565b6004546001600160a01b031633146114695760405162461bcd60e51b8152600401610b3890614862565b60065460405163f2fde38b60e01b81526101009091046001600160a01b031690819063f2fde38b906110229085906004016146dd565b6114a882613962565b156114ed5760405162461bcd60e51b8152602060048201526015602482015274223ab83634b1b0ba3290283932aa3930b739b332b960591b6044820152606401610b38565b600082815260116020526040902054611507906001613a2c565b600083815260116020908152604080832093909355825160a081018452600760608201908152661c185e5b1bd85960ca1b608083015281528082018590523381850152858352600f82529290912082518051919261156a92849290910190613cc8565b506020828101516001830155604092830151600290920180546001600160a01b0319166001600160a01b03909316929092179091556000848152600f82528281206010835283822060118452848320548352909252919091208154819083906115d290614bc1565b6115dd929190613d4c565b5060018281015490820155600291820154910180546001600160a01b0319166001600160a01b039092169190911790555050565b60008581526017602052604081205460ff161561162d57600080fd5b600061168361167a61163e8a61373d565b88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061385692505050565b6113f98661373d565b90506000611694826113f98a61373d565b6040516020016116a49190614660565b60405160208183030381529060405280519060200120905060006116c88286613882565b9a9950505050505050505050565b604051606082811b6001600160601b03191660208301529061170a906034015b604051602081830303815290604052611ac0565b92915050565b6004546000906001600160a01b0316331461173d5760405162461bcd60e51b8152600401610b3890614862565b6000828152600260205260409020805460ff1916600190811790915561170a565b6004546001600160a01b031633146117885760405162461bcd60e51b8152600401610b3890614862565b6001600160a01b03166000908152601660205260409020805460ff19166001179055565b6004546001600160a01b031633146117d65760405162461bcd60e51b8152600401610b3890614862565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080838360405160200161180e92919061469e565b60408051808303601f190181529190528051602090910120949350505050565b60008281526002602052604081205460ff1661185c5760405162461bcd60e51b8152600401610b3890614838565b6001546001600160a01b0316828163dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260440160206040518083038186803b1580156118b557600080fd5b505afa1580156118c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ed91906141e7565b10156119365760405162461bcd60e51b815260206004820152601860248201527702430b7323632b9103ab730b13632903a379039b832b732160451b6044820152606401610b38565b6040516323b872dd60e01b81526001600160a01b038216906323b872dd90611966903390309088906004016146f1565b602060405180830381600087803b15801561198057600080fd5b505af1158015611994573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b891906141af565b6119d45760405162461bcd60e51b8152600401610b38906148b6565b600154604051630852cd8d60e31b8152600481018590526001600160a01b03909116906342966c6890602401600060405180830381600087803b158015611a1a57600080fd5b505af1158015611a2e573d6000803e3d6000fd5b505050600085815260036020526040902054611a4b915084613a2c565b60008581526003602052604090205582336001600160a01b03167fed2432d91de9329ae454049df81fd5d6b856c4470096ca37a29c1fe111f57f0c86604051611a9691815260200190565b60405180910390a35060019392505050565b606061170a826040516020016116f691815260200190565b60408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b6020820152815160609190600090611afb906002614b5b565b611b06906002614a1f565b6001600160401b03811115611b2b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b55576020820181803683370190505b509050600360fc1b81600081518110611b7e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611bbb57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060005b8451811015611d4e57826004868381518110611c0157634e487b7160e01b600052603260045260246000fd5b016020015182516001600160f81b031990911690911c60f81c908110611c3757634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191682611c52836002614b5b565b611c5d906002614a1f565b81518110611c7b57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535082858281518110611cb357634e487b7160e01b600052603260045260246000fd5b602091010151815160f89190911c600f16908110611ce157634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191682611cfc836002614b5b565b611d07906003614a1f565b81518110611d2557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535080611d4681614bfc565b915050611bd5565b509392505050565b6004546001600160a01b03163314611d805760405162461bcd60e51b8152600401610b3890614862565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600080611de58585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061388292505050565b95945050505050565b6004546001600160a01b03163314611e185760405162461bcd60e51b8152600401610b3890614862565b6006546040516302195d7960e61b81526101009091046001600160a01b03169081906386575e4090611e549088908890889088906004016147f3565b600060405180830381600087803b158015611e6e57600080fd5b505af1158015611e82573d6000803e3d6000fd5b505050505050505050565b6004546001600160a01b03163314611eb75760405162461bcd60e51b8152600401610b3890614862565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6004546001600160a01b03163314611f095760405162461bcd60e51b8152600401610b3890614862565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611f33613ca8565b600083815260106020908152604080832085845290915290819020815160608101909252805482908290611f6690614bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9290614bc1565b8015611fdf5780601f10611fb457610100808354040283529160200191611fdf565b820191906000526020600020905b815481529060010190602001808311611fc257829003601f168201915b5050509183525050600182015460208201526002909101546001600160a01b03166040909101529392505050565b60008060005b6020811015612095576000612029826008614b5b565b8560001c901c60ff16905080603011158015612046575060398111155b1561207c5761205682600a614ab3565b612061603083614b7a565b61206b9190614b5b565b6120759084614a1f565b9250612082565b50612095565b508061208d81614bfc565b915050612013565b5092915050565b6004546001600160a01b031633146120c65760405162461bcd60e51b8152600401610b3890614862565b6001600160a01b0382166000908152600d60209081526040808320600e83528184205484529091528120906120fb8282613c6b565b50600060019182018190556001600160a01b0384168152600e60205260409020546121259161357d565b6001600160a01b0383166000908152600e6020908152604080832093909355600c815282822084835290529081209061215e8282613c6b565b600182016000905550505050565b3360009081526015602052604090205460ff161561219c5760405162461bcd60e51b8152600401610b3890614907565b6060436121b4600b5486613a2c90919063ffffffff16565b116121f55760405162461bcd60e51b815260206004820152601160248201527014da59db985d1d5c9948195e1c1a5c9959607a1b6044820152606401610b38565b6008546006546040516305fbdf1560e21b81526001600160a01b03928316926317ef7c549261223492610100909104909116908c908690600401614715565b602060405180830381600087803b15801561224e57600080fd5b505af1158015612262573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228691906141af565b1580156122a2575060008881526018602052604090205460ff16155b6122e05760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b6044820152606401610b38565b600654600a546101009091046001600160a01b03169060ff161561240d576001546009546040516323b872dd60e01b81526001600160a01b03909216916323b872dd9161233391339130916004016146f1565b602060405180830381600087803b15801561234d57600080fd5b505af1158015612361573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238591906141af565b6123a15760405162461bcd60e51b8152600401610b38906148b6565b600154600954604051630852cd8d60e31b81526001600160a01b03909216916342966c68916123d69160040190815260200190565b600060405180830381600087803b1580156123f057600080fd5b505af1158015612404573d6000803e3d6000fd5b505050506124b6565b6001546007546009546040516323b872dd60e01b81526001600160a01b03938416936323b872dd9361244893339392909116916004016146f1565b602060405180830381600087803b15801561246257600080fd5b505af1158015612476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249a91906141af565b6124b65760405162461bcd60e51b8152600401610b38906148b6565b60006124fc8a888b8b8a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061161192505050565b6001600160a01b03811660009081526016602052604090205490915060ff166125375760405162461bcd60e51b8152600401610b389061488f565b6000878152601760205260408120805460ff19166001179055600580546125e9919061256290614bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461258e90614bc1565b80156125db5780601f106125b0576101008083540402835291602001916125db565b820191906000526020600020905b8154815290600101906020018083116125be57829003601f168201915b50505050506113f98d61373d565b9050826001600160a01b0316632fb102cf8d8d848e8e6040518663ffffffff1660e01b815260040161261f9594939291906147ad565b600060405180830381600087803b15801561263957600080fd5b505af115801561264d573d6000803e3d6000fd5b50505060009b8c525050601860205250506040909720805460ff191660011790555050505050505050565b60008281526017602052604081205460ff161561269457600080fd5b60006126a261167a8661373d565b6040516020016126b29190614660565b60405160208183030381529060405280519060200120905060006126d68285613882565b9695505050505050565b6004546001600160a01b0316331461270a5760405162461bcd60e51b8152600401610b3890614862565b6001546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b15801561274f57600080fd5b505afa158015612763573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278791906145ea565b60ff16905061279781600a614ab3565b6127a19083614b5b565b6009555050565b600260005414156127fb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b38565b600260009081553381526015602052604090205460ff161561282f5760405162461bcd60e51b8152600401610b3890614907565b6008546006546040516305fbdf1560e21b81526060926001600160a01b039081169283926317ef7c5492612870926101009004169087908790600401614715565b602060405180830381600087803b15801561288a57600080fd5b505af115801561289e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c291906141af565b156128df5760405162461bcd60e51b8152600401610b38906148de565b60065461010090046001600160a01b0316336040516331a9108f60e11b8152600481018690526001600160a01b0391821691831690636352211e90602401602060405180830381600087803b15801561293757600080fd5b505af115801561294b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296f9190613f1b565b6001600160a01b0316146129b75760405162461bcd60e51b815260206004820152600f60248201526e2737ba102a37b5b2b71027bbb732b960891b6044820152606401610b38565b604051630852cd8d60e31b8152600481018590526001600160a01b038216906342966c6890602401600060405180830381600087803b1580156129f957600080fd5b505af1158015612a0d573d6000803e3d6000fd5b5050600654604080516304f4b51360e51b81526101009092046001600160a01b0390811660048401526024830189905233604484015290519086169350639e96a2609250606480830192600092919082900301818387803b158015612a7157600080fd5b505af1158015612a85573d6000803e3d6000fd5b50506001600055505050505050565b6004546001600160a01b03163314612abe5760405162461bcd60e51b8152600401610b3890614862565b600b55565b612acb613dc7565b6001600160a01b0383166000908152600d60209081526040808320858452909152908190208151808301909252805482908290612b0790614bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054612b3390614bc1565b8015612b805780601f10612b5557610100808354040283529160200191612b80565b820191906000526020600020905b815481529060010190602001808311612b6357829003601f168201915b50505050508152602001600182015481525050905092915050565b6004546001600160a01b03163314612bc55760405162461bcd60e51b8152600401610b3890614862565b612bd160058383613ddf565b505050565b6004546000906001600160a01b03163314612c035760405162461bcd60e51b8152600401610b3890614862565b6000828152600260205260409020805460ff19169055600161170a565b6004546001600160a01b03163314612c4a5760405162461bcd60e51b8152600401610b3890614862565b600654604051634d6ca91960e11b8152600481018490526101009091046001600160a01b031690639ad952329060240160006040518083038186803b158015612c9257600080fd5b505afa925050508015612cc757506040513d6000823e601f3d908101601f19168201604052612cc49190810190614321565b60015b612e3d57612cd58583613a89565b15612d165760405162461bcd60e51b8152602060048201526011602482015270111d5c1b1a58d85d1948141c99535a5b9d607a1b6044820152606401610b38565b6001600160a01b0385166000908152600e6020526040902054612d3a906001613a2c565b6001600160a01b0386166000908152600e6020908152604091829020929092558051601f860183900490920282016060908101825290820185815282918790879081908501838280828437600092018290525093855250505060209182018490526001600160a01b0388168152600c8252604080822086835283529020825180519192612dcc92849290910190613cc8565b506020918201516001909101556001600160a01b0386166000818152600c835260408082208683528452808220928252600d8452808220600e855281832054835290935291909120815481908390612e2390614bc1565b612e2e929190613d4c565b50600191820154910155612e7f565b60405162461bcd60e51b815260206004820152601760248201527613919508115e1a5cdd1cc81dda5d1a081d1a1a5cc81251604a1b6044820152606401610b38565b5050505050565b6001546040805163313ce56760e01b815290516000926001600160a01b031691829163313ce56791600480820192602092909190829003018186803b158015612ece57600080fd5b505afa158015612ee2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0691906145ea565b91505090565b6004546001600160a01b03163314612f365760405162461bcd60e51b8152600401610b3890614862565b6006546040516334c6bd2160e21b81526101009091046001600160a01b031690819063d31af48490612f6e90869086906004016149af565b600060405180830381600087803b158015612f8857600080fd5b505af1158015612f9c573d6000803e3d6000fd5b50505050505050565b6000818152600f60205260409020600201546001600160a01b0316331461301c5760405162461bcd60e51b815260206004820152602560248201527f5072655472616e7366657220646f6573206e6f742062656c6f6e6720746f207360448201526432b73232b960d91b6064820152608401610b38565b6000818152601060209081526040808320601183528184205484529091528120906130478282613c6b565b5060006001828101829055600290920180546001600160a01b03191690558281526011602052604090205461307b9161357d565b600082815260116020908152604080832093909355600f9052908120906130a28282613c6b565b506000600182015560020180546001600160a01b031916905550565b6004546001600160a01b031633146130e85760405162461bcd60e51b8152600401610b3890614862565b600154600654600a546001600160a01b03928316926101009092049091169060ff161561321b576009546040516323b872dd60e01b81526001600160a01b038416916323b872dd916131419133913091906004016146f1565b602060405180830381600087803b15801561315b57600080fd5b505af115801561316f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319391906141af565b6131af5760405162461bcd60e51b8152600401610b38906148b6565b600154600954604051630852cd8d60e31b81526001600160a01b03909216916342966c68916131e49160040190815260200190565b600060405180830381600087803b1580156131fe57600080fd5b505af1158015613212573d6000803e3d6000fd5b505050506132c0565b6007546009546040516323b872dd60e01b81526001600160a01b03858116936323b872dd93613252933393909216916004016146f1565b602060405180830381600087803b15801561326c57600080fd5b505af1158015613280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132a491906141af565b6132c05760405162461bcd60e51b8152600401610b38906148b6565b600061330589878a8a89898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061138292505050565b6001600160a01b03811660009081526016602052604090205490915060ff166133405760405162461bcd60e51b8152600401610b389061488f565b6000868152601760205260408120805460ff19166001179055600580546133f2919061336b90614bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461339790614bc1565b80156133e45780601f106133b9576101008083540402835291602001916133e4565b820191906000526020600020905b8154815290600101906020018083116133c757829003601f168201915b50505050506113f98c61373d565b604051632fb102cf60e01b81529091506001600160a01b03841690632fb102cf90613429908e908e9086908f908f906004016147ad565b600060405180830381600087803b15801561344357600080fd5b505af1158015613457573d6000803e3d6000fd5b505050505050505050505050505050565b6004546001600160a01b031633146134925760405162461bcd60e51b8152600401610b3890614862565b6001600160a01b03166000908152601660205260409020805460ff19169055565b6004546001600160a01b031633146134dd5760405162461bcd60e51b8152600401610b3890614862565b6004546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600480546001600160a01b0319166001600160a01b0392909216919091179055565b613541613dc7565b6001600160a01b0383166000908152600c60209081526040808320858452909152908190208151808301909252805482908290612b0790614bc1565b60006135bf83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b69565b9392505050565b6000828152600360205260408120548211156136305760405162461bcd60e51b8152602060048201526024808201527f43616e206e6f74207472616e73666572206d6f7265207468616e206465706f736044820152631a5d195960e21b6064820152608401610b38565b60008381526002602052604090205460ff1661365e5760405162461bcd60e51b8152600401610b3890614838565b6001546040516340c10f1960e01b81526001600160a01b038681166004830152602482018590529091169081906340c10f1990604401600060405180830381600087803b1580156136ae57600080fd5b505af11580156136c2573d6000803e3d6000fd5b5050506000858152600360205260409020546136df91508461357d565b60008581526003602052604090205582336001600160a01b03167fdfb36617677d4721feefea07d11b2d1aca3d4ea49facf2bae87fbc8db4ecc9138660405161372a91815260200190565b60405180910390a3506001949350505050565b6060816137615750506040805180820190915260018152600360fc1b602082015290565b8160005b811561378b578061377581614bfc565b91506137849050600a83614a5c565b9150613765565b6000816001600160401b038111156137b357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156137dd576020820181803683370190505b5090505b8415610fbe576137f2600183614b7a565b91506137ff600a86614c17565b61380a906030614a1f565b60f81b81838151811061382d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061384f600a86614a5c565b94506137e1565b6060828260405160200161386b9291906146ae565b604051602081830303815290604052905092915050565b600081516041146138ce5760405162461bcd60e51b81526020600482015260166024820152750a4cae2ead2e4ca40c6dee4e4cac6e840d8cadccee8d60531b6044820152606401610b38565b60208201516040830151606084015160001a601b8110156138f7576138f4601b82614a37565b90505b8060ff16601b148061390c57508060ff16601c145b6139565760405162461bcd60e51b815260206004820152601b60248201527a0a6d2cedcc2e8eae4ca40eccae4e6d2dedc40dcdee840dac2e8c6d602b1b6044820152606401610b38565b6126d686828585613b9a565b6000818152600f60205260408120805482919061397e90614bc1565b80601f01602080910402602001604051908101604052809291908181526020018280546139aa90614bc1565b80156139f75780601f106139cc576101008083540402835291602001916139f7565b820191906000526020600020905b8154815290600101906020018083116139da57829003601f168201915b5050604080516020808201909252600090528451940193909320600080516020614c8383398151915214159695505050505050565b600080613a398385614a1f565b9050838110156135bf5760405162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b6044820152606401610b38565b6001600160a01b0382166000908152600c6020908152604080832084845290915281208054829190613aba90614bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054613ae690614bc1565b8015613b335780601f10613b0857610100808354040283529160200191613b33565b820191906000526020600020905b815481529060010190602001808311613b1657829003601f168201915b5050604080516020808201909252600090528451940193909320600080516020614c838339815191521415979650505050505050565b60008184841115613b8d5760405162461bcd60e51b8152600401610b389190614825565b506000611de58486614b7a565b6000806040518060400160405280601c81526020017b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b815250905060008187604051602001613be992919061467c565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015613c54573d6000803e3d6000fd5b5050604051601f1901519998505050505050505050565b508054613c7790614bc1565b6000825580601f10613c87575050565b601f016020900490600052602060002090810190613ca59190613e53565b50565b604080516060808201835281526000602082018190529181019190915290565b828054613cd490614bc1565b90600052602060002090601f016020900481019282613cf65760008555613d3c565b82601f10613d0f57805160ff1916838001178555613d3c565b82800160010185558215613d3c579182015b82811115613d3c578251825591602001919060010190613d21565b50613d48929150613e53565b5090565b828054613d5890614bc1565b90600052602060002090601f016020900481019282613d7a5760008555613d3c565b82601f10613d8b5780548555613d3c565b82800160010185558215613d3c57600052602060002091601f016020900482015b82811115613d3c578254825591600101919060010190613dac565b60408051808201909152606081526000602082015290565b828054613deb90614bc1565b90600052602060002090601f016020900481019282613e0d5760008555613d3c565b82601f10613e265782800160ff19823516178555613d3c565b82800160010185558215613d3c579182015b82811115613d3c578235825591602001919060010190613e38565b5b80821115613d485760008155600101613e54565b60008083601f840112613e79578182fd5b5081356001600160401b03811115613e8f578182fd5b602083019150836020828501011115613ea757600080fd5b9250929050565b600082601f830112613ebe578081fd5b8135613ed1613ecc826149f8565b6149c8565b818152846020838601011115613ee5578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613f10578081fd5b81356135bf81614c6d565b600060208284031215613f2c578081fd5b81516135bf81614c6d565b600080600080600060808688031215613f4e578081fd5b8535613f5981614c6d565b945060208601356001600160401b03811115613f73578182fd5b613f7f88828901613e68565b9699909850959660408101359660609091013595509350505050565b60008060408385031215613fad578182fd5b8235613fb881614c6d565b946020939093013593505050565b60008060008060008060808789031215613fde578081fd5b8635613fe981614c6d565b95506020870135945060408701356001600160401b038082111561400b578283fd5b6140178a838b01613e68565b9096509450606089013591508082111561402f578283fd5b5061403c89828a01613e68565b979a9699509497509295939492505050565b600080600080600080600060a0888a031215614068578081fd5b873561407381614c6d565b96506020880135955060408801356001600160401b0380821115614095578283fd5b6140a18b838c01613e68565b909750955060608a0135945060808a01359150808211156140c0578283fd5b506140cd8a828b01613e68565b989b979a50959850939692959293505050565b60008060008060008060008060c0898b0312156140fb578182fd5b883561410681614c6d565b97506020890135965060408901356001600160401b0380821115614128578384fd5b6141348c838d01613e68565b909850965060608b0135955060808b0135945060a08b013591508082111561415a578384fd5b506141678b828c01613e68565b999c989b5096995094979396929594505050565b60008060006060848603121561418f578081fd5b833561419a81614c6d565b95602085013595506040909401359392505050565b6000602082840312156141c0578081fd5b815180151581146135bf578182fd5b6000602082840312156141e0578081fd5b5035919050565b6000602082840312156141f8578081fd5b5051919050565b600080600060408486031215614213578081fd5b8335925060208401356001600160401b0381111561422f578182fd5b61423b86828701613e68565b9497909650939450505050565b600060208284031215614259578081fd5b81356001600160401b0381111561426e578182fd5b610fbe84828501613eae565b6000806020838503121561428c578182fd5b82356001600160401b038111156142a1578283fd5b6142ad85828601613e68565b90969095509350505050565b600080600080604085870312156142ce578182fd5b84356001600160401b03808211156142e4578384fd5b6142f088838901613e68565b90965094506020870135915080821115614308578384fd5b5061431587828801613e68565b95989497509550505050565b600060208284031215614332578081fd5b81516001600160401b03811115614347578182fd5b8201601f81018413614357578182fd5b8051614365613ecc826149f8565b818152856020838501011115614379578384fd5b611de5826020830160208601614b91565b6000806040838503121561439c578182fd5b82356001600160401b038111156143b1578283fd5b6143bd85828601613eae565b95602094909401359450505050565b600080604083850312156143de578182fd5b50508035926020909101359150565b60008060008060008060a08789031215614405578384fd5b8635955060208701356001600160401b0380821115614422578586fd5b61442e8a838b01613e68565b90975095506040890135915061444382614c6d565b909350606088013592506080880135908082111561445f578283fd5b5061446c89828a01613eae565b9150509295509295509295565b6000806040838503121561448b578182fd5b8235915060208301356001600160401b038111156144a7578182fd5b6144b385828601613eae565b9150509250929050565b6000806000606084860312156144d1578081fd5b833592506020840135915060408401356001600160401b038111156144f4578182fd5b61450086828701613eae565b9150509250925092565b600080600080600060808688031215614521578283fd5b853594506020860135935060408601356001600160401b0380821115614545578485fd5b61455189838a01613e68565b90955093506060880135915080821115614569578283fd5b5061457688828901613eae565b9150509295509295909350565b60008060008060008060a0878903121561459b578384fd5b863595506020870135945060408701356001600160401b03808211156145bf578586fd5b6145cb8a838b01613e68565b909650945060608901359350608089013591508082111561445f578283fd5b6000602082840312156145fb578081fd5b815160ff811681146135bf578182fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000815180845261464c816020860160208601614b91565b601f01601f19169290920160200192915050565b60008251614672818460208701614b91565b9190910192915050565b6000835161468e818460208801614b91565b9190910191825250602001919050565b8183823760009101908152919050565b600083516146c0818460208801614b91565b8351908301906146d4818360208801614b91565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038416815260208082018490526060604083018190528351908301819052600091848101916080850190845b8181101561476457845183529383019391830191600101614748565b509098975050505050505050565b60018060a01b038716815285602082015260806040820152600061479a60808301868861460b565b828103606084015261143281858761460b565b60018060a01b03861681528460208201526080604082015260006147d46080830186614634565b82810360608401526147e781858761460b565b98975050505050505050565b60408152600061480760408301868861460b565b828103602084015261481a81858761460b565b979650505050505050565b6020815260006135bf6020830184614634565b60208082526010908201526f125b9d985b1a590810da185a5b88125160821b604082015260600190565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b6020808252600d908201526c139bdd0815da5d1b995cdcd959609a1b604082015260600190565b6020808252600e908201526d2a3930b739b332b91022a92927a960911b604082015260600190565b6020808252600f908201526e105b1c9958591e4810db185a5b5959608a1b604082015260600190565b60208082526015908201527410d85b1b195c881a5cc8189b1858dadb1a5cdd1959605a1b604082015260600190565b6020815260008251604060208401526149526060840182614634565b9050602084015160408401528091505092915050565b6020815260008251606060208401526149846080840182614634565b6020850151604085810191909152909401516001600160a01b03166060909301929092525090919050565b828152604060208201526000610fbe6040830184614634565b604051601f8201601f191681016001600160401b03811182821017156149f0576149f0614c57565b604052919050565b60006001600160401b03821115614a1157614a11614c57565b50601f01601f191660200190565b60008219821115614a3257614a32614c2b565b500190565b600060ff821660ff84168060ff03821115614a5457614a54614c2b565b019392505050565b600082614a6b57614a6b614c41565b500490565b600181815b80851115614aab578160001904821115614a9157614a91614c2b565b80851615614a9e57918102915b93841c9390800290614a75565b509250929050565b60006135bf8383600082614ac95750600161170a565b81614ad65750600061170a565b8160018114614aec5760028114614af657614b12565b600191505061170a565b60ff841115614b0757614b07614c2b565b50506001821b61170a565b5060208310610133831016604e8410600b8410161715614b35575081810a61170a565b614b3f8383614a70565b8060001904821115614b5357614b53614c2b565b029392505050565b6000816000190483118215151615614b7557614b75614c2b565b500290565b600082821015614b8c57614b8c614c2b565b500390565b60005b83811015614bac578181015183820152602001614b94565b83811115614bbb576000848401525b50505050565b600181811c90821680614bd557607f821691505b60208210811415614bf657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614c1057614c10614c2b565b5060010190565b600082614c2657614c26614c41565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613ca557600080fdfec5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470a2646970667358221220b7d58c8a4a6eea7b845d2c030aa15aaefdc9acd05d931347dafcea1bc2b4db1f64736f6c6343000804003368747470733a2f2f6170692e656d626c656d7661756c742e696f2f733a65766d657461646174612f6d6574612f00000000000000000000000082c7a8f707110f5fbb16184a5933e9f78a34c6ab0000000000000000000000003d658390460295fb963f54dc0899cfb1c30776df0000000000000000000000002272ecf43a7481088fa2d4ba9109804ed5a3190100000000000000000000000000000000000000000000000000000000000000fa
Deployed Bytecode
0x6080604052600436106102c85760003560e01c806305691ec8146102cd5780630d7def9514610303578063158ef93e1461031a57806321d93090146103445780632754902f146103745780632e16a69e146103875780632fb102cf146103a757806330e6822c146103c757806331726da1146103e757806331b4805514610407578063321c3cf61461042157806332ca2c001461045157806336864adb1461047e578063379607f5146104a057806339f6c85e146104c05780633b442cdb146104fd5780633debbbc01461051d578063528204d01461053d5780635622bf121461055d57806356ca623e1461057d57806357cb93d91461059d578063582f1da2146105cd57806359e26be1146105ed5780635aaf27b71461060d5780635aff59991461062d5780635b6beeb91461064d5780635bf8633a1461067b5780635e1bd52a146106a0578063633423be146106c05780636900a3ae146106e057806371aad10d146107005780637224bb921461072057806373d0ffe01461074d57806379d336061461076d57806386575e401461078d578063893d20e8146107ad5780638ddc2020146107cb57806392c2bcb4146107eb578063945cfe1f1461080b57806399b2c1c71461082b5780639d75afc71461084b5780639d98eda91461086b5780639eaa56261461087e578063a035b1fe1461089e578063a111fbae146108b4578063a2b40d19146108e1578063ae2a489f14610901578063af62050014610921578063b11a19e8146106e0578063bc2bf73e14610941578063bd54c89c1461096e578063c5eeb8af1461098e578063d02b1153146109ae578063d0569c22146109ce578063d2b6447214610a04578063d31af48414610a2b578063d81fba16146104c0578063dbac26e914610a4b578063df4a529d14610a7b578063e94b770614610a9b578063ee2f13cd14610aae578063f2fde38b14610ace578063fc9a85b114610aee575b600080fd5b3480156102d957600080fd5b506008546102ed906001600160a01b031681565b6040516102fa91906146dd565b60405180910390f35b34801561030f57600080fd5b50610318610b0e565b005b34801561032657600080fd5b506006546103349060ff1681565b60405190151581526020016102fa565b34801561035057600080fd5b5061033461035f3660046141cf565b60026020526000908152604090205460ff1681565b6103186103823660046143ed565b610b55565b34801561039357600080fd5b506103186103a2366004613eff565b610e8e565b3480156103b357600080fd5b506103186103c2366004613fc6565b610ee1565b3480156103d357600080fd5b506103346103e236600461417b565b610f86565b3480156103f357600080fd5b50610318610402366004613eff565b610fc6565b34801561041357600080fd5b50600a546103349060ff1681565b34801561042d57600080fd5b5061033461043c366004613eff565b60166020526000908152604090205460ff1681565b34801561045d57600080fd5b5061047161046c3660046141cf565b611058565b6040516102fa9190614968565b34801561048a57600080fd5b5061049361112e565b6040516102fa9190614825565b3480156104ac57600080fd5b506103186104bb3660046141cf565b6111bc565b3480156104cc57600080fd5b506104e06104db36600461438a565b611300565b6040805193845260208401929092521515908201526060016102fa565b34801561050957600080fd5b506102ed61051836600461450a565b611382565b34801561052957600080fd5b50610318610538366004613eff565b61143f565b34801561054957600080fd5b506103186105583660046143cc565b61149f565b34801561056957600080fd5b506102ed610578366004614583565b611611565b34801561058957600080fd5b50610493610598366004613eff565b6116d6565b3480156105a957600080fd5b506103346105b83660046141cf565b60186020526000908152604090205460ff1681565b3480156105d957600080fd5b506103346105e83660046141cf565b611710565b3480156105f957600080fd5b50610318610608366004613eff565b61175e565b34801561061957600080fd5b50610318610628366004613eff565b6117ac565b34801561063957600080fd5b506007546102ed906001600160a01b031681565b34801561065957600080fd5b5061066d61066836600461427a565b6117f8565b6040519081526020016102fa565b34801561068757600080fd5b506006546102ed9061010090046001600160a01b031681565b3480156106ac57600080fd5b506103346106bb3660046143cc565b61182e565b3480156106cc57600080fd5b506001546102ed906001600160a01b031681565b3480156106ec57600080fd5b506104936106fb3660046141cf565b611aa8565b34801561070c57600080fd5b5061049361071b366004614248565b611ac0565b34801561072c57600080fd5b5061066d61073b3660046141cf565b60036020526000908152604090205481565b34801561075957600080fd5b50610318610768366004613eff565b611d56565b34801561077957600080fd5b506102ed6107883660046141ff565b611da2565b34801561079957600080fd5b506103186107a83660046142b9565b611dee565b3480156107b957600080fd5b506004546001600160a01b03166102ed565b3480156107d757600080fd5b506103186107e6366004613eff565b611e8d565b3480156107f757600080fd5b50610318610806366004613eff565b611edf565b34801561081757600080fd5b506104716108263660046143cc565b611f2b565b34801561083757600080fd5b5061066d6108463660046141cf565b61200d565b34801561085757600080fd5b50610318610866366004613f9b565b61209c565b6103186108793660046140e0565b61216c565b34801561088a57600080fd5b506102ed6108993660046144bd565b612678565b3480156108aa57600080fd5b5061066d60095481565b3480156108c057600080fd5b5061066d6108cf3660046141cf565b60009081526011602052604090205490565b3480156108ed57600080fd5b506103186108fc3660046141cf565b6126e0565b34801561090d57600080fd5b5061031861091c3660046141cf565b6127a8565b34801561092d57600080fd5b5061031861093c3660046141cf565b612a94565b34801561094d57600080fd5b5061096161095c366004613f9b565b612ac3565b6040516102fa9190614936565b34801561097a57600080fd5b5061031861098936600461427a565b612b9b565b34801561099a57600080fd5b506103346109a93660046141cf565b612bd6565b3480156109ba57600080fd5b506103186109c9366004613f37565b612c20565b3480156109da57600080fd5b5061066d6109e9366004613eff565b6001600160a01b03166000908152600e602052604090205490565b348015610a1057600080fd5b50610a19612e86565b60405160ff90911681526020016102fa565b348015610a3757600080fd5b50610318610a46366004614479565b612f0c565b348015610a5757600080fd5b50610334610a66366004613eff565b60156020526000908152604090205460ff1681565b348015610a8757600080fd5b50610318610a963660046141cf565b612fa5565b610318610aa936600461404e565b6130be565b348015610aba57600080fd5b50610318610ac9366004613eff565b613468565b348015610ada57600080fd5b50610318610ae9366004613eff565b6134b3565b348015610afa57600080fd5b50610961610b09366004613f9b565b613539565b6004546001600160a01b03163314610b415760405162461bcd60e51b8152600401610b3890614862565b60405180910390fd5b600a805460ff19811660ff90911615179055565b3360009081526015602052604090205460ff1615610b855760405162461bcd60e51b8152600401610b3890614907565b60166000610b94888585612678565b6001600160a01b0316815260208101919091526040016000205460ff16610bcd5760405162461bcd60e51b8152600401610b389061488f565b6006546000878152600f602052604080822081516060810190925280546101009094046001600160a01b03169382908290610c0790614bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3390614bc1565b8015610c805780601f10610c5557610100808354040283529160200191610c80565b820191906000526020600020905b815481529060010190602001808311610c6357829003601f168201915b505050918352505060018201546020808301919091526002928301546001600160a01b031660409283015290519293509091610cc0918a918a910161469e565b60408051601f1981840301815290829052610cda91614660565b602060405180830381855afa158015610cf7573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610d1a91906141e7565b816020015114610d625760405162461bcd60e51b8152602060048201526013602482015272086dec8ca40c8decae640dcdee840dac2e8c6d606b1b6044820152606401610b38565b60408082015190516323b872dd60e01b81526001600160a01b038416916323b872dd91610d96919089908d906004016146f1565b600060405180830381600087803b158015610db057600080fd5b505af1158015610dc4573d6000803e3d6000fd5b5050506000898152600f602052604081209150610de18282613c6b565b50600060018201819055600290910180546001600160a01b031916905588815260106020908152604080832060118352818420548452909152812090610e278282613c6b565b5060006001828101829055600290920180546001600160a01b031916905589815260116020526040902054610e5b9161357d565b6000988952601160209081526040808b20929092559489526017909452505050909320805460ff19166001179055505050565b6004546001600160a01b03163314610eb85760405162461bcd60e51b8152600401610b3890614862565b6001600160a01b03166000908152601560205260409020805460ff19811660ff90911615179055565b6004546001600160a01b03163314610f0b5760405162461bcd60e51b8152600401610b3890614862565b600654604051632fb102cf60e01b81526101009091046001600160a01b0316908190632fb102cf90610f4b908a908a908a908a908a908a90600401614772565b600060405180830381600087803b158015610f6557600080fd5b505af1158015610f79573d6000803e3d6000fd5b5050505050505050505050565b6004546000906001600160a01b03163314610fb35760405162461bcd60e51b8152600401610b3890614862565b610fbe8484846135c6565b949350505050565b6004546001600160a01b03163314610ff05760405162461bcd60e51b8152600401610b3890614862565b60015460405163f2fde38b60e01b81526001600160a01b0390911690819063f2fde38b906110229085906004016146dd565b600060405180830381600087803b15801561103c57600080fd5b505af1158015611050573d6000803e3d6000fd5b505050505050565b611060613ca8565b6000828152600f60205260409081902081516060810190925280548290829061108890614bc1565b80601f01602080910402602001604051908101604052809291908181526020018280546110b490614bc1565b80156111015780601f106110d657610100808354040283529160200191611101565b820191906000526020600020905b8154815290600101906020018083116110e457829003601f168201915b5050509183525050600182015460208201526002909101546001600160a01b031660409091015292915050565b6005805461113b90614bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461116790614bc1565b80156111b45780601f10611189576101008083540402835291602001916111b4565b820191906000526020600020905b81548152906001019060200180831161119757829003601f168201915b505050505081565b6004546001600160a01b031633146111e65760405162461bcd60e51b8152600401610b3890614862565b6008546006546040516305fbdf1560e21b81526060926001600160a01b039081169283926317ef7c5492611227926101009004169087908790600401614715565b602060405180830381600087803b15801561124157600080fd5b505af1158015611255573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127991906141af565b156112965760405162461bcd60e51b8152600401610b38906148de565b600654604051630852cd8d60e31b8152600481018590526101009091046001600160a01b03169081906342966c6890602401600060405180830381600087803b1580156112e257600080fd5b505af11580156112f6573d6000803e3d6000fd5b5050505050505050565b6000806000806002866040516020016113199190614660565b60408051601f198184030181529082905261133391614660565b602060405180830381855afa158015611350573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061137391906141e7565b96949550505083851492915050565b60008481526017602052604081205460ff161561139e57600080fd5b60006113e86113ac8861373d565b86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061385692505050565b905060006113fe826113f98961373d565b613856565b60405160200161140e9190614660565b60405160208183030381529060405280519060200120905060006114328286613882565b9998505050505050505050565b6004546001600160a01b031633146114695760405162461bcd60e51b8152600401610b3890614862565b60065460405163f2fde38b60e01b81526101009091046001600160a01b031690819063f2fde38b906110229085906004016146dd565b6114a882613962565b156114ed5760405162461bcd60e51b8152602060048201526015602482015274223ab83634b1b0ba3290283932aa3930b739b332b960591b6044820152606401610b38565b600082815260116020526040902054611507906001613a2c565b600083815260116020908152604080832093909355825160a081018452600760608201908152661c185e5b1bd85960ca1b608083015281528082018590523381850152858352600f82529290912082518051919261156a92849290910190613cc8565b506020828101516001830155604092830151600290920180546001600160a01b0319166001600160a01b03909316929092179091556000848152600f82528281206010835283822060118452848320548352909252919091208154819083906115d290614bc1565b6115dd929190613d4c565b5060018281015490820155600291820154910180546001600160a01b0319166001600160a01b039092169190911790555050565b60008581526017602052604081205460ff161561162d57600080fd5b600061168361167a61163e8a61373d565b88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061385692505050565b6113f98661373d565b90506000611694826113f98a61373d565b6040516020016116a49190614660565b60405160208183030381529060405280519060200120905060006116c88286613882565b9a9950505050505050505050565b604051606082811b6001600160601b03191660208301529061170a906034015b604051602081830303815290604052611ac0565b92915050565b6004546000906001600160a01b0316331461173d5760405162461bcd60e51b8152600401610b3890614862565b6000828152600260205260409020805460ff1916600190811790915561170a565b6004546001600160a01b031633146117885760405162461bcd60e51b8152600401610b3890614862565b6001600160a01b03166000908152601660205260409020805460ff19166001179055565b6004546001600160a01b031633146117d65760405162461bcd60e51b8152600401610b3890614862565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080838360405160200161180e92919061469e565b60408051808303601f190181529190528051602090910120949350505050565b60008281526002602052604081205460ff1661185c5760405162461bcd60e51b8152600401610b3890614838565b6001546001600160a01b0316828163dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260440160206040518083038186803b1580156118b557600080fd5b505afa1580156118c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ed91906141e7565b10156119365760405162461bcd60e51b815260206004820152601860248201527702430b7323632b9103ab730b13632903a379039b832b732160451b6044820152606401610b38565b6040516323b872dd60e01b81526001600160a01b038216906323b872dd90611966903390309088906004016146f1565b602060405180830381600087803b15801561198057600080fd5b505af1158015611994573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b891906141af565b6119d45760405162461bcd60e51b8152600401610b38906148b6565b600154604051630852cd8d60e31b8152600481018590526001600160a01b03909116906342966c6890602401600060405180830381600087803b158015611a1a57600080fd5b505af1158015611a2e573d6000803e3d6000fd5b505050600085815260036020526040902054611a4b915084613a2c565b60008581526003602052604090205582336001600160a01b03167fed2432d91de9329ae454049df81fd5d6b856c4470096ca37a29c1fe111f57f0c86604051611a9691815260200190565b60405180910390a35060019392505050565b606061170a826040516020016116f691815260200190565b60408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b6020820152815160609190600090611afb906002614b5b565b611b06906002614a1f565b6001600160401b03811115611b2b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b55576020820181803683370190505b509050600360fc1b81600081518110611b7e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611bbb57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060005b8451811015611d4e57826004868381518110611c0157634e487b7160e01b600052603260045260246000fd5b016020015182516001600160f81b031990911690911c60f81c908110611c3757634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191682611c52836002614b5b565b611c5d906002614a1f565b81518110611c7b57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535082858281518110611cb357634e487b7160e01b600052603260045260246000fd5b602091010151815160f89190911c600f16908110611ce157634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191682611cfc836002614b5b565b611d07906003614a1f565b81518110611d2557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535080611d4681614bfc565b915050611bd5565b509392505050565b6004546001600160a01b03163314611d805760405162461bcd60e51b8152600401610b3890614862565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600080611de58585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061388292505050565b95945050505050565b6004546001600160a01b03163314611e185760405162461bcd60e51b8152600401610b3890614862565b6006546040516302195d7960e61b81526101009091046001600160a01b03169081906386575e4090611e549088908890889088906004016147f3565b600060405180830381600087803b158015611e6e57600080fd5b505af1158015611e82573d6000803e3d6000fd5b505050505050505050565b6004546001600160a01b03163314611eb75760405162461bcd60e51b8152600401610b3890614862565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6004546001600160a01b03163314611f095760405162461bcd60e51b8152600401610b3890614862565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611f33613ca8565b600083815260106020908152604080832085845290915290819020815160608101909252805482908290611f6690614bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9290614bc1565b8015611fdf5780601f10611fb457610100808354040283529160200191611fdf565b820191906000526020600020905b815481529060010190602001808311611fc257829003601f168201915b5050509183525050600182015460208201526002909101546001600160a01b03166040909101529392505050565b60008060005b6020811015612095576000612029826008614b5b565b8560001c901c60ff16905080603011158015612046575060398111155b1561207c5761205682600a614ab3565b612061603083614b7a565b61206b9190614b5b565b6120759084614a1f565b9250612082565b50612095565b508061208d81614bfc565b915050612013565b5092915050565b6004546001600160a01b031633146120c65760405162461bcd60e51b8152600401610b3890614862565b6001600160a01b0382166000908152600d60209081526040808320600e83528184205484529091528120906120fb8282613c6b565b50600060019182018190556001600160a01b0384168152600e60205260409020546121259161357d565b6001600160a01b0383166000908152600e6020908152604080832093909355600c815282822084835290529081209061215e8282613c6b565b600182016000905550505050565b3360009081526015602052604090205460ff161561219c5760405162461bcd60e51b8152600401610b3890614907565b6060436121b4600b5486613a2c90919063ffffffff16565b116121f55760405162461bcd60e51b815260206004820152601160248201527014da59db985d1d5c9948195e1c1a5c9959607a1b6044820152606401610b38565b6008546006546040516305fbdf1560e21b81526001600160a01b03928316926317ef7c549261223492610100909104909116908c908690600401614715565b602060405180830381600087803b15801561224e57600080fd5b505af1158015612262573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228691906141af565b1580156122a2575060008881526018602052604090205460ff16155b6122e05760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b6044820152606401610b38565b600654600a546101009091046001600160a01b03169060ff161561240d576001546009546040516323b872dd60e01b81526001600160a01b03909216916323b872dd9161233391339130916004016146f1565b602060405180830381600087803b15801561234d57600080fd5b505af1158015612361573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238591906141af565b6123a15760405162461bcd60e51b8152600401610b38906148b6565b600154600954604051630852cd8d60e31b81526001600160a01b03909216916342966c68916123d69160040190815260200190565b600060405180830381600087803b1580156123f057600080fd5b505af1158015612404573d6000803e3d6000fd5b505050506124b6565b6001546007546009546040516323b872dd60e01b81526001600160a01b03938416936323b872dd9361244893339392909116916004016146f1565b602060405180830381600087803b15801561246257600080fd5b505af1158015612476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249a91906141af565b6124b65760405162461bcd60e51b8152600401610b38906148b6565b60006124fc8a888b8b8a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061161192505050565b6001600160a01b03811660009081526016602052604090205490915060ff166125375760405162461bcd60e51b8152600401610b389061488f565b6000878152601760205260408120805460ff19166001179055600580546125e9919061256290614bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461258e90614bc1565b80156125db5780601f106125b0576101008083540402835291602001916125db565b820191906000526020600020905b8154815290600101906020018083116125be57829003601f168201915b50505050506113f98d61373d565b9050826001600160a01b0316632fb102cf8d8d848e8e6040518663ffffffff1660e01b815260040161261f9594939291906147ad565b600060405180830381600087803b15801561263957600080fd5b505af115801561264d573d6000803e3d6000fd5b50505060009b8c525050601860205250506040909720805460ff191660011790555050505050505050565b60008281526017602052604081205460ff161561269457600080fd5b60006126a261167a8661373d565b6040516020016126b29190614660565b60405160208183030381529060405280519060200120905060006126d68285613882565b9695505050505050565b6004546001600160a01b0316331461270a5760405162461bcd60e51b8152600401610b3890614862565b6001546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b15801561274f57600080fd5b505afa158015612763573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278791906145ea565b60ff16905061279781600a614ab3565b6127a19083614b5b565b6009555050565b600260005414156127fb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b38565b600260009081553381526015602052604090205460ff161561282f5760405162461bcd60e51b8152600401610b3890614907565b6008546006546040516305fbdf1560e21b81526060926001600160a01b039081169283926317ef7c5492612870926101009004169087908790600401614715565b602060405180830381600087803b15801561288a57600080fd5b505af115801561289e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c291906141af565b156128df5760405162461bcd60e51b8152600401610b38906148de565b60065461010090046001600160a01b0316336040516331a9108f60e11b8152600481018690526001600160a01b0391821691831690636352211e90602401602060405180830381600087803b15801561293757600080fd5b505af115801561294b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296f9190613f1b565b6001600160a01b0316146129b75760405162461bcd60e51b815260206004820152600f60248201526e2737ba102a37b5b2b71027bbb732b960891b6044820152606401610b38565b604051630852cd8d60e31b8152600481018590526001600160a01b038216906342966c6890602401600060405180830381600087803b1580156129f957600080fd5b505af1158015612a0d573d6000803e3d6000fd5b5050600654604080516304f4b51360e51b81526101009092046001600160a01b0390811660048401526024830189905233604484015290519086169350639e96a2609250606480830192600092919082900301818387803b158015612a7157600080fd5b505af1158015612a85573d6000803e3d6000fd5b50506001600055505050505050565b6004546001600160a01b03163314612abe5760405162461bcd60e51b8152600401610b3890614862565b600b55565b612acb613dc7565b6001600160a01b0383166000908152600d60209081526040808320858452909152908190208151808301909252805482908290612b0790614bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054612b3390614bc1565b8015612b805780601f10612b5557610100808354040283529160200191612b80565b820191906000526020600020905b815481529060010190602001808311612b6357829003601f168201915b50505050508152602001600182015481525050905092915050565b6004546001600160a01b03163314612bc55760405162461bcd60e51b8152600401610b3890614862565b612bd160058383613ddf565b505050565b6004546000906001600160a01b03163314612c035760405162461bcd60e51b8152600401610b3890614862565b6000828152600260205260409020805460ff19169055600161170a565b6004546001600160a01b03163314612c4a5760405162461bcd60e51b8152600401610b3890614862565b600654604051634d6ca91960e11b8152600481018490526101009091046001600160a01b031690639ad952329060240160006040518083038186803b158015612c9257600080fd5b505afa925050508015612cc757506040513d6000823e601f3d908101601f19168201604052612cc49190810190614321565b60015b612e3d57612cd58583613a89565b15612d165760405162461bcd60e51b8152602060048201526011602482015270111d5c1b1a58d85d1948141c99535a5b9d607a1b6044820152606401610b38565b6001600160a01b0385166000908152600e6020526040902054612d3a906001613a2c565b6001600160a01b0386166000908152600e6020908152604091829020929092558051601f860183900490920282016060908101825290820185815282918790879081908501838280828437600092018290525093855250505060209182018490526001600160a01b0388168152600c8252604080822086835283529020825180519192612dcc92849290910190613cc8565b506020918201516001909101556001600160a01b0386166000818152600c835260408082208683528452808220928252600d8452808220600e855281832054835290935291909120815481908390612e2390614bc1565b612e2e929190613d4c565b50600191820154910155612e7f565b60405162461bcd60e51b815260206004820152601760248201527613919508115e1a5cdd1cc81dda5d1a081d1a1a5cc81251604a1b6044820152606401610b38565b5050505050565b6001546040805163313ce56760e01b815290516000926001600160a01b031691829163313ce56791600480820192602092909190829003018186803b158015612ece57600080fd5b505afa158015612ee2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0691906145ea565b91505090565b6004546001600160a01b03163314612f365760405162461bcd60e51b8152600401610b3890614862565b6006546040516334c6bd2160e21b81526101009091046001600160a01b031690819063d31af48490612f6e90869086906004016149af565b600060405180830381600087803b158015612f8857600080fd5b505af1158015612f9c573d6000803e3d6000fd5b50505050505050565b6000818152600f60205260409020600201546001600160a01b0316331461301c5760405162461bcd60e51b815260206004820152602560248201527f5072655472616e7366657220646f6573206e6f742062656c6f6e6720746f207360448201526432b73232b960d91b6064820152608401610b38565b6000818152601060209081526040808320601183528184205484529091528120906130478282613c6b565b5060006001828101829055600290920180546001600160a01b03191690558281526011602052604090205461307b9161357d565b600082815260116020908152604080832093909355600f9052908120906130a28282613c6b565b506000600182015560020180546001600160a01b031916905550565b6004546001600160a01b031633146130e85760405162461bcd60e51b8152600401610b3890614862565b600154600654600a546001600160a01b03928316926101009092049091169060ff161561321b576009546040516323b872dd60e01b81526001600160a01b038416916323b872dd916131419133913091906004016146f1565b602060405180830381600087803b15801561315b57600080fd5b505af115801561316f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319391906141af565b6131af5760405162461bcd60e51b8152600401610b38906148b6565b600154600954604051630852cd8d60e31b81526001600160a01b03909216916342966c68916131e49160040190815260200190565b600060405180830381600087803b1580156131fe57600080fd5b505af1158015613212573d6000803e3d6000fd5b505050506132c0565b6007546009546040516323b872dd60e01b81526001600160a01b03858116936323b872dd93613252933393909216916004016146f1565b602060405180830381600087803b15801561326c57600080fd5b505af1158015613280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132a491906141af565b6132c05760405162461bcd60e51b8152600401610b38906148b6565b600061330589878a8a89898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061138292505050565b6001600160a01b03811660009081526016602052604090205490915060ff166133405760405162461bcd60e51b8152600401610b389061488f565b6000868152601760205260408120805460ff19166001179055600580546133f2919061336b90614bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461339790614bc1565b80156133e45780601f106133b9576101008083540402835291602001916133e4565b820191906000526020600020905b8154815290600101906020018083116133c757829003601f168201915b50505050506113f98c61373d565b604051632fb102cf60e01b81529091506001600160a01b03841690632fb102cf90613429908e908e9086908f908f906004016147ad565b600060405180830381600087803b15801561344357600080fd5b505af1158015613457573d6000803e3d6000fd5b505050505050505050505050505050565b6004546001600160a01b031633146134925760405162461bcd60e51b8152600401610b3890614862565b6001600160a01b03166000908152601660205260409020805460ff19169055565b6004546001600160a01b031633146134dd5760405162461bcd60e51b8152600401610b3890614862565b6004546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600480546001600160a01b0319166001600160a01b0392909216919091179055565b613541613dc7565b6001600160a01b0383166000908152600c60209081526040808320858452909152908190208151808301909252805482908290612b0790614bc1565b60006135bf83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b69565b9392505050565b6000828152600360205260408120548211156136305760405162461bcd60e51b8152602060048201526024808201527f43616e206e6f74207472616e73666572206d6f7265207468616e206465706f736044820152631a5d195960e21b6064820152608401610b38565b60008381526002602052604090205460ff1661365e5760405162461bcd60e51b8152600401610b3890614838565b6001546040516340c10f1960e01b81526001600160a01b038681166004830152602482018590529091169081906340c10f1990604401600060405180830381600087803b1580156136ae57600080fd5b505af11580156136c2573d6000803e3d6000fd5b5050506000858152600360205260409020546136df91508461357d565b60008581526003602052604090205582336001600160a01b03167fdfb36617677d4721feefea07d11b2d1aca3d4ea49facf2bae87fbc8db4ecc9138660405161372a91815260200190565b60405180910390a3506001949350505050565b6060816137615750506040805180820190915260018152600360fc1b602082015290565b8160005b811561378b578061377581614bfc565b91506137849050600a83614a5c565b9150613765565b6000816001600160401b038111156137b357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156137dd576020820181803683370190505b5090505b8415610fbe576137f2600183614b7a565b91506137ff600a86614c17565b61380a906030614a1f565b60f81b81838151811061382d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061384f600a86614a5c565b94506137e1565b6060828260405160200161386b9291906146ae565b604051602081830303815290604052905092915050565b600081516041146138ce5760405162461bcd60e51b81526020600482015260166024820152750a4cae2ead2e4ca40c6dee4e4cac6e840d8cadccee8d60531b6044820152606401610b38565b60208201516040830151606084015160001a601b8110156138f7576138f4601b82614a37565b90505b8060ff16601b148061390c57508060ff16601c145b6139565760405162461bcd60e51b815260206004820152601b60248201527a0a6d2cedcc2e8eae4ca40eccae4e6d2dedc40dcdee840dac2e8c6d602b1b6044820152606401610b38565b6126d686828585613b9a565b6000818152600f60205260408120805482919061397e90614bc1565b80601f01602080910402602001604051908101604052809291908181526020018280546139aa90614bc1565b80156139f75780601f106139cc576101008083540402835291602001916139f7565b820191906000526020600020905b8154815290600101906020018083116139da57829003601f168201915b5050604080516020808201909252600090528451940193909320600080516020614c8383398151915214159695505050505050565b600080613a398385614a1f565b9050838110156135bf5760405162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b6044820152606401610b38565b6001600160a01b0382166000908152600c6020908152604080832084845290915281208054829190613aba90614bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054613ae690614bc1565b8015613b335780601f10613b0857610100808354040283529160200191613b33565b820191906000526020600020905b815481529060010190602001808311613b1657829003601f168201915b5050604080516020808201909252600090528451940193909320600080516020614c838339815191521415979650505050505050565b60008184841115613b8d5760405162461bcd60e51b8152600401610b389190614825565b506000611de58486614b7a565b6000806040518060400160405280601c81526020017b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b815250905060008187604051602001613be992919061467c565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015613c54573d6000803e3d6000fd5b5050604051601f1901519998505050505050505050565b508054613c7790614bc1565b6000825580601f10613c87575050565b601f016020900490600052602060002090810190613ca59190613e53565b50565b604080516060808201835281526000602082018190529181019190915290565b828054613cd490614bc1565b90600052602060002090601f016020900481019282613cf65760008555613d3c565b82601f10613d0f57805160ff1916838001178555613d3c565b82800160010185558215613d3c579182015b82811115613d3c578251825591602001919060010190613d21565b50613d48929150613e53565b5090565b828054613d5890614bc1565b90600052602060002090601f016020900481019282613d7a5760008555613d3c565b82601f10613d8b5780548555613d3c565b82800160010185558215613d3c57600052602060002091601f016020900482015b82811115613d3c578254825591600101919060010190613dac565b60408051808201909152606081526000602082015290565b828054613deb90614bc1565b90600052602060002090601f016020900481019282613e0d5760008555613d3c565b82601f10613e265782800160ff19823516178555613d3c565b82800160010185558215613d3c579182015b82811115613d3c578235825591602001919060010190613e38565b5b80821115613d485760008155600101613e54565b60008083601f840112613e79578182fd5b5081356001600160401b03811115613e8f578182fd5b602083019150836020828501011115613ea757600080fd5b9250929050565b600082601f830112613ebe578081fd5b8135613ed1613ecc826149f8565b6149c8565b818152846020838601011115613ee5578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613f10578081fd5b81356135bf81614c6d565b600060208284031215613f2c578081fd5b81516135bf81614c6d565b600080600080600060808688031215613f4e578081fd5b8535613f5981614c6d565b945060208601356001600160401b03811115613f73578182fd5b613f7f88828901613e68565b9699909850959660408101359660609091013595509350505050565b60008060408385031215613fad578182fd5b8235613fb881614c6d565b946020939093013593505050565b60008060008060008060808789031215613fde578081fd5b8635613fe981614c6d565b95506020870135945060408701356001600160401b038082111561400b578283fd5b6140178a838b01613e68565b9096509450606089013591508082111561402f578283fd5b5061403c89828a01613e68565b979a9699509497509295939492505050565b600080600080600080600060a0888a031215614068578081fd5b873561407381614c6d565b96506020880135955060408801356001600160401b0380821115614095578283fd5b6140a18b838c01613e68565b909750955060608a0135945060808a01359150808211156140c0578283fd5b506140cd8a828b01613e68565b989b979a50959850939692959293505050565b60008060008060008060008060c0898b0312156140fb578182fd5b883561410681614c6d565b97506020890135965060408901356001600160401b0380821115614128578384fd5b6141348c838d01613e68565b909850965060608b0135955060808b0135945060a08b013591508082111561415a578384fd5b506141678b828c01613e68565b999c989b5096995094979396929594505050565b60008060006060848603121561418f578081fd5b833561419a81614c6d565b95602085013595506040909401359392505050565b6000602082840312156141c0578081fd5b815180151581146135bf578182fd5b6000602082840312156141e0578081fd5b5035919050565b6000602082840312156141f8578081fd5b5051919050565b600080600060408486031215614213578081fd5b8335925060208401356001600160401b0381111561422f578182fd5b61423b86828701613e68565b9497909650939450505050565b600060208284031215614259578081fd5b81356001600160401b0381111561426e578182fd5b610fbe84828501613eae565b6000806020838503121561428c578182fd5b82356001600160401b038111156142a1578283fd5b6142ad85828601613e68565b90969095509350505050565b600080600080604085870312156142ce578182fd5b84356001600160401b03808211156142e4578384fd5b6142f088838901613e68565b90965094506020870135915080821115614308578384fd5b5061431587828801613e68565b95989497509550505050565b600060208284031215614332578081fd5b81516001600160401b03811115614347578182fd5b8201601f81018413614357578182fd5b8051614365613ecc826149f8565b818152856020838501011115614379578384fd5b611de5826020830160208601614b91565b6000806040838503121561439c578182fd5b82356001600160401b038111156143b1578283fd5b6143bd85828601613eae565b95602094909401359450505050565b600080604083850312156143de578182fd5b50508035926020909101359150565b60008060008060008060a08789031215614405578384fd5b8635955060208701356001600160401b0380821115614422578586fd5b61442e8a838b01613e68565b90975095506040890135915061444382614c6d565b909350606088013592506080880135908082111561445f578283fd5b5061446c89828a01613eae565b9150509295509295509295565b6000806040838503121561448b578182fd5b8235915060208301356001600160401b038111156144a7578182fd5b6144b385828601613eae565b9150509250929050565b6000806000606084860312156144d1578081fd5b833592506020840135915060408401356001600160401b038111156144f4578182fd5b61450086828701613eae565b9150509250925092565b600080600080600060808688031215614521578283fd5b853594506020860135935060408601356001600160401b0380821115614545578485fd5b61455189838a01613e68565b90955093506060880135915080821115614569578283fd5b5061457688828901613eae565b9150509295509295909350565b60008060008060008060a0878903121561459b578384fd5b863595506020870135945060408701356001600160401b03808211156145bf578586fd5b6145cb8a838b01613e68565b909650945060608901359350608089013591508082111561445f578283fd5b6000602082840312156145fb578081fd5b815160ff811681146135bf578182fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000815180845261464c816020860160208601614b91565b601f01601f19169290920160200192915050565b60008251614672818460208701614b91565b9190910192915050565b6000835161468e818460208801614b91565b9190910191825250602001919050565b8183823760009101908152919050565b600083516146c0818460208801614b91565b8351908301906146d4818360208801614b91565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038416815260208082018490526060604083018190528351908301819052600091848101916080850190845b8181101561476457845183529383019391830191600101614748565b509098975050505050505050565b60018060a01b038716815285602082015260806040820152600061479a60808301868861460b565b828103606084015261143281858761460b565b60018060a01b03861681528460208201526080604082015260006147d46080830186614634565b82810360608401526147e781858761460b565b98975050505050505050565b60408152600061480760408301868861460b565b828103602084015261481a81858761460b565b979650505050505050565b6020815260006135bf6020830184614634565b60208082526010908201526f125b9d985b1a590810da185a5b88125160821b604082015260600190565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b6020808252600d908201526c139bdd0815da5d1b995cdcd959609a1b604082015260600190565b6020808252600e908201526d2a3930b739b332b91022a92927a960911b604082015260600190565b6020808252600f908201526e105b1c9958591e4810db185a5b5959608a1b604082015260600190565b60208082526015908201527410d85b1b195c881a5cc8189b1858dadb1a5cdd1959605a1b604082015260600190565b6020815260008251604060208401526149526060840182614634565b9050602084015160408401528091505092915050565b6020815260008251606060208401526149846080840182614634565b6020850151604085810191909152909401516001600160a01b03166060909301929092525090919050565b828152604060208201526000610fbe6040830184614634565b604051601f8201601f191681016001600160401b03811182821017156149f0576149f0614c57565b604052919050565b60006001600160401b03821115614a1157614a11614c57565b50601f01601f191660200190565b60008219821115614a3257614a32614c2b565b500190565b600060ff821660ff84168060ff03821115614a5457614a54614c2b565b019392505050565b600082614a6b57614a6b614c41565b500490565b600181815b80851115614aab578160001904821115614a9157614a91614c2b565b80851615614a9e57918102915b93841c9390800290614a75565b509250929050565b60006135bf8383600082614ac95750600161170a565b81614ad65750600061170a565b8160018114614aec5760028114614af657614b12565b600191505061170a565b60ff841115614b0757614b07614c2b565b50506001821b61170a565b5060208310610133831016604e8410600b8410161715614b35575081810a61170a565b614b3f8383614a70565b8060001904821115614b5357614b53614c2b565b029392505050565b6000816000190483118215151615614b7557614b75614c2b565b500290565b600082821015614b8c57614b8c614c2b565b500390565b60005b83811015614bac578181015183820152602001614b94565b83811115614bbb576000848401525b50505050565b600181811c90821680614bd557607f821691505b60208210811415614bf657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614c1057614c10614c2b565b5060010190565b600082614c2657614c26614c41565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613ca557600080fdfec5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470a2646970667358221220b7d58c8a4a6eea7b845d2c030aa15aaefdc9acd05d931347dafcea1bc2b4db1f64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000082c7a8f707110f5fbb16184a5933e9f78a34c6ab0000000000000000000000003d658390460295fb963f54dc0899cfb1c30776df0000000000000000000000002272ecf43a7481088fa2d4ba9109804ed5a3190100000000000000000000000000000000000000000000000000000000000000fa
-----Decoded View---------------
Arg [0] : _nftAddress (address): 0x82C7a8f707110f5FBb16184A5933E9F78a34c6ab
Arg [1] : _paymentAddress (address): 0x3D658390460295FB963f54dC0899cfb1c30776Df
Arg [2] : _recipientAddress (address): 0x2272ECf43A7481088FA2d4Ba9109804ED5A31901
Arg [3] : _price (uint256): 250
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000082c7a8f707110f5fbb16184a5933e9f78a34c6ab
Arg [1] : 0000000000000000000000003d658390460295fb963f54dc0899cfb1c30776df
Arg [2] : 0000000000000000000000002272ecf43a7481088fa2d4ba9109804ed5a31901
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000fa
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 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.