Source Code
Overview
ETH Balance
ETH Value
$0.00Cross-Chain Transactions
Loading...
Loading
Contract Name:
BatchSignedERC721OrdersCheckerFeature
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;
import "./IBatchSignedERC721OrdersCheckerFeature.sol";
import "../../libs/LibAssetHelper.sol";
interface IElement {
function getERC721OrderStatusBitVector(address maker, uint248 nonceRange) external view returns (uint256);
function getHashNonce(address maker) external view returns (uint256);
}
contract BatchSignedERC721OrdersCheckerFeature is IBatchSignedERC721OrdersCheckerFeature, LibAssetHelper {
uint256 internal constant MASK_96 = (1 << 96) - 1;
uint256 internal constant MASK_160 = (1 << 160) - 1;
uint256 internal constant MASK_224 = (1 << 224) - 1;
bytes32 public immutable EIP712_DOMAIN_SEPARATOR;
address public immutable ELEMENT;
constructor(address element) {
ELEMENT = element;
EIP712_DOMAIN_SEPARATOR = keccak256(abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256("ElementEx"),
keccak256("1.0.0"),
block.chainid,
element
));
}
function checkBSERC721Orders(BSERC721Orders calldata order) external view override returns (BSERC721OrdersCheckResult memory r) {
uint256 nonce;
(r.basicCollections, nonce) = _checkBasicCollections(order, true);
r.collections = _checkCollections(order, nonce, true);
r.hashNonce = _getHashNonce(order.maker);
r.orderHash = _getOrderHash(order, r.hashNonce);
r.validSignature = _validateSignature(order, r.orderHash, 0);
return r;
}
function checkBSERC721OrdersV2(BSERC721Orders calldata order, uint8 signatureType) external view returns (BSERC721OrdersCheckResult memory r) {
uint256 nonce;
(r.basicCollections, nonce) = _checkBasicCollections(order, true);
r.collections = _checkCollections(order, nonce, true);
r.hashNonce = _getHashNonce(order.maker);
r.orderHash = _getOrderHash(order, r.hashNonce);
r.validSignature = _validateSignature(order, r.orderHash, signatureType);
return r;
}
function checkBSERC721OrdersV3(BSERC721Orders calldata order, uint8 signatureType, bool isGetOwnerOf) external view returns (BSERC721OrdersCheckResult memory r) {
uint256 nonce;
(r.basicCollections, nonce) = _checkBasicCollections(order, isGetOwnerOf);
r.collections = _checkCollections(order, nonce, isGetOwnerOf);
r.hashNonce = _getHashNonce(order.maker);
r.orderHash = _getOrderHash(order, r.hashNonce);
r.validSignature = _validateSignature(order, r.orderHash, signatureType);
return r;
}
function _checkBasicCollections(BSERC721Orders calldata order, bool isGetOwnerOf) internal view returns (BSCollectionCheckResult[] memory basicCollections, uint256 nonce) {
nonce = order.startNonce;
basicCollections = new BSCollectionCheckResult[](order.basicCollections.length);
for (uint256 i; i < basicCollections.length; ) {
address nftAddress = order.basicCollections[i].nftAddress;
basicCollections[i].isApprovedForAll = _isApprovedForAll(nftAddress, true, order.maker, ELEMENT) > 0;
BSOrderItemCheckResult[] memory items = new BSOrderItemCheckResult[](order.basicCollections[i].items.length);
basicCollections[i].items = items;
for (uint256 j; j < items.length; ) {
items[j].isNonceValid = _isNonceValid(order.maker, nonce);
unchecked { ++nonce; }
items[j].isERC20AmountValid = order.basicCollections[i].items[j].erc20TokenAmount <= MASK_96;
uint256 nftId = order.basicCollections[i].items[j].nftId;
if (nftId <= MASK_160) {
if (isGetOwnerOf) {
items[j].ownerOfNftId = _erc721OwnerOf(nftAddress, nftId);
items[j].approvedAccountOfNftId = _erc721GetApproved(nftAddress, nftId);
}
} else {
items[j].ownerOfNftId = address(0);
items[j].approvedAccountOfNftId = address(0);
}
unchecked { ++j; }
}
unchecked { ++i; }
}
}
function _checkCollections(BSERC721Orders calldata order, uint256 nonce, bool isGetOwnerOf) internal view returns (BSCollectionCheckResult[] memory collections) {
collections = new BSCollectionCheckResult[](order.collections.length);
for (uint256 i; i < collections.length; ) {
address nftAddress = order.collections[i].nftAddress;
collections[i].isApprovedForAll = _isApprovedForAll(nftAddress, true, order.maker, ELEMENT) > 0;
BSOrderItemCheckResult[] memory items = new BSOrderItemCheckResult[](order.collections[i].items.length);
collections[i].items = items;
for (uint256 j; j < items.length; ) {
items[j].isNonceValid = _isNonceValid(order.maker, nonce);
unchecked { ++nonce; }
items[j].isERC20AmountValid = order.collections[i].items[j].erc20TokenAmount <= MASK_224;
uint256 nftId = order.collections[i].items[j].nftId;
if (isGetOwnerOf) {
items[j].ownerOfNftId = _erc721OwnerOf(nftAddress, nftId);
items[j].approvedAccountOfNftId = _erc721GetApproved(nftAddress, nftId);
}
unchecked { ++j; }
}
unchecked { ++i; }
}
}
function _validateSignature(
BSERC721Orders calldata order,
bytes32 hash,
uint8 signatureType
) internal view returns (bool) {
address maker = order.maker;
if (maker == address(0)) {
return false;
}
uint8 v = order.v;
bytes32 r = order.r;
bytes32 s = order.s;
if (signatureType == 0) {
return order.maker == ecrecover(hash, v, r, s);
} else if (signatureType == 3) {
return isValidSignature1271(order.maker, hash, v, r, s);
} else if (signatureType == 5) {
uint256 personalSignState = _getPersonalSignState();
if ((personalSignState & 0x1) == 0) {
return false;
}
bytes32 validateHash = toEthereumPersonalSignHash(hash);
return isValidSignature1271(order.maker, validateHash, v, r, s);
} else if (signatureType == 7) {
uint256 personalSignState = _getPersonalSignState();
if ((personalSignState & 0x2) == 0) {
return false;
}
bytes32 validateHash = toBitcoinPersonalSignHash(hash);
return isValidSignature1271(order.maker, validateHash, v, r, s);
} else if (signatureType == 9) {
uint256 personalSignState = _getPersonalSignState();
if ((personalSignState & 0x4) == 0) {
return false;
}
bytes32 validateHash = toBitcoinPersonalSignHash(hash);
return isValidSignature173(order.maker, validateHash, v, r, s);
} else {
return false;
}
}
function _getPersonalSignState() internal view returns (uint256 state) {
address element = ELEMENT;
assembly {
let ptr := mload(0x40) // free memory pointer
// selector for getPersonalSignState
mstore(ptr, 0x3cdad7ce)
let success := staticcall(gas(), element, ptr, 0x4, ptr, 32)
if success {
if eq(returndatasize(), 32) {
state := mload(ptr)
}
}
}
}
function _isNonceValid(address account, uint256 nonce) internal view returns (bool filled) {
uint256 bitVector = IElement(ELEMENT).getERC721OrderStatusBitVector(account, uint248(nonce >> 8));
uint256 flag = 1 << (nonce & 0xff);
return (bitVector & flag) == 0;
}
function _getHashNonce(address maker) internal view returns (uint256) {
return IElement(ELEMENT).getHashNonce(maker);
}
// keccak256(""));
bytes32 internal constant _EMPTY_ARRAY_KECCAK256 = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
// keccak256(abi.encodePacked(
// "BatchSignedERC721Orders(address maker,uint256 listingTime,uint256 expiryTime,uint256 startNonce,address erc20Token,address platformFeeRecipient,BasicCollection[] basicCollections,Collection[] collections,uint256 hashNonce)",
// "BasicCollection(address nftAddress,bytes32 fee,bytes32[] items)",
// "Collection(address nftAddress,bytes32 fee,OrderItem[] items)",
// "OrderItem(uint256 erc20TokenAmount,uint256 nftId)"
// ))
bytes32 internal constant _BATCH_SIGNED_ERC721_ORDERS_TYPE_HASH = 0x2d8cbbbc696e7292c3b5beb38e1363d34ff11beb8c3456c14cb938854597b9ed;
// keccak256("BasicCollection(address nftAddress,bytes32 fee,bytes32[] items)")
bytes32 internal constant _BASIC_COLLECTION_TYPE_HASH = 0x12ad29288fd70022f26997a9958d9eceb6e840ceaa79b72ea5945ba87e4d33b0;
// keccak256(abi.encodePacked(
// "Collection(address nftAddress,bytes32 fee,OrderItem[] items)",
// "OrderItem(uint256 erc20TokenAmount,uint256 nftId)"
// ))
bytes32 internal constant _COLLECTION_TYPE_HASH = 0xb9f488d48cec782be9ecdb74330c9c6a33c236a8022d8a91a4e4df4e81b51620;
// keccak256("OrderItem(uint256 erc20TokenAmount,uint256 nftId)")
bytes32 internal constant _ORDER_ITEM_TYPE_HASH = 0x5f93394997caa49a9382d44a75e3ce6a460f32b39870464866ac994f8be97afe;
function _getOrderHash(BSERC721Orders calldata order, uint256 hashNonce) internal view returns (bytes32) {
bytes32 basicCollectionsHash = _getBasicCollectionsHash(order.basicCollections);
bytes32 collectionsHash = _getCollectionsHash(order.collections);
address paymentToken = order.paymentToken;
if (paymentToken == address(0)) {
paymentToken = NATIVE_TOKEN_ADDRESS;
}
bytes32 structHash = keccak256(abi.encode(
_BATCH_SIGNED_ERC721_ORDERS_TYPE_HASH,
order.maker,
order.listingTime,
order.expirationTime,
order.startNonce,
paymentToken,
order.platformFeeRecipient,
basicCollectionsHash,
collectionsHash,
hashNonce
));
return keccak256(abi.encodePacked(hex"1901", EIP712_DOMAIN_SEPARATOR, structHash));
}
function _getBasicCollectionsHash(BSCollection[] calldata basicCollections) internal pure returns (bytes32 hash) {
if (basicCollections.length == 0) {
hash = _EMPTY_ARRAY_KECCAK256;
} else {
uint256 num = basicCollections.length;
bytes32[] memory structHashArray = new bytes32[](num);
for (uint256 i = 0; i < num; ) {
structHashArray[i] = _getBasicCollectionHash(basicCollections[i]);
unchecked { i++; }
}
assembly {
hash := keccak256(add(structHashArray, 0x20), mul(num, 0x20))
}
}
}
function _getBasicCollectionHash(BSCollection calldata basicCollection) internal pure returns (bytes32) {
bytes32 itemsHash;
if (basicCollection.items.length == 0) {
itemsHash = _EMPTY_ARRAY_KECCAK256;
} else {
uint256 num = basicCollection.items.length;
uint256[] memory structHashArray = new uint256[](num);
for (uint256 i = 0; i < num; ) {
uint256 erc20TokenAmount = basicCollection.items[i].erc20TokenAmount;
uint256 nftId = basicCollection.items[i].nftId;
if (erc20TokenAmount > MASK_96 || nftId > MASK_160) {
structHashArray[i] = 0;
} else {
structHashArray[i] = (erc20TokenAmount << 160) | nftId;
}
unchecked { i++; }
}
assembly {
itemsHash := keccak256(add(structHashArray, 0x20), mul(num, 0x20))
}
}
uint256 fee = (basicCollection.platformFee << 176) | (basicCollection.royaltyFee << 160) | uint256(uint160(basicCollection.royaltyFeeRecipient));
return keccak256(abi.encode(
_BASIC_COLLECTION_TYPE_HASH,
basicCollection.nftAddress,
fee,
itemsHash
));
}
function _getCollectionsHash(BSCollection[] calldata collections) internal pure returns (bytes32 hash) {
if (collections.length == 0) {
hash = _EMPTY_ARRAY_KECCAK256;
} else {
uint256 num = collections.length;
bytes32[] memory structHashArray = new bytes32[](num);
for (uint256 i = 0; i < num; ) {
structHashArray[i] = _getCollectionHash(collections[i]);
unchecked { i++; }
}
assembly {
hash := keccak256(add(structHashArray, 0x20), mul(num, 0x20))
}
}
}
function _getCollectionHash(BSCollection calldata collection) internal pure returns (bytes32) {
bytes32 itemsHash;
if (collection.items.length == 0) {
itemsHash = _EMPTY_ARRAY_KECCAK256;
} else {
uint256 num = collection.items.length;
bytes32[] memory structHashArray = new bytes32[](num);
for (uint256 i = 0; i < num; ) {
uint256 erc20TokenAmount = collection.items[i].erc20TokenAmount;
uint256 nftId = collection.items[i].nftId;
if (erc20TokenAmount > MASK_224) {
structHashArray[i] = 0;
} else {
structHashArray[i] = keccak256(abi.encode(_ORDER_ITEM_TYPE_HASH, erc20TokenAmount, nftId));
}
unchecked { i++; }
}
assembly {
itemsHash := keccak256(add(structHashArray, 0x20), mul(num, 0x20))
}
}
uint256 fee = (collection.platformFee << 176) | (collection.royaltyFee << 160) | uint256(uint160(collection.royaltyFeeRecipient));
return keccak256(abi.encode(
_COLLECTION_TYPE_HASH,
collection.nftAddress,
fee,
itemsHash
));
}
bytes16 private constant HEX_DIGITS = "0123456789abcdef";
function bytes32ToHexBuffer(bytes32 data) internal pure returns(bytes memory buffer) {
uint256 localValue = uint256(data);
buffer = new bytes(66);
buffer[0] = "0";
buffer[1] = "x";
unchecked {
for (uint256 i = 65; i > 1; --i) {
buffer[i] = HEX_DIGITS[localValue & 0xf];
localValue >>= 4;
}
}
return buffer;
}
function toEthereumPersonalSignHash(bytes32 hash) internal pure returns(bytes32) {
return keccak256(
bytes.concat(
"\x19Ethereum Signed Message:\n101Element.market listing/offer hash:\n",
bytes32ToHexBuffer(hash)
)
);
}
function toBitcoinPersonalSignHash(bytes32 hash) internal pure returns(bytes32) {
bytes32 tempHash = sha256(
bytes.concat(
"\x18Bitcoin Signed Message:\n\x65Element.market listing/offer hash:\n",
bytes32ToHexBuffer(hash)
)
);
// Convert bytes32 to bytes.
bytes memory buffer = new bytes(32);
assembly {
mstore(add(buffer, 32), tempHash)
}
return sha256(buffer);
}
function isValidSignature1271(
address aa,
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal view returns(bool) {
bool isValid;
assembly {
if extcodesize(aa) {
let ptr := mload(0x40) // free memory pointer
// selector for `isValidSignature(bytes32,bytes)`
mstore(ptr, 0x1626ba7e)
mstore(add(ptr, 0x20), hash)
mstore(add(ptr, 0x40), 0x40)
mstore(add(ptr, 0x60), 0x41)
mstore(add(ptr, 0x80), r)
mstore(add(ptr, 0xa0), s)
mstore(add(ptr, 0xc0), shl(248, v))
if staticcall(gas(), aa, add(ptr, 0x1c), 0xa5, ptr, 0x20) {
if eq(mload(ptr), 0x1626ba7e00000000000000000000000000000000000000000000000000000000) {
isValid := 1
}
}
}
}
return isValid;
}
uint256 constant private ADDRESS_LIMIT = 1 << 160;
function isValidSignature173(
address aa,
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal view returns(bool) {
address owner;
assembly {
if extcodesize(aa) {
let ptr := mload(0x40) // free memory pointer
// selector for `owner()`
mstore(ptr, 0x8da5cb5b)
if staticcall(gas(), aa, add(ptr, 0x1c), 0x4, ptr, 0x20) {
if lt(mload(ptr), ADDRESS_LIMIT) {
owner := mload(ptr)
}
}
}
}
return owner != address(0) && owner == ecrecover(hash, v, r, s);
}
}/// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;
interface IBatchSignedERC721OrdersCheckerFeature {
struct BSOrderItem {
uint256 erc20TokenAmount;
uint256 nftId;
}
struct BSCollection {
address nftAddress;
uint256 platformFee;
uint256 royaltyFee;
address royaltyFeeRecipient;
BSOrderItem[] items;
}
struct BSERC721Orders {
address maker;
uint256 listingTime;
uint256 expirationTime;
uint256 startNonce;
address paymentToken;
address platformFeeRecipient;
BSCollection[] basicCollections;
BSCollection[] collections;
uint8 v;
bytes32 r;
bytes32 s;
}
struct BSOrderItemCheckResult {
bool isNonceValid;
bool isERC20AmountValid;
address ownerOfNftId;
address approvedAccountOfNftId;
}
struct BSCollectionCheckResult {
bool isApprovedForAll;
BSOrderItemCheckResult[] items;
}
struct BSERC721OrdersCheckResult {
bytes32 orderHash;
uint256 hashNonce;
bool validSignature;
BSCollectionCheckResult[] basicCollections;
BSCollectionCheckResult[] collections;
}
function checkBSERC721Orders(BSERC721Orders calldata order) external view returns (BSERC721OrdersCheckResult memory r);
function checkBSERC721OrdersV2(BSERC721Orders calldata order, uint8 signatureType) external view returns (BSERC721OrdersCheckResult memory r);
function checkBSERC721OrdersV3(BSERC721Orders calldata order, uint8 signatureType, bool isGetOwnerOf) external view returns (BSERC721OrdersCheckResult memory r);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;
abstract contract LibAssetHelper {
address internal constant NATIVE_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
uint256 internal constant ERC404_APPROVAL = 1 << 126;
function _isApprovedForAll(
address token,
bool isERC721,
address owner,
address operator
) internal view returns(uint256 approval) {
(approval, ) = _isApprovedForAllV2(token, isERC721, owner, operator);
}
function _isApprovedForAllV2(
address token,
bool isERC721,
address owner,
address operator
) internal view returns(uint256 approval, bool isERC404) {
if (token == address(0) || token == NATIVE_TOKEN_ADDRESS) {
return (0, false);
}
bool isApprovedForAll;
assembly {
let ptr := mload(0x40) // free memory pointer
// selector for `isApprovedForAll(address,address)`
mstore(ptr, 0xe985e9c500000000000000000000000000000000000000000000000000000000)
mstore(add(ptr, 0x4), owner)
mstore(add(ptr, 0x24), operator)
if staticcall(gas(), token, ptr, 0x44, ptr, 0x20) {
if gt(mload(ptr), 0) {
isApprovedForAll := 1
}
}
}
if (isApprovedForAll) {
return (1, false);
}
// if (isERC721) {
// if (_erc20Decimals(token) == 0) {
// return (0, false);
// }
// (uint256 allowance, bool success) = _erc20AllowanceV2(token, owner, operator);
// approval = allowance > ERC404_APPROVAL ? 1 : 0;
// isERC404 = success;
// return (approval, isERC404);
// } else {
// return (0, false);
// }
return (0, false);
}
function _erc721OwnerOf(
address token, uint256 tokenId
) internal view returns (address owner) {
assembly {
let ptr := mload(0x40) // free memory pointer
// selector for `ownerOf(uint256)`
mstore(ptr, 0x6352211e00000000000000000000000000000000000000000000000000000000)
mstore(add(ptr, 0x4), tokenId)
if staticcall(gas(), token, ptr, 0x24, ptr, 0x20) {
if lt(mload(ptr), shl(160, 1)) {
owner := mload(ptr)
}
}
}
return owner;
}
function _erc721GetApproved(
address token, uint256 tokenId
) internal view returns (address operator) {
assembly {
let ptr := mload(0x40) // free memory pointer
// selector for `getApproved(uint256)`
mstore(ptr, 0x081812fc00000000000000000000000000000000000000000000000000000000)
mstore(add(ptr, 0x4), tokenId)
if staticcall(gas(), token, ptr, 0x24, ptr, 0x20) {
if lt(mload(ptr), shl(160, 1)) {
operator := mload(ptr)
}
}
}
return operator;
}
function _erc1155BalanceOf(
address token,
address account,
uint256 tokenId
) internal view returns (uint256 _balance) {
assembly {
let ptr := mload(0x40) // free memory pointer
// selector for `balanceOf(address,uint256)`
mstore(ptr, 0x00fdd58e00000000000000000000000000000000000000000000000000000000)
mstore(add(ptr, 0x4), account)
mstore(add(ptr, 0x24), tokenId)
if staticcall(gas(), token, ptr, 0x44, ptr, 0x20) {
_balance := mload(ptr)
}
}
return _balance;
}
function _erc20BalanceOf(
address token, address account
) internal view returns (uint256 _balance) {
if (token == address(0) || token == NATIVE_TOKEN_ADDRESS) {
return account.balance;
}
assembly {
let ptr := mload(0x40) // free memory pointer
// selector for `balanceOf(address)`
mstore(ptr, 0x70a0823100000000000000000000000000000000000000000000000000000000)
mstore(add(ptr, 0x4), account)
if staticcall(gas(), token, ptr, 0x24, ptr, 0x20) {
_balance := mload(ptr)
}
}
return _balance;
}
function _erc20Allowance(
address token,
address owner,
address spender
) internal view returns (uint256 allowance) {
(allowance, ) = _erc20AllowanceV2(token, owner, spender);
}
function _erc20AllowanceV2(
address token,
address owner,
address spender
) internal view returns (uint256 allowance, bool callSuccess) {
if (token == address(0) || token == NATIVE_TOKEN_ADDRESS) {
return (type(uint256).max, false);
}
assembly {
let ptr := mload(0x40) // free memory pointer
// selector for `allowance(address,address)`
mstore(ptr, 0xdd62ed3e00000000000000000000000000000000000000000000000000000000)
mstore(add(ptr, 0x4), owner)
mstore(add(ptr, 0x24), spender)
if staticcall(gas(), token, ptr, 0x44, ptr, 0x20) {
allowance := mload(ptr)
callSuccess := 1
}
}
return (allowance, callSuccess);
}
function _erc20Decimals(address token) internal view returns (uint8 decimals) {
if (token == address(0) || token == NATIVE_TOKEN_ADDRESS) {
return 18;
}
assembly {
let ptr := mload(0x40) // free memory pointer
// selector for `decimals()`
mstore(ptr, 0x313ce56700000000000000000000000000000000000000000000000000000000)
if staticcall(gas(), token, ptr, 0x4, ptr, 0x20) {
if lt(mload(ptr), 48) {
decimals := mload(ptr)
}
}
}
return decimals;
}
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"element","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EIP712_DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ELEMENT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"maker","type":"address"},{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"internalType":"uint256","name":"startNonce","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"address","name":"platformFeeRecipient","type":"address"},{"components":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"platformFee","type":"uint256"},{"internalType":"uint256","name":"royaltyFee","type":"uint256"},{"internalType":"address","name":"royaltyFeeRecipient","type":"address"},{"components":[{"internalType":"uint256","name":"erc20TokenAmount","type":"uint256"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItem[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollection[]","name":"basicCollections","type":"tuple[]"},{"components":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"platformFee","type":"uint256"},{"internalType":"uint256","name":"royaltyFee","type":"uint256"},{"internalType":"address","name":"royaltyFeeRecipient","type":"address"},{"components":[{"internalType":"uint256","name":"erc20TokenAmount","type":"uint256"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItem[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollection[]","name":"collections","type":"tuple[]"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSERC721Orders","name":"order","type":"tuple"}],"name":"checkBSERC721Orders","outputs":[{"components":[{"internalType":"bytes32","name":"orderHash","type":"bytes32"},{"internalType":"uint256","name":"hashNonce","type":"uint256"},{"internalType":"bool","name":"validSignature","type":"bool"},{"components":[{"internalType":"bool","name":"isApprovedForAll","type":"bool"},{"components":[{"internalType":"bool","name":"isNonceValid","type":"bool"},{"internalType":"bool","name":"isERC20AmountValid","type":"bool"},{"internalType":"address","name":"ownerOfNftId","type":"address"},{"internalType":"address","name":"approvedAccountOfNftId","type":"address"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItemCheckResult[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollectionCheckResult[]","name":"basicCollections","type":"tuple[]"},{"components":[{"internalType":"bool","name":"isApprovedForAll","type":"bool"},{"components":[{"internalType":"bool","name":"isNonceValid","type":"bool"},{"internalType":"bool","name":"isERC20AmountValid","type":"bool"},{"internalType":"address","name":"ownerOfNftId","type":"address"},{"internalType":"address","name":"approvedAccountOfNftId","type":"address"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItemCheckResult[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollectionCheckResult[]","name":"collections","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSERC721OrdersCheckResult","name":"r","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"maker","type":"address"},{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"internalType":"uint256","name":"startNonce","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"address","name":"platformFeeRecipient","type":"address"},{"components":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"platformFee","type":"uint256"},{"internalType":"uint256","name":"royaltyFee","type":"uint256"},{"internalType":"address","name":"royaltyFeeRecipient","type":"address"},{"components":[{"internalType":"uint256","name":"erc20TokenAmount","type":"uint256"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItem[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollection[]","name":"basicCollections","type":"tuple[]"},{"components":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"platformFee","type":"uint256"},{"internalType":"uint256","name":"royaltyFee","type":"uint256"},{"internalType":"address","name":"royaltyFeeRecipient","type":"address"},{"components":[{"internalType":"uint256","name":"erc20TokenAmount","type":"uint256"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItem[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollection[]","name":"collections","type":"tuple[]"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSERC721Orders","name":"order","type":"tuple"},{"internalType":"uint8","name":"signatureType","type":"uint8"}],"name":"checkBSERC721OrdersV2","outputs":[{"components":[{"internalType":"bytes32","name":"orderHash","type":"bytes32"},{"internalType":"uint256","name":"hashNonce","type":"uint256"},{"internalType":"bool","name":"validSignature","type":"bool"},{"components":[{"internalType":"bool","name":"isApprovedForAll","type":"bool"},{"components":[{"internalType":"bool","name":"isNonceValid","type":"bool"},{"internalType":"bool","name":"isERC20AmountValid","type":"bool"},{"internalType":"address","name":"ownerOfNftId","type":"address"},{"internalType":"address","name":"approvedAccountOfNftId","type":"address"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItemCheckResult[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollectionCheckResult[]","name":"basicCollections","type":"tuple[]"},{"components":[{"internalType":"bool","name":"isApprovedForAll","type":"bool"},{"components":[{"internalType":"bool","name":"isNonceValid","type":"bool"},{"internalType":"bool","name":"isERC20AmountValid","type":"bool"},{"internalType":"address","name":"ownerOfNftId","type":"address"},{"internalType":"address","name":"approvedAccountOfNftId","type":"address"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItemCheckResult[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollectionCheckResult[]","name":"collections","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSERC721OrdersCheckResult","name":"r","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"maker","type":"address"},{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"internalType":"uint256","name":"startNonce","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"address","name":"platformFeeRecipient","type":"address"},{"components":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"platformFee","type":"uint256"},{"internalType":"uint256","name":"royaltyFee","type":"uint256"},{"internalType":"address","name":"royaltyFeeRecipient","type":"address"},{"components":[{"internalType":"uint256","name":"erc20TokenAmount","type":"uint256"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItem[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollection[]","name":"basicCollections","type":"tuple[]"},{"components":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"platformFee","type":"uint256"},{"internalType":"uint256","name":"royaltyFee","type":"uint256"},{"internalType":"address","name":"royaltyFeeRecipient","type":"address"},{"components":[{"internalType":"uint256","name":"erc20TokenAmount","type":"uint256"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItem[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollection[]","name":"collections","type":"tuple[]"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSERC721Orders","name":"order","type":"tuple"},{"internalType":"uint8","name":"signatureType","type":"uint8"},{"internalType":"bool","name":"isGetOwnerOf","type":"bool"}],"name":"checkBSERC721OrdersV3","outputs":[{"components":[{"internalType":"bytes32","name":"orderHash","type":"bytes32"},{"internalType":"uint256","name":"hashNonce","type":"uint256"},{"internalType":"bool","name":"validSignature","type":"bool"},{"components":[{"internalType":"bool","name":"isApprovedForAll","type":"bool"},{"components":[{"internalType":"bool","name":"isNonceValid","type":"bool"},{"internalType":"bool","name":"isERC20AmountValid","type":"bool"},{"internalType":"address","name":"ownerOfNftId","type":"address"},{"internalType":"address","name":"approvedAccountOfNftId","type":"address"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItemCheckResult[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollectionCheckResult[]","name":"basicCollections","type":"tuple[]"},{"components":[{"internalType":"bool","name":"isApprovedForAll","type":"bool"},{"components":[{"internalType":"bool","name":"isNonceValid","type":"bool"},{"internalType":"bool","name":"isERC20AmountValid","type":"bool"},{"internalType":"address","name":"ownerOfNftId","type":"address"},{"internalType":"address","name":"approvedAccountOfNftId","type":"address"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItemCheckResult[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollectionCheckResult[]","name":"collections","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSERC721OrdersCheckResult","name":"r","type":"tuple"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60c06040523480156200001157600080fd5b5060405162002f1638038062002f16833981810160405281019062000037919062000174565b8073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f27b14c20196091d9cd90ca9c473d3ad1523b00ddf487a9b7452a8a119a16b98c7f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c4684604051602001620000e6959493929190620001ed565b6040516020818303038152906040528051906020012060808181525050506200024a565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200013c826200010f565b9050919050565b6200014e816200012f565b81146200015a57600080fd5b50565b6000815190506200016e8162000143565b92915050565b6000602082840312156200018d576200018c6200010a565b5b60006200019d848285016200015d565b91505092915050565b6000819050919050565b620001bb81620001a6565b82525050565b6000819050919050565b620001d681620001c1565b82525050565b620001e7816200012f565b82525050565b600060a082019050620002046000830188620001b0565b620002136020830187620001b0565b620002226040830186620001b0565b620002316060830185620001cb565b620002406080830184620001dc565b9695505050505050565b60805160a051612c7c6200029a600039600081816101be01528181610412015281816108ec01528181610c380152818161111f015261152001526000818161030c0152610e050152612c7c6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063338a84c01461005c5780638bea6a751461008c5780638cfa4e07146100aa578063d078beb5146100da578063dab400f31461010a575b600080fd5b610076600480360381019061007191906120ea565b610128565b604051610083919061245b565b60405180910390f35b6100946101bc565b6040516100a1919061248c565b60405180910390f35b6100c460048036038101906100bf91906124a7565b6101e0565b6040516100d1919061245b565b60405180910390f35b6100f460048036038101906100ef9190612503565b610275565b604051610101919061245b565b60405180910390f35b61011261030a565b60405161011f919061255b565b60405180910390f35b610130611fa2565b600061013c858461032e565b836060018193508290525050610153858285610811565b826080018190525061017685600001602081019061017191906125a2565b610c34565b82602001818152505061018d858360200151610cd7565b8260000181815250506101a585836000015186610e58565b826040019015159081151581525050509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6101e8611fa2565b60006101f584600161032e565b83606001819350829052505061020d84826001610811565b826080018190525061023084600001602081019061022b91906125a2565b610c34565b826020018181525050610247848360200151610cd7565b82600001818152505061025f84836000015185610e58565b8260400190151590811515815250505092915050565b61027d611fa2565b600061028a83600161032e565b8360600181935082905250506102a283826001610811565b82608001819052506102c58360000160208101906102c091906125a2565b610c34565b8260200181815250506102dc838360200151610cd7565b8260000181815250506102f58383600001516000610e58565b82604001901515908115158152505050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060600083606001359050838060c0019061034991906125de565b905067ffffffffffffffff81111561036457610363612641565b5b60405190808252806020026020018201604052801561039d57816020015b61038a611fd6565b8152602001906001900390816103825790505b50915060005b8251811015610809576000858060c001906103be91906125de565b838181106103cf576103ce612670565b5b90506020028101906103e1919061269f565b60000160208101906103f391906125a2565b9050600061043682600189600001602081019061041091906125a2565b7f00000000000000000000000000000000000000000000000000000000000000006110ff565b1184838151811061044a57610449612670565b5b602002602001015160000190151590811515815250506000868060c0019061047291906125de565b8481811061048357610482612670565b5b9050602002810190610495919061269f565b80608001906104a491906126c7565b905067ffffffffffffffff8111156104bf576104be612641565b5b6040519080825280602002602001820160405280156104f857816020015b6104e5611ff2565b8152602001906001900390816104dd5790505b5090508085848151811061050f5761050e612670565b5b60200260200101516020018190525060005b81518110156107fb5761054688600001602081019061054091906125a2565b8661111a565b82828151811061055957610558612670565b5b602002602001015160000190151590811515815250508460010194506bffffffffffffffffffffffff888060c0019061059291906125de565b868181106105a3576105a2612670565b5b90506020028101906105b5919061269f565b80608001906105c491906126c7565b838181106105d5576105d4612670565b5b9050604002016000013511158282815181106105f4576105f3612670565b5b602002602001015160200190151590811515815250506000888060c0019061061c91906125de565b8681811061062d5761062c612670565b5b905060200281019061063f919061269f565b806080019061064e91906126c7565b8381811061065f5761065e612670565b5b90506040020160200135905073ffffffffffffffffffffffffffffffffffffffff81116107485787156107435761069684826111db565b8383815181106106a9576106a8612670565b5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506106f18482611231565b83838151811061070457610703612670565b5b60200260200101516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b6107ef565b600083838151811061075d5761075c612670565b5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060008383815181106107b0576107af612670565b5b60200260200101516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b81600101915050610521565b5082600101925050506103a3565b509250929050565b6060838060e0019061082391906125de565b905067ffffffffffffffff81111561083e5761083d612641565b5b60405190808252806020026020018201604052801561087757816020015b610864611fd6565b81526020019060019003908161085c5790505b50905060005b8151811015610c2c576000858060e0019061089891906125de565b838181106108a9576108a8612670565b5b90506020028101906108bb919061269f565b60000160208101906108cd91906125a2565b905060006109108260018960000160208101906108ea91906125a2565b7f00000000000000000000000000000000000000000000000000000000000000006110ff565b1183838151811061092457610923612670565b5b602002602001015160000190151590811515815250506000868060e0019061094c91906125de565b8481811061095d5761095c612670565b5b905060200281019061096f919061269f565b806080019061097e91906126c7565b905067ffffffffffffffff81111561099957610998612641565b5b6040519080825280602002602001820160405280156109d257816020015b6109bf611ff2565b8152602001906001900390816109b75790505b509050808484815181106109e9576109e8612670565b5b60200260200101516020018190525060005b8151811015610c1e57610a20886000016020810190610a1a91906125a2565b8861111a565b828281518110610a3357610a32612670565b5b602002602001015160000190151590811515815250508660010196507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff888060e00190610a7c91906125de565b86818110610a8d57610a8c612670565b5b9050602002810190610a9f919061269f565b8060800190610aae91906126c7565b83818110610abf57610abe612670565b5b905060400201600001351115828281518110610ade57610add612670565b5b602002602001015160200190151590811515815250506000888060e00190610b0691906125de565b86818110610b1757610b16612670565b5b9050602002810190610b29919061269f565b8060800190610b3891906126c7565b83818110610b4957610b48612670565b5b9050604002016020013590508615610c1257610b6584826111db565b838381518110610b7857610b77612670565b5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610bc08482611231565b838381518110610bd357610bd2612670565b5b60200260200101516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b816001019150506109fb565b50826001019250505061087d565b509392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635e725186836040518263ffffffff1660e01b8152600401610c8f919061248c565b602060405180830381865afa158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190612756565b9050919050565b600080610cf2848060c00190610ced91906125de565b611287565b90506000610d0e858060e00190610d0991906125de565b61138c565b90506000856080016020810190610d2591906125a2565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d735773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90505b60007f2d8cbbbc696e7292c3b5beb38e1363d34ff11beb8c3456c14cb938854597b9ed60001b876000016020810190610dac91906125a2565b886020013589604001358a60600135868c60a0016020810190610dcf91906125a2565b8a8a8e604051602001610deb9a99989796959493929190612792565b6040516020818303038152906040528051906020012090507f000000000000000000000000000000000000000000000000000000000000000081604051602001610e369291906128a6565b6040516020818303038152906040528051906020012094505050505092915050565b600080846000016020810190610e6e91906125a2565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610eae5760009150506110f8565b600085610100016020810190610ec491906128dd565b9050600086610120013590506000876101400135905060008660ff1603610f7f5760018784848460405160008152602001604052604051610f089493929190612919565b6020604051602081039080840390855afa158015610f2a573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16886000016020810190610f5d91906125a2565b73ffffffffffffffffffffffffffffffffffffffff16149450505050506110f8565b60038660ff1603610fb457610fa9886000016020810190610fa091906125a2565b88858585611491565b9450505050506110f8565b60058660ff160361101d576000610fc961151b565b905060006001821603610fe4576000955050505050506110f8565b6000610fef8961156e565b90506110108a600001602081019061100791906125a2565b82878787611491565b96505050505050506110f8565b60078660ff160361108657600061103261151b565b90506000600282160361104d576000955050505050506110f8565b6000611058896115a6565b90506110798a600001602081019061107091906125a2565b82878787611491565b96505050505050506110f8565b60098660ff16036110ef57600061109b61151b565b9050600060048216036110b6576000955050505050506110f8565b60006110c1896115a6565b90506110e28a60000160208101906110d991906125a2565b828787876116d3565b96505050505050506110f8565b60009450505050505b9392505050565b600061110d858585856117e0565b5080915050949350505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663030b273085600886901c6040518363ffffffff1660e01b815260040161117c929190612998565b602060405180830381865afa158015611199573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bd9190612756565b9050600060ff84166001901b90506000818316149250505092915050565b60006040517f6352211e000000000000000000000000000000000000000000000000000000008152826004820152602081602483875afa1561122a57600160a01b8151101561122957805191505b5b5092915050565b60006040517f081812fc000000000000000000000000000000000000000000000000000000008152826004820152602081602483875afa1561128057600160a01b8151101561127f57805191505b5b5092915050565b60008083839050036112be577fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050611386565b600083839050905060008167ffffffffffffffff8111156112e2576112e1612641565b5b6040519080825280602002602001820160405280156113105781602001602082028036833780820191505090505b50905060005b828110156113775761134b86868381811061133457611333612670565b5b9050602002810190611346919061269f565b6118e7565b82828151811061135e5761135d612670565b5b6020026020010181815250508080600101915050611316565b50602082026020820120925050505b92915050565b60008083839050036113c3577fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b905061148b565b600083839050905060008167ffffffffffffffff8111156113e7576113e6612641565b5b6040519080825280602002602001820160405280156114155781602001602082028036833780820191505090505b50905060005b8281101561147c5761145086868381811061143957611438612670565b5b905060200281019061144b919061269f565b611b43565b82828151811061146357611462612670565b5b602002602001018181525050808060010191505061141b565b50602082026020820120925050505b92915050565b600080863b1561150e57604051631626ba7e8152866020820152604080820152604160608201528460808201528360a08201528560f81b60c082015260208160a5601c84018b5afa1561150c577f1626ba7e0000000000000000000000000000000000000000000000000000000081510361150b57600191505b5b505b8091505095945050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000009050604051633cdad7ce8152602081600483855afa80156115685760203d0361156757815193505b5b50505090565b600061157982611dda565b6040516020016115899190612aa4565b604051602081830303815290604052805190602001209050919050565b60008060026115b484611dda565b6040516020016115c49190612b38565b6040516020818303038152906040526040516115e09190612b5a565b602060405180830381855afa1580156115fd573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906116209190612b9d565b90506000602067ffffffffffffffff81111561163f5761163e612641565b5b6040519080825280601f01601f1916602001820160405280156116715781602001600182028036833780820191505090505b50905081602082015260028160405161168a9190612b5a565b602060405180830381855afa1580156116a7573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906116ca9190612b9d565b92505050919050565b600080863b1561171e57604051638da5cb5b81526020816004601c84018b5afa1561171c57740100000000000000000000000000000000000000008151101561171b57805191505b5b505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156117d45750600186868686604051600081526020016040526040516117799493929190612919565b6020604051602081039080840390855afa15801561179b573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b91505095945050505050565b600080600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148061185d575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b1561186e57600080915091506118de565b60006040517fe985e9c50000000000000000000000000000000000000000000000000000000081528560048201528460248201526020816044838b5afa156118c0576000815111156118bf57600191505b5b5080156118d5576001600092509250506118de565b60008092509250505b94509492505050565b60008060008380608001906118fc91906126c7565b90500361192e577fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050611a97565b600083806080019061194091906126c7565b9050905060008167ffffffffffffffff8111156119605761195f612641565b5b60405190808252806020026020018201604052801561198e5781602001602082028036833780820191505090505b50905060005b82811015611a885760008680608001906119ae91906126c7565b838181106119bf576119be612670565b5b90506040020160000135905060008780608001906119dd91906126c7565b848181106119ee576119ed612670565b5b9050604002016020013590506bffffffffffffffffffffffff821180611a27575073ffffffffffffffffffffffffffffffffffffffff81115b15611a52576000848481518110611a4157611a40612670565b5b602002602001018181525050611a79565b8060a083901b17848481518110611a6c57611a6b612670565b5b6020026020010181815250505b82806001019350505050611994565b50602082026020820120925050505b6000836060016020810190611aac91906125a2565b73ffffffffffffffffffffffffffffffffffffffff1660a08560400135901b60b08660200135901b171790507f12ad29288fd70022f26997a9958d9eceb6e840ceaa79b72ea5945ba87e4d33b060001b846000016020810190611b0f91906125a2565b8284604051602001611b249493929190612bca565b6040516020818303038152906040528051906020012092505050919050565b6000806000838060800190611b5891906126c7565b905003611b8a577fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050611d2e565b6000838060800190611b9c91906126c7565b9050905060008167ffffffffffffffff811115611bbc57611bbb612641565b5b604051908082528060200260200182016040528015611bea5781602001602082028036833780820191505090505b50905060005b82811015611d1f576000868060800190611c0a91906126c7565b83818110611c1b57611c1a612670565b5b9050604002016000013590506000878060800190611c3991906126c7565b84818110611c4a57611c49612670565b5b9050604002016020013590507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611ca2576000801b848481518110611c9157611c90612670565b5b602002602001018181525050611d10565b7f5f93394997caa49a9382d44a75e3ce6a460f32b39870464866ac994f8be97afe60001b8282604051602001611cda93929190612c0f565b60405160208183030381529060405280519060200120848481518110611d0357611d02612670565b5b6020026020010181815250505b82806001019350505050611bf0565b50602082026020820120925050505b6000836060016020810190611d4391906125a2565b73ffffffffffffffffffffffffffffffffffffffff1660a08560400135901b60b08660200135901b171790507fb9f488d48cec782be9ecdb74330c9c6a33c236a8022d8a91a4e4df4e81b5162060001b846000016020810190611da691906125a2565b8284604051602001611dbb9493929190612bca565b6040516020818303038152906040528051906020012092505050919050565b606060008260001c9050604267ffffffffffffffff811115611dff57611dfe612641565b5b6040519080825280601f01601f191660200182016040528015611e315781602001600182028036833780820191505090505b5091507f300000000000000000000000000000000000000000000000000000000000000082600081518110611e6957611e68612670565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000082600181518110611ecd57611ecc612670565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000604190505b6001811115611f9b577f3031323334353637383961626364656600000000000000000000000000000000600f831660108110611f4257611f41612670565b5b1a60f81b838281518110611f5957611f58612670565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600482901c915080600190039050611f03565b5050919050565b6040518060a00160405280600080191681526020016000815260200160001515815260200160608152602001606081525090565b6040518060400160405280600015158152602001606081525090565b6040518060800160405280600015158152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b600080fd5b600080fd5b600080fd5b600061016082840312156120705761206f612054565b5b81905092915050565b600060ff82169050919050565b61208f81612079565b811461209a57600080fd5b50565b6000813590506120ac81612086565b92915050565b60008115159050919050565b6120c7816120b2565b81146120d257600080fd5b50565b6000813590506120e4816120be565b92915050565b6000806000606084860312156121035761210261204a565b5b600084013567ffffffffffffffff8111156121215761212061204f565b5b61212d86828701612059565b935050602061213e8682870161209d565b925050604061214f868287016120d5565b9150509250925092565b6000819050919050565b61216c81612159565b82525050565b6000819050919050565b61218581612172565b82525050565b612194816120b2565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061221d826121f2565b9050919050565b61222d81612212565b82525050565b608082016000820151612249600085018261218b565b50602082015161225c602085018261218b565b50604082015161226f6040850182612224565b5060608201516122826060850182612224565b50505050565b60006122948383612233565b60808301905092915050565b6000602082019050919050565b60006122b8826121c6565b6122c281856121d1565b93506122cd836121e2565b8060005b838110156122fe5781516122e58882612288565b97506122f0836122a0565b9250506001810190506122d1565b5085935050505092915050565b6000604083016000830151612323600086018261218b565b506020830151848203602086015261233b82826122ad565b9150508091505092915050565b6000612354838361230b565b905092915050565b6000602082019050919050565b60006123748261219a565b61237e81856121a5565b935083602082028501612390856121b6565b8060005b858110156123cc57848403895281516123ad8582612348565b94506123b88361235c565b925060208a01995050600181019050612394565b50829750879550505050505092915050565b600060a0830160008301516123f66000860182612163565b506020830151612409602086018261217c565b50604083015161241c604086018261218b565b50606083015184820360608601526124348282612369565b9150506080830151848203608086015261244e8282612369565b9150508091505092915050565b6000602082019050818103600083015261247581846123de565b905092915050565b61248681612212565b82525050565b60006020820190506124a1600083018461247d565b92915050565b600080604083850312156124be576124bd61204a565b5b600083013567ffffffffffffffff8111156124dc576124db61204f565b5b6124e885828601612059565b92505060206124f98582860161209d565b9150509250929050565b6000602082840312156125195761251861204a565b5b600082013567ffffffffffffffff8111156125375761253661204f565b5b61254384828501612059565b91505092915050565b61255581612159565b82525050565b6000602082019050612570600083018461254c565b92915050565b61257f81612212565b811461258a57600080fd5b50565b60008135905061259c81612576565b92915050565b6000602082840312156125b8576125b761204a565b5b60006125c68482850161258d565b91505092915050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126125fb576125fa6125cf565b5b80840192508235915067ffffffffffffffff82111561261d5761261c6125d4565b5b602083019250602082023603831315612639576126386125d9565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008235600160a0038336030381126126bb576126ba6125cf565b5b80830191505092915050565b600080833560016020038436030381126126e4576126e36125cf565b5b80840192508235915067ffffffffffffffff821115612706576127056125d4565b5b602083019250604082023603831315612722576127216125d9565b5b509250929050565b61273381612172565b811461273e57600080fd5b50565b6000815190506127508161272a565b92915050565b60006020828403121561276c5761276b61204a565b5b600061277a84828501612741565b91505092915050565b61278c81612172565b82525050565b6000610140820190506127a8600083018d61254c565b6127b5602083018c61247d565b6127c2604083018b612783565b6127cf606083018a612783565b6127dc6080830189612783565b6127e960a083018861247d565b6127f660c083018761247d565b61280360e083018661254c565b61281161010083018561254c565b61281f610120830184612783565b9b9a5050505050505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061286f60028361282e565b915061287a82612839565b600282019050919050565b6000819050919050565b6128a061289b82612159565b612885565b82525050565b60006128b182612862565b91506128bd828561288f565b6020820191506128cd828461288f565b6020820191508190509392505050565b6000602082840312156128f3576128f261204a565b5b60006129018482850161209d565b91505092915050565b61291381612079565b82525050565b600060808201905061292e600083018761254c565b61293b602083018661290a565b612948604083018561254c565b612955606083018461254c565b95945050505050565b60007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6129928161295e565b82525050565b60006040820190506129ad600083018561247d565b6129ba6020830184612989565b9392505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a313031456c6560008201527f6d656e742e6d61726b6574206c697374696e672f6f6666657220686173683a0a602082015250565b6000612a286040836129c1565b9150612a33826129cc565b604082019050919050565b600081519050919050565b60005b83811015612a67578082015181840152602081019050612a4c565b60008484015250505050565b6000612a7e82612a3e565b612a8881856129c1565b9350612a98818560208601612a49565b80840191505092915050565b6000612aaf82612a1b565b9150612abb8284612a73565b915081905092915050565b7f18426974636f696e205369676e6564204d6573736167653a0a65456c656d656e60008201527f742e6d61726b6574206c697374696e672f6f6666657220686173683a0a000000602082015250565b6000612b22603d836129c1565b9150612b2d82612ac6565b603d82019050919050565b6000612b4382612b15565b9150612b4f8284612a73565b915081905092915050565b6000612b668284612a73565b915081905092915050565b612b7a81612159565b8114612b8557600080fd5b50565b600081519050612b9781612b71565b92915050565b600060208284031215612bb357612bb261204a565b5b6000612bc184828501612b88565b91505092915050565b6000608082019050612bdf600083018761254c565b612bec602083018661247d565b612bf96040830185612783565b612c06606083018461254c565b95945050505050565b6000606082019050612c24600083018661254c565b612c316020830185612783565b612c3e6040830184612783565b94935050505056fea264697066735822122061689401b1e95f1599e14e1954397d217c26657d5b5a7557e3a4c141e7076a9864736f6c634300081100330000000000000000000000000cab6977a9c70e04458b740476b498b214019641
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063338a84c01461005c5780638bea6a751461008c5780638cfa4e07146100aa578063d078beb5146100da578063dab400f31461010a575b600080fd5b610076600480360381019061007191906120ea565b610128565b604051610083919061245b565b60405180910390f35b6100946101bc565b6040516100a1919061248c565b60405180910390f35b6100c460048036038101906100bf91906124a7565b6101e0565b6040516100d1919061245b565b60405180910390f35b6100f460048036038101906100ef9190612503565b610275565b604051610101919061245b565b60405180910390f35b61011261030a565b60405161011f919061255b565b60405180910390f35b610130611fa2565b600061013c858461032e565b836060018193508290525050610153858285610811565b826080018190525061017685600001602081019061017191906125a2565b610c34565b82602001818152505061018d858360200151610cd7565b8260000181815250506101a585836000015186610e58565b826040019015159081151581525050509392505050565b7f0000000000000000000000000cab6977a9c70e04458b740476b498b21401964181565b6101e8611fa2565b60006101f584600161032e565b83606001819350829052505061020d84826001610811565b826080018190525061023084600001602081019061022b91906125a2565b610c34565b826020018181525050610247848360200151610cd7565b82600001818152505061025f84836000015185610e58565b8260400190151590811515815250505092915050565b61027d611fa2565b600061028a83600161032e565b8360600181935082905250506102a283826001610811565b82608001819052506102c58360000160208101906102c091906125a2565b610c34565b8260200181815250506102dc838360200151610cd7565b8260000181815250506102f58383600001516000610e58565b82604001901515908115158152505050919050565b7f4c311e4e8d77235d0d7a52b5016439338023822803714fd764efc226b958d4aa81565b6060600083606001359050838060c0019061034991906125de565b905067ffffffffffffffff81111561036457610363612641565b5b60405190808252806020026020018201604052801561039d57816020015b61038a611fd6565b8152602001906001900390816103825790505b50915060005b8251811015610809576000858060c001906103be91906125de565b838181106103cf576103ce612670565b5b90506020028101906103e1919061269f565b60000160208101906103f391906125a2565b9050600061043682600189600001602081019061041091906125a2565b7f0000000000000000000000000cab6977a9c70e04458b740476b498b2140196416110ff565b1184838151811061044a57610449612670565b5b602002602001015160000190151590811515815250506000868060c0019061047291906125de565b8481811061048357610482612670565b5b9050602002810190610495919061269f565b80608001906104a491906126c7565b905067ffffffffffffffff8111156104bf576104be612641565b5b6040519080825280602002602001820160405280156104f857816020015b6104e5611ff2565b8152602001906001900390816104dd5790505b5090508085848151811061050f5761050e612670565b5b60200260200101516020018190525060005b81518110156107fb5761054688600001602081019061054091906125a2565b8661111a565b82828151811061055957610558612670565b5b602002602001015160000190151590811515815250508460010194506bffffffffffffffffffffffff888060c0019061059291906125de565b868181106105a3576105a2612670565b5b90506020028101906105b5919061269f565b80608001906105c491906126c7565b838181106105d5576105d4612670565b5b9050604002016000013511158282815181106105f4576105f3612670565b5b602002602001015160200190151590811515815250506000888060c0019061061c91906125de565b8681811061062d5761062c612670565b5b905060200281019061063f919061269f565b806080019061064e91906126c7565b8381811061065f5761065e612670565b5b90506040020160200135905073ffffffffffffffffffffffffffffffffffffffff81116107485787156107435761069684826111db565b8383815181106106a9576106a8612670565b5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506106f18482611231565b83838151811061070457610703612670565b5b60200260200101516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b6107ef565b600083838151811061075d5761075c612670565b5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060008383815181106107b0576107af612670565b5b60200260200101516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b81600101915050610521565b5082600101925050506103a3565b509250929050565b6060838060e0019061082391906125de565b905067ffffffffffffffff81111561083e5761083d612641565b5b60405190808252806020026020018201604052801561087757816020015b610864611fd6565b81526020019060019003908161085c5790505b50905060005b8151811015610c2c576000858060e0019061089891906125de565b838181106108a9576108a8612670565b5b90506020028101906108bb919061269f565b60000160208101906108cd91906125a2565b905060006109108260018960000160208101906108ea91906125a2565b7f0000000000000000000000000cab6977a9c70e04458b740476b498b2140196416110ff565b1183838151811061092457610923612670565b5b602002602001015160000190151590811515815250506000868060e0019061094c91906125de565b8481811061095d5761095c612670565b5b905060200281019061096f919061269f565b806080019061097e91906126c7565b905067ffffffffffffffff81111561099957610998612641565b5b6040519080825280602002602001820160405280156109d257816020015b6109bf611ff2565b8152602001906001900390816109b75790505b509050808484815181106109e9576109e8612670565b5b60200260200101516020018190525060005b8151811015610c1e57610a20886000016020810190610a1a91906125a2565b8861111a565b828281518110610a3357610a32612670565b5b602002602001015160000190151590811515815250508660010196507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff888060e00190610a7c91906125de565b86818110610a8d57610a8c612670565b5b9050602002810190610a9f919061269f565b8060800190610aae91906126c7565b83818110610abf57610abe612670565b5b905060400201600001351115828281518110610ade57610add612670565b5b602002602001015160200190151590811515815250506000888060e00190610b0691906125de565b86818110610b1757610b16612670565b5b9050602002810190610b29919061269f565b8060800190610b3891906126c7565b83818110610b4957610b48612670565b5b9050604002016020013590508615610c1257610b6584826111db565b838381518110610b7857610b77612670565b5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610bc08482611231565b838381518110610bd357610bd2612670565b5b60200260200101516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b816001019150506109fb565b50826001019250505061087d565b509392505050565b60007f0000000000000000000000000cab6977a9c70e04458b740476b498b21401964173ffffffffffffffffffffffffffffffffffffffff16635e725186836040518263ffffffff1660e01b8152600401610c8f919061248c565b602060405180830381865afa158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190612756565b9050919050565b600080610cf2848060c00190610ced91906125de565b611287565b90506000610d0e858060e00190610d0991906125de565b61138c565b90506000856080016020810190610d2591906125a2565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d735773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90505b60007f2d8cbbbc696e7292c3b5beb38e1363d34ff11beb8c3456c14cb938854597b9ed60001b876000016020810190610dac91906125a2565b886020013589604001358a60600135868c60a0016020810190610dcf91906125a2565b8a8a8e604051602001610deb9a99989796959493929190612792565b6040516020818303038152906040528051906020012090507f4c311e4e8d77235d0d7a52b5016439338023822803714fd764efc226b958d4aa81604051602001610e369291906128a6565b6040516020818303038152906040528051906020012094505050505092915050565b600080846000016020810190610e6e91906125a2565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610eae5760009150506110f8565b600085610100016020810190610ec491906128dd565b9050600086610120013590506000876101400135905060008660ff1603610f7f5760018784848460405160008152602001604052604051610f089493929190612919565b6020604051602081039080840390855afa158015610f2a573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16886000016020810190610f5d91906125a2565b73ffffffffffffffffffffffffffffffffffffffff16149450505050506110f8565b60038660ff1603610fb457610fa9886000016020810190610fa091906125a2565b88858585611491565b9450505050506110f8565b60058660ff160361101d576000610fc961151b565b905060006001821603610fe4576000955050505050506110f8565b6000610fef8961156e565b90506110108a600001602081019061100791906125a2565b82878787611491565b96505050505050506110f8565b60078660ff160361108657600061103261151b565b90506000600282160361104d576000955050505050506110f8565b6000611058896115a6565b90506110798a600001602081019061107091906125a2565b82878787611491565b96505050505050506110f8565b60098660ff16036110ef57600061109b61151b565b9050600060048216036110b6576000955050505050506110f8565b60006110c1896115a6565b90506110e28a60000160208101906110d991906125a2565b828787876116d3565b96505050505050506110f8565b60009450505050505b9392505050565b600061110d858585856117e0565b5080915050949350505050565b6000807f0000000000000000000000000cab6977a9c70e04458b740476b498b21401964173ffffffffffffffffffffffffffffffffffffffff1663030b273085600886901c6040518363ffffffff1660e01b815260040161117c929190612998565b602060405180830381865afa158015611199573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bd9190612756565b9050600060ff84166001901b90506000818316149250505092915050565b60006040517f6352211e000000000000000000000000000000000000000000000000000000008152826004820152602081602483875afa1561122a57600160a01b8151101561122957805191505b5b5092915050565b60006040517f081812fc000000000000000000000000000000000000000000000000000000008152826004820152602081602483875afa1561128057600160a01b8151101561127f57805191505b5b5092915050565b60008083839050036112be577fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050611386565b600083839050905060008167ffffffffffffffff8111156112e2576112e1612641565b5b6040519080825280602002602001820160405280156113105781602001602082028036833780820191505090505b50905060005b828110156113775761134b86868381811061133457611333612670565b5b9050602002810190611346919061269f565b6118e7565b82828151811061135e5761135d612670565b5b6020026020010181815250508080600101915050611316565b50602082026020820120925050505b92915050565b60008083839050036113c3577fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b905061148b565b600083839050905060008167ffffffffffffffff8111156113e7576113e6612641565b5b6040519080825280602002602001820160405280156114155781602001602082028036833780820191505090505b50905060005b8281101561147c5761145086868381811061143957611438612670565b5b905060200281019061144b919061269f565b611b43565b82828151811061146357611462612670565b5b602002602001018181525050808060010191505061141b565b50602082026020820120925050505b92915050565b600080863b1561150e57604051631626ba7e8152866020820152604080820152604160608201528460808201528360a08201528560f81b60c082015260208160a5601c84018b5afa1561150c577f1626ba7e0000000000000000000000000000000000000000000000000000000081510361150b57600191505b5b505b8091505095945050505050565b6000807f0000000000000000000000000cab6977a9c70e04458b740476b498b2140196419050604051633cdad7ce8152602081600483855afa80156115685760203d0361156757815193505b5b50505090565b600061157982611dda565b6040516020016115899190612aa4565b604051602081830303815290604052805190602001209050919050565b60008060026115b484611dda565b6040516020016115c49190612b38565b6040516020818303038152906040526040516115e09190612b5a565b602060405180830381855afa1580156115fd573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906116209190612b9d565b90506000602067ffffffffffffffff81111561163f5761163e612641565b5b6040519080825280601f01601f1916602001820160405280156116715781602001600182028036833780820191505090505b50905081602082015260028160405161168a9190612b5a565b602060405180830381855afa1580156116a7573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906116ca9190612b9d565b92505050919050565b600080863b1561171e57604051638da5cb5b81526020816004601c84018b5afa1561171c57740100000000000000000000000000000000000000008151101561171b57805191505b5b505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156117d45750600186868686604051600081526020016040526040516117799493929190612919565b6020604051602081039080840390855afa15801561179b573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b91505095945050505050565b600080600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148061185d575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b1561186e57600080915091506118de565b60006040517fe985e9c50000000000000000000000000000000000000000000000000000000081528560048201528460248201526020816044838b5afa156118c0576000815111156118bf57600191505b5b5080156118d5576001600092509250506118de565b60008092509250505b94509492505050565b60008060008380608001906118fc91906126c7565b90500361192e577fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050611a97565b600083806080019061194091906126c7565b9050905060008167ffffffffffffffff8111156119605761195f612641565b5b60405190808252806020026020018201604052801561198e5781602001602082028036833780820191505090505b50905060005b82811015611a885760008680608001906119ae91906126c7565b838181106119bf576119be612670565b5b90506040020160000135905060008780608001906119dd91906126c7565b848181106119ee576119ed612670565b5b9050604002016020013590506bffffffffffffffffffffffff821180611a27575073ffffffffffffffffffffffffffffffffffffffff81115b15611a52576000848481518110611a4157611a40612670565b5b602002602001018181525050611a79565b8060a083901b17848481518110611a6c57611a6b612670565b5b6020026020010181815250505b82806001019350505050611994565b50602082026020820120925050505b6000836060016020810190611aac91906125a2565b73ffffffffffffffffffffffffffffffffffffffff1660a08560400135901b60b08660200135901b171790507f12ad29288fd70022f26997a9958d9eceb6e840ceaa79b72ea5945ba87e4d33b060001b846000016020810190611b0f91906125a2565b8284604051602001611b249493929190612bca565b6040516020818303038152906040528051906020012092505050919050565b6000806000838060800190611b5891906126c7565b905003611b8a577fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050611d2e565b6000838060800190611b9c91906126c7565b9050905060008167ffffffffffffffff811115611bbc57611bbb612641565b5b604051908082528060200260200182016040528015611bea5781602001602082028036833780820191505090505b50905060005b82811015611d1f576000868060800190611c0a91906126c7565b83818110611c1b57611c1a612670565b5b9050604002016000013590506000878060800190611c3991906126c7565b84818110611c4a57611c49612670565b5b9050604002016020013590507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611ca2576000801b848481518110611c9157611c90612670565b5b602002602001018181525050611d10565b7f5f93394997caa49a9382d44a75e3ce6a460f32b39870464866ac994f8be97afe60001b8282604051602001611cda93929190612c0f565b60405160208183030381529060405280519060200120848481518110611d0357611d02612670565b5b6020026020010181815250505b82806001019350505050611bf0565b50602082026020820120925050505b6000836060016020810190611d4391906125a2565b73ffffffffffffffffffffffffffffffffffffffff1660a08560400135901b60b08660200135901b171790507fb9f488d48cec782be9ecdb74330c9c6a33c236a8022d8a91a4e4df4e81b5162060001b846000016020810190611da691906125a2565b8284604051602001611dbb9493929190612bca565b6040516020818303038152906040528051906020012092505050919050565b606060008260001c9050604267ffffffffffffffff811115611dff57611dfe612641565b5b6040519080825280601f01601f191660200182016040528015611e315781602001600182028036833780820191505090505b5091507f300000000000000000000000000000000000000000000000000000000000000082600081518110611e6957611e68612670565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000082600181518110611ecd57611ecc612670565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000604190505b6001811115611f9b577f3031323334353637383961626364656600000000000000000000000000000000600f831660108110611f4257611f41612670565b5b1a60f81b838281518110611f5957611f58612670565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600482901c915080600190039050611f03565b5050919050565b6040518060a00160405280600080191681526020016000815260200160001515815260200160608152602001606081525090565b6040518060400160405280600015158152602001606081525090565b6040518060800160405280600015158152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b600080fd5b600080fd5b600080fd5b600061016082840312156120705761206f612054565b5b81905092915050565b600060ff82169050919050565b61208f81612079565b811461209a57600080fd5b50565b6000813590506120ac81612086565b92915050565b60008115159050919050565b6120c7816120b2565b81146120d257600080fd5b50565b6000813590506120e4816120be565b92915050565b6000806000606084860312156121035761210261204a565b5b600084013567ffffffffffffffff8111156121215761212061204f565b5b61212d86828701612059565b935050602061213e8682870161209d565b925050604061214f868287016120d5565b9150509250925092565b6000819050919050565b61216c81612159565b82525050565b6000819050919050565b61218581612172565b82525050565b612194816120b2565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061221d826121f2565b9050919050565b61222d81612212565b82525050565b608082016000820151612249600085018261218b565b50602082015161225c602085018261218b565b50604082015161226f6040850182612224565b5060608201516122826060850182612224565b50505050565b60006122948383612233565b60808301905092915050565b6000602082019050919050565b60006122b8826121c6565b6122c281856121d1565b93506122cd836121e2565b8060005b838110156122fe5781516122e58882612288565b97506122f0836122a0565b9250506001810190506122d1565b5085935050505092915050565b6000604083016000830151612323600086018261218b565b506020830151848203602086015261233b82826122ad565b9150508091505092915050565b6000612354838361230b565b905092915050565b6000602082019050919050565b60006123748261219a565b61237e81856121a5565b935083602082028501612390856121b6565b8060005b858110156123cc57848403895281516123ad8582612348565b94506123b88361235c565b925060208a01995050600181019050612394565b50829750879550505050505092915050565b600060a0830160008301516123f66000860182612163565b506020830151612409602086018261217c565b50604083015161241c604086018261218b565b50606083015184820360608601526124348282612369565b9150506080830151848203608086015261244e8282612369565b9150508091505092915050565b6000602082019050818103600083015261247581846123de565b905092915050565b61248681612212565b82525050565b60006020820190506124a1600083018461247d565b92915050565b600080604083850312156124be576124bd61204a565b5b600083013567ffffffffffffffff8111156124dc576124db61204f565b5b6124e885828601612059565b92505060206124f98582860161209d565b9150509250929050565b6000602082840312156125195761251861204a565b5b600082013567ffffffffffffffff8111156125375761253661204f565b5b61254384828501612059565b91505092915050565b61255581612159565b82525050565b6000602082019050612570600083018461254c565b92915050565b61257f81612212565b811461258a57600080fd5b50565b60008135905061259c81612576565b92915050565b6000602082840312156125b8576125b761204a565b5b60006125c68482850161258d565b91505092915050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126125fb576125fa6125cf565b5b80840192508235915067ffffffffffffffff82111561261d5761261c6125d4565b5b602083019250602082023603831315612639576126386125d9565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008235600160a0038336030381126126bb576126ba6125cf565b5b80830191505092915050565b600080833560016020038436030381126126e4576126e36125cf565b5b80840192508235915067ffffffffffffffff821115612706576127056125d4565b5b602083019250604082023603831315612722576127216125d9565b5b509250929050565b61273381612172565b811461273e57600080fd5b50565b6000815190506127508161272a565b92915050565b60006020828403121561276c5761276b61204a565b5b600061277a84828501612741565b91505092915050565b61278c81612172565b82525050565b6000610140820190506127a8600083018d61254c565b6127b5602083018c61247d565b6127c2604083018b612783565b6127cf606083018a612783565b6127dc6080830189612783565b6127e960a083018861247d565b6127f660c083018761247d565b61280360e083018661254c565b61281161010083018561254c565b61281f610120830184612783565b9b9a5050505050505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061286f60028361282e565b915061287a82612839565b600282019050919050565b6000819050919050565b6128a061289b82612159565b612885565b82525050565b60006128b182612862565b91506128bd828561288f565b6020820191506128cd828461288f565b6020820191508190509392505050565b6000602082840312156128f3576128f261204a565b5b60006129018482850161209d565b91505092915050565b61291381612079565b82525050565b600060808201905061292e600083018761254c565b61293b602083018661290a565b612948604083018561254c565b612955606083018461254c565b95945050505050565b60007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6129928161295e565b82525050565b60006040820190506129ad600083018561247d565b6129ba6020830184612989565b9392505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a313031456c6560008201527f6d656e742e6d61726b6574206c697374696e672f6f6666657220686173683a0a602082015250565b6000612a286040836129c1565b9150612a33826129cc565b604082019050919050565b600081519050919050565b60005b83811015612a67578082015181840152602081019050612a4c565b60008484015250505050565b6000612a7e82612a3e565b612a8881856129c1565b9350612a98818560208601612a49565b80840191505092915050565b6000612aaf82612a1b565b9150612abb8284612a73565b915081905092915050565b7f18426974636f696e205369676e6564204d6573736167653a0a65456c656d656e60008201527f742e6d61726b6574206c697374696e672f6f6666657220686173683a0a000000602082015250565b6000612b22603d836129c1565b9150612b2d82612ac6565b603d82019050919050565b6000612b4382612b15565b9150612b4f8284612a73565b915081905092915050565b6000612b668284612a73565b915081905092915050565b612b7a81612159565b8114612b8557600080fd5b50565b600081519050612b9781612b71565b92915050565b600060208284031215612bb357612bb261204a565b5b6000612bc184828501612b88565b91505092915050565b6000608082019050612bdf600083018761254c565b612bec602083018661247d565b612bf96040830185612783565b612c06606083018461254c565b95945050505050565b6000606082019050612c24600083018661254c565b612c316020830185612783565b612c3e6040830184612783565b94935050505056fea264697066735822122061689401b1e95f1599e14e1954397d217c26657d5b5a7557e3a4c141e7076a9864736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000cab6977a9c70e04458b740476b498b214019641
-----Decoded View---------------
Arg [0] : element (address): 0x0caB6977a9c70E04458b740476B498B214019641
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000cab6977a9c70e04458b740476b498b214019641
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.