Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 28,322 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim On Chain | 20316736 | 2 days ago | IN | 0 ETH | 0.00072259 | ||||
Claim On Chain | 20306454 | 3 days ago | IN | 0 ETH | 0.00060858 | ||||
Claim On Chain | 20306417 | 3 days ago | IN | 0 ETH | 0.00051253 | ||||
Claim On Chain | 20306409 | 3 days ago | IN | 0 ETH | 0.0006047 | ||||
Claim On Chain | 20300626 | 4 days ago | IN | 0 ETH | 0.0014871 | ||||
Claim On Chain | 20294125 | 5 days ago | IN | 0 ETH | 0.00018379 | ||||
Claim On Chain | 20258812 | 10 days ago | IN | 0 ETH | 0.00052565 | ||||
Claim On Chain | 20258790 | 10 days ago | IN | 0 ETH | 0.00061041 | ||||
Claim On Chain | 20258772 | 10 days ago | IN | 0 ETH | 0.00046607 | ||||
Claim On Chain | 20258763 | 10 days ago | IN | 0 ETH | 0.00055434 | ||||
Claim On Chain | 20258739 | 10 days ago | IN | 0 ETH | 0.00062796 | ||||
Claim On Chain | 20258721 | 10 days ago | IN | 0 ETH | 0.00076421 | ||||
Claim On Chain | 20258680 | 10 days ago | IN | 0 ETH | 0.00066958 | ||||
Claim On Chain | 20258653 | 10 days ago | IN | 0 ETH | 0.00069971 | ||||
Claim On Chain | 20246410 | 12 days ago | IN | 0 ETH | 0.00031548 | ||||
Claim On Chain | 20243210 | 12 days ago | IN | 0 ETH | 0.00046948 | ||||
Claim On Chain | 20241970 | 12 days ago | IN | 0 ETH | 0.00124593 | ||||
Claim On Chain | 20232894 | 14 days ago | IN | 0 ETH | 0.00176281 | ||||
Claim On Chain | 20225939 | 15 days ago | IN | 0 ETH | 0.00197818 | ||||
Claim On Chain | 20225457 | 15 days ago | IN | 0 ETH | 0.0015441 | ||||
Claim On Chain | 20220531 | 15 days ago | IN | 0 ETH | 0.00133636 | ||||
Claim On Chain | 20218144 | 16 days ago | IN | 0 ETH | 0.00093885 | ||||
Claim On Chain | 20217974 | 16 days ago | IN | 0 ETH | 0.00101564 | ||||
Claim On Chain | 20215143 | 16 days ago | IN | 0 ETH | 0.00052218 | ||||
Claim On Chain | 20193118 | 19 days ago | IN | 0 ETH | 0.00055233 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers. Name tag integration is not available in advanced view.
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | ||||
---|---|---|---|---|---|---|---|
20300626 | 4 days ago | 0 ETH | |||||
20300626 | 4 days ago | 0 ETH | |||||
20300626 | 4 days ago | 0 ETH | |||||
20300626 | 4 days ago | 0 ETH | |||||
20294125 | 5 days ago | 0 ETH | |||||
20294125 | 5 days ago | 0 ETH | |||||
20294125 | 5 days ago | 0 ETH | |||||
20294125 | 5 days ago | 0 ETH | |||||
20258812 | 10 days ago | 0 ETH | |||||
20258812 | 10 days ago | 0 ETH | |||||
20258812 | 10 days ago | 0 ETH | |||||
20258812 | 10 days ago | 0 ETH | |||||
20258790 | 10 days ago | 0 ETH | |||||
20258790 | 10 days ago | 0 ETH | |||||
20258790 | 10 days ago | 0 ETH | |||||
20258790 | 10 days ago | 0 ETH | |||||
20258772 | 10 days ago | 0 ETH | |||||
20258772 | 10 days ago | 0 ETH | |||||
20258772 | 10 days ago | 0 ETH | |||||
20258772 | 10 days ago | 0 ETH | |||||
20258763 | 10 days ago | 0 ETH | |||||
20258763 | 10 days ago | 0 ETH | |||||
20258763 | 10 days ago | 0 ETH | |||||
20258763 | 10 days ago | 0 ETH | |||||
20258739 | 10 days ago | 0 ETH |
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 ]
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.