ETH Price: $2,997.75 (-5.17%)
Gas: 14 Gwei

Contract

0x1D9bD2379123CFdd19210AafC670b067A3FFf04f
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Set Approval For...175349962023-06-22 11:55:47296 days ago1687434947IN
Montro Collectibles: PART Token
0 ETH0.0006080713.15860275
Set Approval For...174921392023-06-16 11:36:23302 days ago1686915383IN
Montro Collectibles: PART Token
0 ETH0.0007975817.25968892
Purchase From174921242023-06-16 11:33:23302 days ago1686915203IN
Montro Collectibles: PART Token
0 ETH0.0012781715.14083107
Purchase From174917132023-06-16 10:09:35302 days ago1686910175IN
Montro Collectibles: PART Token
0 ETH0.0013486615.1163037
Set Approval For...174873072023-06-15 19:19:11303 days ago1686856751IN
Montro Collectibles: PART Token
0 ETH0.0008256517.86697313
Purchase From174859772023-06-15 14:48:59303 days ago1686840539IN
Montro Collectibles: PART Token
0 ETH0.0017829619.98687532
Purchase From174848322023-06-15 10:56:35303 days ago1686826595IN
Montro Collectibles: PART Token
0 ETH0.0021213419.95264537
Set Approval For...174709632023-06-13 12:05:59305 days ago1686657959IN
Montro Collectibles: PART Token
0 ETH0.0007044515.24427376
0x61010060174707162023-06-13 11:16:23305 days ago1686654983IN
 Create: CollectiblesSale
0 ETH0.0300832718.21640356

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CollectiblesSale

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 1000 runs

Other Settings:
paris EvmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-13
*/

pragma solidity >=0.8.13;

// File: enft/contracts/ERC165.sol

/// Creates a standard method to publish and detect what interfaces a smart
/// contract implements.
/// @title ERC-165 Standard Interface Detection
/// @dev See https://eips.ethereum.org/EIPS/eip-165
interface ERC165 {
	/// @notice Query if a contract implements an interface
	/// @param interfaceID The interface identifier, as specified in ERC-165
	/// @dev Interface identification is specified in ERC-165. This function
	///  uses less than 30,000 gas.
	/// @return `true` if the contract implements `interfaceID` and
	///  `interfaceID` is not 0xffffffff, `false` otherwise
	function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

// File: enft/contracts/ERC20.sol

/// A standard interface for tokens, without the OPTIONAL methods.
/// @title ERC-20 Token Standard
/// @dev See https://eips.ethereum.org/EIPS/eip-20
interface ERC20 {
	// MUST trigger when tokens are transferred, including zero value transfers.
	//
	// A token contract which creates new tokens SHOULD trigger a Transfer event
	// with the from address set to 0x0 when tokens are created.
	event Transfer(address indexed from, address indexed to, uint256 value);

	// MUST trigger on any successful call to approve(address spender, uint256 value).
	event Approval(address indexed owner, address indexed spender, uint256 value);

	// Returns the total token supply.
	function totalSupply() external view returns (uint256);

	// Returns the account balance of another account with address owner.
	function balanceOf(address owner) external view returns (uint256);

	// Transfers value amount of tokens to address to, and MUST fire the Transfer
	// event. The function SHOULD throw if the message caller’s account balance does
	// not have enough tokens to spend.
	//
	// Note Transfers of 0 values MUST be treated as normal transfers and fire the
	// Transfer event.
	function transfer(address to, uint256 value) external returns (bool success);

	// Transfers value amount of tokens from address from to address to, and MUST
	// fire the Transfer event.
	//
	// The transferFrom method is used for a withdraw workflow, allowing contracts
	// to transfer tokens on your behalf. This can be used for example to allow a
	// contract to transfer tokens on your behalf and/or to charge fees in
	// sub-currencies. The function SHOULD throw unless the from account has
	// deliberately authorized the sender of the message via some mechanism.
	//
	// Note Transfers of 0 values MUST be treated as normal transfers and fire the
	// Transfer event.
	function transferFrom(address from, address to, uint256 value) external returns (bool success);

	// Allows spender to withdraw from your account multiple times, up to the
	// value amount. If this function is called again it overwrites the current
	// allowance with value.
	//
	// NOTE: To prevent attack vectors like the one described here
	// <https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/>
	// and discussed here <https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729>,
	// clients SHOULD make sure to create user interfaces in such a way that they
	// set the allowance first to 0 before setting it to another value for the same
	// spender. THOUGH The contract itself shouldn’t enforce it, to allow backwards
	// compatibility with contracts deployed before.
	function approve(address spender, uint256 value) external returns (bool success);

	// Returns the amount which spender is still allowed to withdraw from owner.
	function allowance(address owner, address spender) external view returns (uint256 remaining);
}

// File: enft/contracts/ERC721Metadata.sol

/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x5b5e139f.
interface ERC721Metadata /* is ERC721 */ {
	/// @notice A descriptive name for a collection of NFTs in this contract
	function name() external view returns (string memory);

	/// @notice An abbreviated name for NFTs in this contract
	function symbol() external view returns (string memory);

	/// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
	/// @dev Throws if `tokenId` is not a valid NFT. URIs are defined in RFC
	///  3986. The URI may point to a JSON file that conforms to the "ERC721
	///  Metadata JSON Schema".
	function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: enft/contracts/ERC721.sol

/// A standard interface for non-fungible tokens, also known as deeds. Every
/// ERC-721 compliant contract must implement the ERC721 and ERC165 interfaces.
/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x80ac58cd.
interface ERC721 /* is ERC165 */ {
	/// @dev This emits when ownership of any NFT changes by any mechanism.
	///  This event emits when NFTs are created (`from` == 0) and destroyed
	///  (`to` == 0). Exception: during contract creation, any number of NFTs
	///  may be created and assigned without emitting Transfer. At the time of
	///  any transfer, the approved address for that NFT (if any) is reset to none.
	event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

	/// @dev This emits when the approved address for an NFT is changed or
	///  reaffirmed. The zero address indicates there is no approved address.
	///  When a Transfer event emits, this also indicates that the approved
	///  address for that NFT (if any) is reset to none.
	event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

	/// @dev This emits when an operator is enabled or disabled for an owner.
	///  The operator can manage all NFTs of the owner.
	event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

	/// @notice Count all NFTs assigned to an owner
	/// @dev NFTs assigned to the zero address are considered invalid, and this
	///  function throws for queries about the zero address.
	/// @param owner An address for whom to query the balance
	/// @return The number of NFTs owned by `owner`, possibly zero
	function balanceOf(address owner) external view returns (uint256);

	/// @notice Find the owner of an NFT
	/// @dev NFTs assigned to zero address are considered invalid, and queries
	///  about them do throw.
	/// @param tokenId The identifier for an NFT
	/// @return The address of the owner of the NFT
	function ownerOf(uint256 tokenId) external view returns (address);

	/// @notice Transfers the ownership of an NFT from one address to another address
	/// @dev Throws unless `msg.sender` is the current owner, an authorized
	///  operator, or the approved address for this NFT. Throws if `from` is
	///  not the current owner. Throws if `to` is the zero address. Throws if
	///  `tokenId` is not a valid NFT. When transfer is complete, this function
	///  checks if `to` is a smart contract (code size > 0). If so, it calls
	///  `onERC721Received` on `to` and throws if the return value is not
	///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
	/// @param from The current owner of the NFT
	/// @param to The new owner
	/// @param tokenId The NFT to transfer
	/// @param data Additional data with no specified format, sent in call to `to`
	function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external payable;

	/// @notice Transfers the ownership of an NFT from one address to another address
	/// @dev This works identically to the other function with an extra data parameter,
	///  except this function just sets data to "".
	/// @param from The current owner of the NFT
	/// @param to The new owner
	/// @param tokenId The NFT to transfer
	function safeTransferFrom(address from, address to, uint256 tokenId) external payable;

	/// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
	///  TO CONFIRM THAT `to` IS CAPABLE OF RECEIVING NFTS OR ELSE
	///  THEY MAY BE PERMANENTLY LOST
	/// @dev Throws unless `msg.sender` is the current owner, an authorized
	///  operator, or the approved address for this NFT. Throws if `from` is
	///  not the current owner. Throws if `to` is the zero address. Throws if
	///  `tokenId` is not a valid NFT.
	/// @param from The current owner of the NFT
	/// @param to The new owner
	/// @param tokenId The NFT to transfer
	function transferFrom(address from, address to, uint256 tokenId) external payable;

	/// @notice Change or reaffirm the approved address for an NFT
	/// @dev The zero address indicates there is no approved address.
	///  Throws unless `msg.sender` is the current NFT owner, or an authorized
	///  operator of the current owner.
	/// @param approved The new approved NFT controller
	/// @param tokenId The NFT to approve
	function approve(address approved, uint256 tokenId) external payable;

	/// @notice Enable or disable approval for a third party ("operator") to manage
	///  all of `msg.sender`'s assets
	/// @dev Emits the ApprovalForAll event. The contract MUST allow
	///  multiple operators per owner.
	/// @param operator Address to add to the set of authorized operators
	/// @param approved True if the operator is approved, false to revoke approval
	function setApprovalForAll(address operator, bool approved) external;

	/// @notice Get the approved address for a single NFT
	/// @dev Throws if `tokenId` is not a valid NFT.
	/// @param tokenId The NFT to find the approved address for
	/// @return The approved address for this NFT, or the zero address if there is none
	function getApproved(uint256 tokenId) external view returns (address);

	/// @notice Query if an address is an authorized operator for another address
	/// @param owner The address that owns the NFTs
	/// @param operator The address that acts on behalf of the owner
	/// @return True if `operator` is an approved operator for `owner`, false otherwise
	function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// File: enft/contracts/ERC721Enumerable.sol

/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x780e9d63.
interface ERC721Enumerable /* is ERC721 */ {
	/// @notice Count NFTs tracked by this contract
	/// @return A count of valid NFTs tracked by this contract, where each one of
	///  them has an assigned and queryable owner not equal to the zero address
	function totalSupply() external view returns (uint256);

	/// @notice Enumerate valid NFTs
	/// @dev Throws if `index` >= `totalSupply()`.
	/// @param index A counter less than `totalSupply()`
	/// @return The token identifier for the `index`th NFT,
	///  (sort order not specified)
	function tokenByIndex(uint256 index) external view returns (uint256);

	/// @notice Enumerate NFTs assigned to an owner
	/// @dev Throws if `index` >= `balanceOf(owner)` or if
	///  `owner` is the zero address, representing invalid NFTs.
	/// @param owner An address where we are interested in NFTs owned by them
	/// @param index A counter less than `balanceOf(owner)`
	/// @return The token identifier for the `index`th NFT assigned to `owner`,
	///   (sort order not specified)
	function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
}

// File: enft/contracts/ERC721TokenReceiver.sol

/// A wallet/broker/auction application MUST implement the wallet interface if
/// it will accept safe transfers.
/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
interface ERC721TokenReceiver {
	/// @notice Handle the receipt of an NFT
	/// @dev The ERC721 smart contract calls this function on the recipient
	///  after a `transfer`. This function MAY throw to revert and reject the
	///  transfer. Return of other than the magic value MUST result in the
	///  transaction being reverted.
	///  Note: the contract address is always the message sender.
	/// @param operator The address which called `safeTransferFrom` function
	/// @param from The address which previously owned the token
	/// @param tokenId The NFT identifier which is being transferred
	/// @param data Additional data with no specified format
	/// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
	///  unless throwing
	function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns(bytes4);
}

// File: enft/contracts/FixedNFTSet.sol

// FixedNFTSet manages a fixed amount of non-fungible tokens.
contract FixedNFTSet is ERC721, ERC721Enumerable, ERC165 {

// The number of tokens is fixed during contract creation.
// Zero/absent entries in tokenOwners take the defaultOwner value.
uint256 private immutable tokenCountAndDefaultOwner;

// Each token (index/ID) has one owner at a time.
// Zero/absent entries take the defaultOwner value.
mapping(uint256 => address) private tokenOwners;

// Each token (index/ID) can be granted to a destination address.
mapping(uint256 => address) private tokenApprovals;

// The token-owner:token-operator:approval-flag entries are always true.
mapping(address => mapping(address => bool)) private operatorApprovals;

// Constructor mints n tokens, and transfers each token to the receiver address.
// Token identifiers match their respective index, counting from 0 to n − 1.
// Initial Transfer emission is omitted.
constructor(uint256 n, address receiver) {
	requireAddress(receiver);
	tokenCountAndDefaultOwner = uint(uint160(receiver)) | (n << 160);
}

// RequireAddress denies the zero value.
function requireAddress(address a) internal pure {
	require(a != address(0), "ERC-721 address 0");
}

// RequireToken denies any token index/ID that is not in this contract.
function requireToken(uint256 indexOrID) internal view {
	require(indexOrID < totalSupply(), "ERC-721 token \u2415");
}

function supportsInterface(bytes4 interfaceID) public virtual override(ERC165) pure returns (bool) {
	// https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified
	return interfaceID == 0x80ac58cd  // ERC721
	    || interfaceID == 0x780e9d63  // ERC721Enumerable
	    || interfaceID == 0x01ffc9a7; // ERC165
}

function totalSupply() public override(ERC721Enumerable) view returns (uint256) {
	return tokenCountAndDefaultOwner >> 160;
}

// Tokens are identified by their index one-to-one.
function tokenByIndex(uint256 index) public override(ERC721Enumerable) view returns (uint256) {
	requireToken(index);
	return index;
}

function tokenOfOwnerByIndex(address owner, uint256 index) public override(ERC721Enumerable) view returns (uint256 tokenID) {
	requireAddress(owner);
	for (tokenID = 0; tokenID < totalSupply(); tokenID++) {
		if (ownerOf(tokenID) == owner) {
			if (index == 0) {
				return tokenID;
			}

			--index;
		}
	}
	revert("ERC-721 index exceeds balance");
}

function balanceOf(address owner) public override(ERC721) view returns (uint256) {
	requireAddress(owner);
	uint256 balance = 0;
	// count owner matches
	for (uint256 tokenID = 0; tokenID < totalSupply(); tokenID++) {
		if (ownerOf(tokenID) == owner) {
			++balance;
		}
	}
	return balance;
}

function ownerOf(uint256 tokenID) public override(ERC721) view returns (address) {
	requireToken(tokenID);
	address owner = tokenOwners[tokenID];
	if (owner == address(0)) {
		return address(uint160(tokenCountAndDefaultOwner));
	}
	return owner;
}

function safeTransferFrom(address from, address to, uint256 tokenID, bytes calldata data) public override(ERC721) payable {
	transferFrom(from, to, tokenID);
	if (msg.sender == tx.origin) { // is contract
		require(ERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenID, data) == ERC721TokenReceiver.onERC721Received.selector, "ERC721TokenReceiver mis");
	}
}

function safeTransferFrom(address from, address to, uint256 tokenID) public override(ERC721) payable {
	return this.safeTransferFrom(from, to, tokenID, "");
}

function transferFrom(address from, address to, uint256 tokenID) public override(ERC721) payable {
	address owner = ownerOf(tokenID); // checks token ID
	require(from == owner, "ERC-721 from \u2415");
	requireAddress(to);

	address approved = tokenApprovals[tokenID];
	require(msg.sender == owner || msg.sender == approved || isApprovedForAll(owner, msg.sender), "ERC-721 sender deny");

	// reset approvals from previous owner, if any
	if (approved != address(0)) {
		delete tokenApprovals[tokenID];
		emit Approval(owner, address(0), tokenID);
	}

	// actual transfer
	tokenOwners[tokenID] = to;
	emit Transfer(from, to, tokenID);
}

function approve(address to, uint256 tokenID) public override(ERC721) payable {
	address owner = ownerOf(tokenID); // checks token ID
	require(msg.sender == owner || isApprovedForAll(owner, msg.sender), "ERC-721 sender deny");
	tokenApprovals[tokenID] = to;
	emit Approval(owner, to, tokenID);
}

function setApprovalForAll(address operator, bool approved) public override(ERC721) {
	if (approved) {
		operatorApprovals[msg.sender][operator] = true;
	} else {
		delete operatorApprovals[msg.sender][operator];
	}
	emit ApprovalForAll(msg.sender, operator, approved);
}

function getApproved(uint256 tokenID) public override(ERC721) view returns (address operator) {
	requireToken(tokenID);
	return tokenApprovals[tokenID];
}

function isApprovedForAll(address owner, address operator) public override(ERC721) view returns (bool) {
	return operatorApprovals[owner][operator];
}

}

// File: contracts/CollectiblesSale.sol

// SPDX-License-Identifier: UNLICENSED

// QualifiedPrice provides an (ERC20) unit to the quanty.
struct QualifiedPrice {
	uint96  amount;   // currency quantity
	address currency; // token contract
}


// CollectiblesSale represents one product on Montro Collectibles.
contract CollectiblesSale is FixedNFTSet, ERC721Metadata {

// CollectiblesPurchaseOffer signals an option to purchase tokens. For any given
// seller, each CollectiblesPurchaseOffer emission overrides the previous one,
// if any. A zero QualifiedPrice amount terminates the offer from seller.
event CollectiblesPurchaseOffer(QualifiedPrice perToken, address seller);


// Name labels the item for sale.
string public override(ERC721Metadata) name;

// SerialCode identifies the item for sale.
string public serialCode;

// The 32-byte SHA2-256 from IPFS is split over two hexadecimal words.
// Use all lower-case for valid IPFS URI composition.
bytes32 immutable FSHashHex1;
bytes32 immutable FSHashHex2;

// BoostConfig is packed into one immutable word for gas efficiency.
uint256 immutable boosts;

mapping(address => QualifiedPrice) purchaseOffers;


// BoostConfig packs boosts as base–ramp pairs.
struct BoostConfig {
	int16 stakeBase;
	int16 stakeRamp;
	int16 weightBase;
	int16 weightRamp;
}

// All tokens are assigned to productHolder, with an CollectiblesPurchaseOffer
// emission as per QualifiedPrice. The initial ERC721 Transfer events are
// omitted because they are implied by the CollectiblesPurchaseOffer already.
constructor(address productHolder, string memory productName, string memory productSerialCode, uint256 partCount, QualifiedPrice memory perToken, bytes32 IPFSHashHex1, bytes32 IPFSHashHex2, BoostConfig memory bc)
FixedNFTSet(partCount, productHolder) {
	name = productName;
	serialCode = productSerialCode;

	FSHashHex1 = IPFSHashHex1;
	FSHashHex2 = IPFSHashHex2;

	boosts = uint256(uint16(bc.stakeRamp)) << 32
	       | uint256(uint16(bc.stakeBase)) << 48
	       | uint256(uint16(bc.weightRamp)) << 64
	       | uint256(uint16(bc.weightBase)) << 80;

	// initial Transfer emission is optional but needed by OpenSea
	for (uint256 tokenID; tokenID < partCount; tokenID++) {
		emit Transfer(address(0), productHolder, tokenID);
	}

	// initial product offering
	purchaseOffers[productHolder] = perToken;
	emit CollectiblesPurchaseOffer(perToken, productHolder);
}

function supportsInterface(bytes4 interfaceID) public override(FixedNFTSet) pure returns (bool) {
	return super.supportsInterface(interfaceID)
	    || interfaceID == 0x5b5e139f; // ERC721Metadata
}

function symbol() override(ERC721Metadata) public pure returns (string memory) {
	return "PART";
}

// FSURIFix packs both the prefix and the suffix of an IPFS URI with hex
// encoding. This is to effectively store the entire URI in three words.
//
// The CID header consists of the following (multiformat) prefixes:
// 'f': lower-case hexadecimal (for all what follows)
// '01': CID version 1 (in hexadecimal)
// '70': MerkleDAG ProtoBuf (in hexadecimal)
// '12': SHA2-256 (in hexadecimal)
// '20': hash bit-length (in hexadecimal)
bytes21 constant FSURIFix = "ipfs://f01701220.json";

function tokenURI(uint256 tokenID) override(ERC721Metadata) public view returns (string memory) {
	requireToken(tokenID);

	// "/part-000"
	uint256 decimalPath = 0x2f706172742d303030;
	decimalPath += tokenID % 10;                 // digit
	decimalPath += ((tokenID / 10) % 10) << 8;   // deci digit
	decimalPath += ((tokenID / 100) % 10) << 16; // centi digit

	return string(bytes.concat(bytes16(FSURIFix), // trim head from fix
		FSHashHex1, FSHashHex2,               // both hex parts
		bytes9(uint72(decimalPath)),          // convert to bytes
		bytes5(uint40(uint168(FSURIFix))))    // trim tail from fix
	);
}

// TokenStake returns the relative share in the sale-execution. All boost values
// combined represent a payout in full.
//
// ⚠️ Note that the stake is duplacated in the metadata from tokenURI.
function tokenStake(uint256 tokenID) public view returns (int256 boost) {
	uint n = totalSupply();
	if (tokenID >= n) return 0;
	uint256 b = boosts;
	return int256(tokenID) * int16(uint16(b >> 32)) + int16(uint16(b >> 48));
}

// TokenWeight returns the relative momentum for voting. All boost values
// combined represent a vote in full.
//
// ⚠️ Note that the weight is duplacated in the metadata from tokenURI.
function tokenWeight(uint256 tokenID) public view returns (int256 boost) {
	uint n = totalSupply();
	if (tokenID >= n) return 0;
	uint256 b = boosts;
	return int256(tokenID) * int16(uint16(b >> 64)) + int16(uint16(b >> 80));
}

// PurchaseOffer allows anyone to purchase tokens from msg.sender at the given
// QualifiedPrice. PurchaseOffer overwrites the previous QualifiedPrice, if any.
// QualifiedPrice amount zero terminates any PurchaseOffer from msg.sender.
function purchaseOffer(QualifiedPrice memory perToken) public payable {
	if (perToken.amount == 0) {
		delete purchaseOffers[msg.sender];
	} else {
		tokenOfOwnerByIndex(msg.sender, 0); // address & balance check
		require(isApprovedForAll(msg.sender, address(this)), "contract needs operator approval");
		purchaseOffers[msg.sender] = perToken;
	}
	emit CollectiblesPurchaseOffer(perToken, msg.sender);
}

// PurchaseFrom aquires a token from seller if, and only if, a matching purchase
// offer is found.
function purchaseFrom(address seller, uint256 tokenID) public payable {
	QualifiedPrice memory offer = purchaseOffers[seller];
	require(offer.amount != 0, "no offer");

	// verify price expectency of buyer against current offer
	require(ERC20(offer.currency).allowance(msg.sender, address(this)) == offer.amount, "allowance mismatch");

	// pay
	require(ERC20(offer.currency).transferFrom(msg.sender, seller, offer.amount), "no pay");
	// redeem
	this.transferFrom(seller, msg.sender, tokenID);
}

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"productHolder","type":"address"},{"internalType":"string","name":"productName","type":"string"},{"internalType":"string","name":"productSerialCode","type":"string"},{"internalType":"uint256","name":"partCount","type":"uint256"},{"components":[{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"address","name":"currency","type":"address"}],"internalType":"struct QualifiedPrice","name":"perToken","type":"tuple"},{"internalType":"bytes32","name":"IPFSHashHex1","type":"bytes32"},{"internalType":"bytes32","name":"IPFSHashHex2","type":"bytes32"},{"components":[{"internalType":"int16","name":"stakeBase","type":"int16"},{"internalType":"int16","name":"stakeRamp","type":"int16"},{"internalType":"int16","name":"weightBase","type":"int16"},{"internalType":"int16","name":"weightRamp","type":"int16"}],"internalType":"struct CollectiblesSale.BoostConfig","name":"bc","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"address","name":"currency","type":"address"}],"indexed":false,"internalType":"struct QualifiedPrice","name":"perToken","type":"tuple"},{"indexed":false,"internalType":"address","name":"seller","type":"address"}],"name":"CollectiblesPurchaseOffer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"purchaseFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"address","name":"currency","type":"address"}],"internalType":"struct QualifiedPrice","name":"perToken","type":"tuple"}],"name":"purchaseOffer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenID","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"serialCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"tokenStake","outputs":[{"internalType":"int256","name":"boost","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"tokenWeight","outputs":[{"internalType":"int256","name":"boost","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"}]

6101006040523480156200001257600080fd5b5060405162001f6538038062001f65833981016040819052620000359162000390565b84886200004281620001ad565b6001600160a01b031660a09190911b1760805260036200006388826200053c565b5060046200007287826200053c565b508260a081815250508160c081815250506050816040015161ffff16901b6040826060015161ffff16901b6030836000015161ffff16901b6020846020015161ffff16901b17171760e0818152505060005b858110156200011a5760405181906001600160a01b038b16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480620001118162000608565b915050620000c4565b506001600160a01b038881166000818152600560209081526040918290208851898301805187166c01000000000000000000000000026001600160601b0390921691821790925583519081529051909416908401528201527feb6c7d1cd53bd4a9d7c4478386be075d97a6372e435e72cb37313dfa17ad00d79060600160405180910390a1505050505050505062000630565b6001600160a01b038116620001fc5760405162461bcd60e51b815260206004820152601160248201527004552432d3732312061646472657373203607c1b604482015260640160405180910390fd5b50565b80516001600160a01b03811681146200021757600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200025d576200025d6200021c565b604052919050565b600082601f8301126200027757600080fd5b81516001600160401b038111156200029357620002936200021c565b6020620002a9601f8301601f1916820162000232565b8281528582848701011115620002be57600080fd5b60005b83811015620002de578581018301518282018401528201620002c1565b506000928101909101919091529392505050565b8051600181900b81146200021757600080fd5b6000608082840312156200031857600080fd5b604051608081016001600160401b03811182821017156200033d576200033d6200021c565b6040529050806200034e83620002f2565b81526200035e60208401620002f2565b60208201526200037160408401620002f2565b60408201526200038460608401620002f2565b60608201525092915050565b600080600080600080600080888a03610180811215620003af57600080fd5b620003ba8a620001ff565b60208b01519099506001600160401b0380821115620003d857600080fd5b620003e68d838e0162000265565b995060408c0151915080821115620003fd57600080fd5b6200040b8d838e0162000265565b985060608c015197506040607f19840112156200042757600080fd5b604051925060408301915082821081831117156200044957620004496200021c565b5060405260808a01516001600160601b03811681146200046857600080fd5b81526200047860a08b01620001ff565b602082015260c08a015160e08b0151919550935091506200049e8a6101008b0162000305565b90509295985092959890939650565b600181811c90821680620004c257607f821691505b602082108103620004e357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200053757600081815260208120601f850160051c81016020861015620005125750805b601f850160051c820191505b8181101562000533578281556001016200051e565b5050505b505050565b81516001600160401b038111156200055857620005586200021c565b6200057081620005698454620004ad565b84620004e9565b602080601f831160018114620005a857600084156200058f5750858301515b600019600386901b1c1916600185901b17855562000533565b600085815260208120601f198616915b82811015620005d957888601518255948401946001909101908401620005b8565b5085821015620005f85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000600182016200062957634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e0516118ca6200069b60003960008181610f5201526110d9015260006111db015260006111b50152600081816102220152818161085e01528181610dca01528181610e0001528181610f1e015281816110a5015261131201526118ca6000f3fe60806040526004361061016a5760003560e01c806359dfa5b8116100cb578063b5be93061161007f578063c87b56dd11610059578063c87b56dd146103d8578063e22868e9146103f8578063e985e9c51461040d57600080fd5b8063b5be930614610385578063b88d4fde146103a5578063c19d7ab3146103b857600080fd5b806370a08231116100b057806370a08231146102ff57806395d89b411461031f578063a22cb4651461036557600080fd5b806359dfa5b8146102cc5780636352211e146102df57600080fd5b806323b872dd11610122578063306b23f011610107578063306b23f01461028657806342842e0e146102995780634f6ccce7146102ac57600080fd5b806323b872dd146102535780632f745c591461026657600080fd5b8063081812fc11610153578063081812fc146101c6578063095ea7b3146101fe57806318160ddd1461021357600080fd5b806301ffc9a71461016f57806306fdde03146101a4575b600080fd5b34801561017b57600080fd5b5061018f61018a3660046113f1565b610456565b60405190151581526020015b60405180910390f35b3480156101b057600080fd5b506101b961049b565b60405161019b9190611415565b3480156101d257600080fd5b506101e66101e1366004611463565b610529565b6040516001600160a01b03909116815260200161019b565b61021161020c366004611498565b610550565b005b34801561021f57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000060a01c5b60405190815260200161019b565b6102116102613660046114c2565b610651565b34801561027257600080fd5b50610245610281366004611498565b61084d565b6102116102943660046114fe565b610914565b6102116102a73660046114c2565b610a5a565b3480156102b857600080fd5b506102456102c7366004611463565b610aef565b6102116102da366004611498565b610afe565b3480156102eb57600080fd5b506101e66102fa366004611463565b610d9f565b34801561030b57600080fd5b5061024561031a36600461157a565b610def565b34801561032b57600080fd5b5060408051808201909152600481527f504152540000000000000000000000000000000000000000000000000000000060208201526101b9565b34801561037157600080fd5b506102116103803660046115a3565b610e6f565b34801561039157600080fd5b506102456103a0366004611463565b610f1a565b6102116103b33660046115da565b610f9f565b3480156103c457600080fd5b506102456103d3366004611463565b6110a1565b3480156103e457600080fd5b506101b96103f3366004611463565b611114565b34801561040457600080fd5b506101b961126a565b34801561041957600080fd5b5061018f610428366004611675565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b600061046182611277565b8061049557507f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b600380546104a8906116a8565b80601f01602080910402602001604051908101604052809291908181526020018280546104d4906116a8565b80156105215780601f106104f657610100808354040283529160200191610521565b820191906000526020600020905b81548152906001019060200180831161050457829003601f168201915b505050505081565b600061053482611310565b506000908152600160205260409020546001600160a01b031690565b600061055b82610d9f565b9050336001600160a01b038216148061059757506001600160a01b038116600090815260026020908152604080832033845290915290205460ff165b6105e85760405162461bcd60e51b815260206004820152601360248201527f4552432d3732312073656e6465722064656e790000000000000000000000000060448201526064015b60405180910390fd5b600082815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061065c82610d9f565b9050806001600160a01b0316846001600160a01b0316146106bf5760405162461bcd60e51b815260206004820152601060248201527f4552432d3732312066726f6d20e290950000000000000000000000000000000060448201526064016105df565b6106c883611385565b6000828152600160205260409020546001600160a01b039081169082163314806106fa5750336001600160a01b038216145b8061072857506001600160a01b038216600090815260026020908152604080832033845290915290205460ff165b6107745760405162461bcd60e51b815260206004820152601360248201527f4552432d3732312073656e6465722064656e790000000000000000000000000060448201526064016105df565b6001600160a01b038116156107e257600083815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169055518491906001600160a01b038516907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45b600083815260208190526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0388811691821790925591518693918916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45050505050565b600061085883611385565b5060005b7f000000000000000000000000000000000000000000000000000000000000000060a01c8110156108cc57826001600160a01b031661089a82610d9f565b6001600160a01b0316036108ba578115610495576108b7826116f8565b91505b806108c48161170f565b91505061085c565b60405162461bcd60e51b815260206004820152601d60248201527f4552432d37323120696e64657820657863656564732062616c616e636500000060448201526064016105df565b80516bffffffffffffffffffffffff1660000361094057336000908152600560205260408120556109fd565b61094b33600061084d565b5033600090815260026020908152604080832030845290915290205460ff166109b65760405162461bcd60e51b815260206004820181905260248201527f636f6e7472616374206e65656473206f70657261746f7220617070726f76616c60448201526064016105df565b3360009081526005602090815260409091208251918301516001600160a01b03166c01000000000000000000000000026bffffffffffffffffffffffff9092169190911790555b6040805182516bffffffffffffffffffffffff1681526020808401516001600160a01b031690820152338183015290517feb6c7d1cd53bd4a9d7c4478386be075d97a6372e435e72cb37313dfa17ad00d79181900360600190a150565b6040517fb88d4fde0000000000000000000000000000000000000000000000000000000081526001600160a01b03808516600483015283166024820152604481018290526080606482015260006084820152309063b88d4fde9060a4015b600060405180830381600087803b158015610ad257600080fd5b505af1158015610ae6573d6000803e3d6000fd5b50505050505050565b6000610afa82611310565b5090565b6001600160a01b0380831660009081526005602090815260408083208151808301909252546bffffffffffffffffffffffff81168083526c0100000000000000000000000090910490941691810191909152919003610b9f5760405162461bcd60e51b815260206004820152600860248201527f6e6f206f6666657200000000000000000000000000000000000000000000000060448201526064016105df565b805160208201516040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201526bffffffffffffffffffffffff909216916001600160a01b039091169063dd62ed3e90604401602060405180830381865afa158015610c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3f9190611728565b14610c8c5760405162461bcd60e51b815260206004820152601260248201527f616c6c6f77616e6365206d69736d61746368000000000000000000000000000060448201526064016105df565b602081015181516040516323b872dd60e01b81523360048201526001600160a01b0386811660248301526bffffffffffffffffffffffff90921660448201529116906323b872dd906064016020604051808303816000875af1158015610cf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1a9190611741565b610d665760405162461bcd60e51b815260206004820152600660248201527f6e6f20706179000000000000000000000000000000000000000000000000000060448201526064016105df565b6040516323b872dd60e01b81526001600160a01b03841660048201523360248201526044810183905230906323b872dd90606401610ab8565b6000610daa82611310565b6000828152602081905260409020546001600160a01b03168061049557507f000000000000000000000000000000000000000000000000000000000000000092915050565b6000610dfa82611385565b6000805b7f000000000000000000000000000000000000000000000000000000000000000060a01c811015610e6857836001600160a01b0316610e3c82610d9f565b6001600160a01b031603610e5657610e538261170f565b91505b80610e608161170f565b915050610dfe565b5092915050565b8015610ea8573360009081526002602090815260408083206001600160a01b03861684529091529020805460ff19166001179055610ed4565b3360009081526002602090815260408083206001600160a01b03861684529091529020805460ff191690555b60405181151581526001600160a01b0383169033907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319060200160405180910390a35050565b60007f000000000000000000000000000000000000000000000000000000000000000060a01c808310610f505750600092915050565b7f0000000000000000000000000000000000000000000000000000000000000000603081901c600190810b90610f8d90602084901c900b8661175e565b610f9791906117aa565b949350505050565b610faa858585610651565b32330361109a576040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063150b7a02906110009033908a908990899089906004016117d2565b6020604051808303816000875af115801561101f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110439190611826565b6001600160e01b0319161461109a5760405162461bcd60e51b815260206004820152601760248201527f455243373231546f6b656e5265636569766572206d697300000000000000000060448201526064016105df565b5050505050565b60007f000000000000000000000000000000000000000000000000000000000000000060a01c8083106110d75750600092915050565b7f0000000000000000000000000000000000000000000000000000000000000000605081901c600190810b90610f8d90604084901c900b8661175e565b606061111f82611310565b682f706172742d303030611134600a84611859565b61113e908261186d565b90506008600a61114e8186611880565b6111589190611859565b611163911b8261186d565b90506010600a611174606486611880565b61117e9190611859565b611189911b8261186d565b604080517f697066733a2f2f6630313730313232300000000000000000000000000000000060208201527f000000000000000000000000000000000000000000000000000000000000000060308201527f0000000000000000000000000000000000000000000000000000000000000000605082015260b89290921b7fffffffffffffffffff00000000000000000000000000000000000000000000001660708301527f2e6a736f6e00000000000000000000000000000000000000000000000000000060798301528051605e818403018152607e90920190529392505050565b600480546104a8906116a8565b60007f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b0319831614806112da57507f780e9d63000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b806104955750506001600160e01b0319167f01ffc9a7000000000000000000000000000000000000000000000000000000001490565b7f000000000000000000000000000000000000000000000000000000000000000060a01c81106113825760405162461bcd60e51b815260206004820152601160248201527f4552432d37323120746f6b656e20e2909500000000000000000000000000000060448201526064016105df565b50565b6001600160a01b0381166113825760405162461bcd60e51b815260206004820152601160248201527f4552432d3732312061646472657373203000000000000000000000000000000060448201526064016105df565b6001600160e01b03198116811461138257600080fd5b60006020828403121561140357600080fd5b813561140e816113db565b9392505050565b600060208083528351808285015260005b8181101561144257858101830151858201604001528201611426565b506000604082860101526040601f19601f8301168501019250505092915050565b60006020828403121561147557600080fd5b5035919050565b80356001600160a01b038116811461149357600080fd5b919050565b600080604083850312156114ab57600080fd5b6114b48361147c565b946020939093013593505050565b6000806000606084860312156114d757600080fd5b6114e08461147c565b92506114ee6020850161147c565b9150604084013590509250925092565b60006040828403121561151057600080fd5b6040516040810181811067ffffffffffffffff8211171561154157634e487b7160e01b600052604160045260246000fd5b60405282356bffffffffffffffffffffffff8116811461156057600080fd5b815261156e6020840161147c565b60208201529392505050565b60006020828403121561158c57600080fd5b61140e8261147c565b801515811461138257600080fd5b600080604083850312156115b657600080fd5b6115bf8361147c565b915060208301356115cf81611595565b809150509250929050565b6000806000806000608086880312156115f257600080fd5b6115fb8661147c565b94506116096020870161147c565b935060408601359250606086013567ffffffffffffffff8082111561162d57600080fd5b818801915088601f83011261164157600080fd5b81358181111561165057600080fd5b89602082850101111561166257600080fd5b9699959850939650602001949392505050565b6000806040838503121561168857600080fd5b6116918361147c565b915061169f6020840161147c565b90509250929050565b600181811c908216806116bc57607f821691505b6020821081036116dc57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600081611707576117076116e2565b506000190190565b600060018201611721576117216116e2565b5060010190565b60006020828403121561173a57600080fd5b5051919050565b60006020828403121561175357600080fd5b815161140e81611595565b808202600082127f800000000000000000000000000000000000000000000000000000000000000084141615611796576117966116e2565b8181058314821517610495576104956116e2565b80820182811260008312801582168215821617156117ca576117ca6116e2565b505092915050565b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b60006020828403121561183857600080fd5b815161140e816113db565b634e487b7160e01b600052601260045260246000fd5b60008261186857611868611843565b500690565b80820180821115610495576104956116e2565b60008261188f5761188f611843565b50049056fea2646970667358221220ad1cda1626531d306efc30a9901630552e1810a6cac7d35273dce0b744d7af7464736f6c6343000814003300000000000000000000000090b90c044052bb6e4aafc390fbd4492b0fae97aa000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000848049c0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486635326364363138643733346162616132373463323964656163636165376632633465396430386631356263386436663630373964626536313361643638326300000000000000000000000000000000000000000000000000000000000002bcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd00000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000000230000000000000000000000000000000000000000000000000000000000000021506174656b205068696c69707065204e617574696c75732035373131522d3030310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073434363139373300000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061016a5760003560e01c806359dfa5b8116100cb578063b5be93061161007f578063c87b56dd11610059578063c87b56dd146103d8578063e22868e9146103f8578063e985e9c51461040d57600080fd5b8063b5be930614610385578063b88d4fde146103a5578063c19d7ab3146103b857600080fd5b806370a08231116100b057806370a08231146102ff57806395d89b411461031f578063a22cb4651461036557600080fd5b806359dfa5b8146102cc5780636352211e146102df57600080fd5b806323b872dd11610122578063306b23f011610107578063306b23f01461028657806342842e0e146102995780634f6ccce7146102ac57600080fd5b806323b872dd146102535780632f745c591461026657600080fd5b8063081812fc11610153578063081812fc146101c6578063095ea7b3146101fe57806318160ddd1461021357600080fd5b806301ffc9a71461016f57806306fdde03146101a4575b600080fd5b34801561017b57600080fd5b5061018f61018a3660046113f1565b610456565b60405190151581526020015b60405180910390f35b3480156101b057600080fd5b506101b961049b565b60405161019b9190611415565b3480156101d257600080fd5b506101e66101e1366004611463565b610529565b6040516001600160a01b03909116815260200161019b565b61021161020c366004611498565b610550565b005b34801561021f57600080fd5b507f00000000000000000000002d90b90c044052bb6e4aafc390fbd4492b0fae97aa60a01c5b60405190815260200161019b565b6102116102613660046114c2565b610651565b34801561027257600080fd5b50610245610281366004611498565b61084d565b6102116102943660046114fe565b610914565b6102116102a73660046114c2565b610a5a565b3480156102b857600080fd5b506102456102c7366004611463565b610aef565b6102116102da366004611498565b610afe565b3480156102eb57600080fd5b506101e66102fa366004611463565b610d9f565b34801561030b57600080fd5b5061024561031a36600461157a565b610def565b34801561032b57600080fd5b5060408051808201909152600481527f504152540000000000000000000000000000000000000000000000000000000060208201526101b9565b34801561037157600080fd5b506102116103803660046115a3565b610e6f565b34801561039157600080fd5b506102456103a0366004611463565b610f1a565b6102116103b33660046115da565b610f9f565b3480156103c457600080fd5b506102456103d3366004611463565b6110a1565b3480156103e457600080fd5b506101b96103f3366004611463565b611114565b34801561040457600080fd5b506101b961126a565b34801561041957600080fd5b5061018f610428366004611675565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b600061046182611277565b8061049557507f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b600380546104a8906116a8565b80601f01602080910402602001604051908101604052809291908181526020018280546104d4906116a8565b80156105215780601f106104f657610100808354040283529160200191610521565b820191906000526020600020905b81548152906001019060200180831161050457829003601f168201915b505050505081565b600061053482611310565b506000908152600160205260409020546001600160a01b031690565b600061055b82610d9f565b9050336001600160a01b038216148061059757506001600160a01b038116600090815260026020908152604080832033845290915290205460ff165b6105e85760405162461bcd60e51b815260206004820152601360248201527f4552432d3732312073656e6465722064656e790000000000000000000000000060448201526064015b60405180910390fd5b600082815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061065c82610d9f565b9050806001600160a01b0316846001600160a01b0316146106bf5760405162461bcd60e51b815260206004820152601060248201527f4552432d3732312066726f6d20e290950000000000000000000000000000000060448201526064016105df565b6106c883611385565b6000828152600160205260409020546001600160a01b039081169082163314806106fa5750336001600160a01b038216145b8061072857506001600160a01b038216600090815260026020908152604080832033845290915290205460ff165b6107745760405162461bcd60e51b815260206004820152601360248201527f4552432d3732312073656e6465722064656e790000000000000000000000000060448201526064016105df565b6001600160a01b038116156107e257600083815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169055518491906001600160a01b038516907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45b600083815260208190526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0388811691821790925591518693918916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45050505050565b600061085883611385565b5060005b7f00000000000000000000002d90b90c044052bb6e4aafc390fbd4492b0fae97aa60a01c8110156108cc57826001600160a01b031661089a82610d9f565b6001600160a01b0316036108ba578115610495576108b7826116f8565b91505b806108c48161170f565b91505061085c565b60405162461bcd60e51b815260206004820152601d60248201527f4552432d37323120696e64657820657863656564732062616c616e636500000060448201526064016105df565b80516bffffffffffffffffffffffff1660000361094057336000908152600560205260408120556109fd565b61094b33600061084d565b5033600090815260026020908152604080832030845290915290205460ff166109b65760405162461bcd60e51b815260206004820181905260248201527f636f6e7472616374206e65656473206f70657261746f7220617070726f76616c60448201526064016105df565b3360009081526005602090815260409091208251918301516001600160a01b03166c01000000000000000000000000026bffffffffffffffffffffffff9092169190911790555b6040805182516bffffffffffffffffffffffff1681526020808401516001600160a01b031690820152338183015290517feb6c7d1cd53bd4a9d7c4478386be075d97a6372e435e72cb37313dfa17ad00d79181900360600190a150565b6040517fb88d4fde0000000000000000000000000000000000000000000000000000000081526001600160a01b03808516600483015283166024820152604481018290526080606482015260006084820152309063b88d4fde9060a4015b600060405180830381600087803b158015610ad257600080fd5b505af1158015610ae6573d6000803e3d6000fd5b50505050505050565b6000610afa82611310565b5090565b6001600160a01b0380831660009081526005602090815260408083208151808301909252546bffffffffffffffffffffffff81168083526c0100000000000000000000000090910490941691810191909152919003610b9f5760405162461bcd60e51b815260206004820152600860248201527f6e6f206f6666657200000000000000000000000000000000000000000000000060448201526064016105df565b805160208201516040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201526bffffffffffffffffffffffff909216916001600160a01b039091169063dd62ed3e90604401602060405180830381865afa158015610c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3f9190611728565b14610c8c5760405162461bcd60e51b815260206004820152601260248201527f616c6c6f77616e6365206d69736d61746368000000000000000000000000000060448201526064016105df565b602081015181516040516323b872dd60e01b81523360048201526001600160a01b0386811660248301526bffffffffffffffffffffffff90921660448201529116906323b872dd906064016020604051808303816000875af1158015610cf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1a9190611741565b610d665760405162461bcd60e51b815260206004820152600660248201527f6e6f20706179000000000000000000000000000000000000000000000000000060448201526064016105df565b6040516323b872dd60e01b81526001600160a01b03841660048201523360248201526044810183905230906323b872dd90606401610ab8565b6000610daa82611310565b6000828152602081905260409020546001600160a01b03168061049557507f00000000000000000000002d90b90c044052bb6e4aafc390fbd4492b0fae97aa92915050565b6000610dfa82611385565b6000805b7f00000000000000000000002d90b90c044052bb6e4aafc390fbd4492b0fae97aa60a01c811015610e6857836001600160a01b0316610e3c82610d9f565b6001600160a01b031603610e5657610e538261170f565b91505b80610e608161170f565b915050610dfe565b5092915050565b8015610ea8573360009081526002602090815260408083206001600160a01b03861684529091529020805460ff19166001179055610ed4565b3360009081526002602090815260408083206001600160a01b03861684529091529020805460ff191690555b60405181151581526001600160a01b0383169033907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319060200160405180910390a35050565b60007f00000000000000000000002d90b90c044052bb6e4aafc390fbd4492b0fae97aa60a01c808310610f505750600092915050565b7f000000000000000000000000000000000000000002bc002302bcfffd00000000603081901c600190810b90610f8d90602084901c900b8661175e565b610f9791906117aa565b949350505050565b610faa858585610651565b32330361109a576040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063150b7a02906110009033908a908990899089906004016117d2565b6020604051808303816000875af115801561101f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110439190611826565b6001600160e01b0319161461109a5760405162461bcd60e51b815260206004820152601760248201527f455243373231546f6b656e5265636569766572206d697300000000000000000060448201526064016105df565b5050505050565b60007f00000000000000000000002d90b90c044052bb6e4aafc390fbd4492b0fae97aa60a01c8083106110d75750600092915050565b7f000000000000000000000000000000000000000002bc002302bcfffd00000000605081901c600190810b90610f8d90604084901c900b8661175e565b606061111f82611310565b682f706172742d303030611134600a84611859565b61113e908261186d565b90506008600a61114e8186611880565b6111589190611859565b611163911b8261186d565b90506010600a611174606486611880565b61117e9190611859565b611189911b8261186d565b604080517f697066733a2f2f6630313730313232300000000000000000000000000000000060208201527f663532636436313864373334616261613237346332396465616363616537663260308201527f6334653964303866313562633864366636303739646265363133616436383263605082015260b89290921b7fffffffffffffffffff00000000000000000000000000000000000000000000001660708301527f2e6a736f6e00000000000000000000000000000000000000000000000000000060798301528051605e818403018152607e90920190529392505050565b600480546104a8906116a8565b60007f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b0319831614806112da57507f780e9d63000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b806104955750506001600160e01b0319167f01ffc9a7000000000000000000000000000000000000000000000000000000001490565b7f00000000000000000000002d90b90c044052bb6e4aafc390fbd4492b0fae97aa60a01c81106113825760405162461bcd60e51b815260206004820152601160248201527f4552432d37323120746f6b656e20e2909500000000000000000000000000000060448201526064016105df565b50565b6001600160a01b0381166113825760405162461bcd60e51b815260206004820152601160248201527f4552432d3732312061646472657373203000000000000000000000000000000060448201526064016105df565b6001600160e01b03198116811461138257600080fd5b60006020828403121561140357600080fd5b813561140e816113db565b9392505050565b600060208083528351808285015260005b8181101561144257858101830151858201604001528201611426565b506000604082860101526040601f19601f8301168501019250505092915050565b60006020828403121561147557600080fd5b5035919050565b80356001600160a01b038116811461149357600080fd5b919050565b600080604083850312156114ab57600080fd5b6114b48361147c565b946020939093013593505050565b6000806000606084860312156114d757600080fd5b6114e08461147c565b92506114ee6020850161147c565b9150604084013590509250925092565b60006040828403121561151057600080fd5b6040516040810181811067ffffffffffffffff8211171561154157634e487b7160e01b600052604160045260246000fd5b60405282356bffffffffffffffffffffffff8116811461156057600080fd5b815261156e6020840161147c565b60208201529392505050565b60006020828403121561158c57600080fd5b61140e8261147c565b801515811461138257600080fd5b600080604083850312156115b657600080fd5b6115bf8361147c565b915060208301356115cf81611595565b809150509250929050565b6000806000806000608086880312156115f257600080fd5b6115fb8661147c565b94506116096020870161147c565b935060408601359250606086013567ffffffffffffffff8082111561162d57600080fd5b818801915088601f83011261164157600080fd5b81358181111561165057600080fd5b89602082850101111561166257600080fd5b9699959850939650602001949392505050565b6000806040838503121561168857600080fd5b6116918361147c565b915061169f6020840161147c565b90509250929050565b600181811c908216806116bc57607f821691505b6020821081036116dc57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600081611707576117076116e2565b506000190190565b600060018201611721576117216116e2565b5060010190565b60006020828403121561173a57600080fd5b5051919050565b60006020828403121561175357600080fd5b815161140e81611595565b808202600082127f800000000000000000000000000000000000000000000000000000000000000084141615611796576117966116e2565b8181058314821517610495576104956116e2565b80820182811260008312801582168215821617156117ca576117ca6116e2565b505092915050565b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b60006020828403121561183857600080fd5b815161140e816113db565b634e487b7160e01b600052601260045260246000fd5b60008261186857611868611843565b500690565b80820180821115610495576104956116e2565b60008261188f5761188f611843565b50049056fea2646970667358221220ad1cda1626531d306efc30a9901630552e1810a6cac7d35273dce0b744d7af7464736f6c63430008140033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000090b90c044052bb6e4aafc390fbd4492b0fae97aa000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000848049c0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486635326364363138643733346162616132373463323964656163636165376632633465396430386631356263386436663630373964626536313361643638326300000000000000000000000000000000000000000000000000000000000002bcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd00000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000000230000000000000000000000000000000000000000000000000000000000000021506174656b205068696c69707065204e617574696c75732035373131522d3030310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073434363139373300000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : productHolder (address): 0x90b90c044052Bb6e4aAfc390Fbd4492b0FAe97aa
Arg [1] : productName (string): Patek Philippe Nautilus 5711R-001
Arg [2] : productSerialCode (string): 4461973
Arg [3] : partCount (uint256): 45
Arg [4] : perToken (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
Arg [5] : IPFSHashHex1 (bytes32): 0x6635326364363138643733346162616132373463323964656163636165376632
Arg [6] : IPFSHashHex2 (bytes32): 0x6334653964303866313562633864366636303739646265363133616436383263
Arg [7] : bc (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]

-----Encoded View---------------
17 Constructor Arguments found :
Arg [0] : 00000000000000000000000090b90c044052bb6e4aafc390fbd4492b0fae97aa
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000002d
Arg [4] : 00000000000000000000000000000000000000000000000000000000848049c0
Arg [5] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [6] : 6635326364363138643733346162616132373463323964656163636165376632
Arg [7] : 6334653964303866313562633864366636303739646265363133616436383263
Arg [8] : 00000000000000000000000000000000000000000000000000000000000002bc
Arg [9] : fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd
Arg [10] : 00000000000000000000000000000000000000000000000000000000000002bc
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [13] : 506174656b205068696c69707065204e617574696c75732035373131522d3030
Arg [14] : 3100000000000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [16] : 3434363139373300000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

18379:5735:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20537:200;;;;;;;;;;-1:-1:-1;20537:200:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;20537:200:0;;;;;;;;18792:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;17734:157::-;;;;;;;;;;-1:-1:-1;17734:157:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1540:55:1;;;1522:74;;1510:2;1495:18;17734:157:0;1376:226:1;17148:300:0;;;;;;:::i;:::-;;:::i;:::-;;14693:127;;;;;;;;;;-1:-1:-1;14784:25:0;14813:3;14784:32;14693:127;;;2213:25:1;;;2201:2;2186:18;14693:127:0;2067:177:1;16493:651:0;;;;;;:::i;:::-;;:::i;15018:363::-;;;;;;;;;;-1:-1:-1;15018:363:0;;;;;:::i;:::-;;:::i;23082:414::-;;;;;;:::i;:::-;;:::i;16329:160::-;;;;;;:::i;:::-;;:::i;14877:137::-;;;;;;;;;;-1:-1:-1;14877:137:0;;;;;:::i;:::-;;:::i;23602:507::-;;;;;;:::i;:::-;;:::i;15691:254::-;;;;;;;;;;-1:-1:-1;15691:254:0;;;;;:::i;:::-;;:::i;15385:302::-;;;;;;;;;;-1:-1:-1;15385:302:0;;;;;:::i;:::-;;:::i;20741:100::-;;;;;;;;;;-1:-1:-1;20824:13:0;;;;;;;;;;;;;;;;;20741:100;;17452:278;;;;;;;;;;-1:-1:-1;17452:278:0;;;;;:::i;:::-;;:::i;22179:230::-;;;;;;;;;;-1:-1:-1;22179:230:0;;;;;:::i;:::-;;:::i;15949:376::-;;;;;;:::i;:::-;;:::i;22608:231::-;;;;;;;;;;-1:-1:-1;22608:231:0;;;;;:::i;:::-;;:::i;21343:629::-;;;;;;;;;;-1:-1:-1;21343:629:0;;;;;:::i;:::-;;:::i;18885:24::-;;;;;;;;;;;;;:::i;17895:152::-;;;;;;;;;;-1:-1:-1;17895:152:0;;;;;:::i;:::-;-1:-1:-1;;;;;18009:24:0;;;17992:4;18009:24;;;:17;:24;;;;;;;;:34;;;;;;;;;;;;;;;17895:152;20537:200;20627:4;20644:36;20668:11;20644:23;:36::i;:::-;:71;;;-1:-1:-1;20690:25:0;-1:-1:-1;;;;;;20690:25:0;;;20644:71;20637:78;20537:200;-1:-1:-1;;20537:200:0:o;18792:43::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17734:157::-;17810:16;17832:21;17845:7;17832:12;:21::i;:::-;-1:-1:-1;17864:23:0;;;;:14;:23;;;;;;-1:-1:-1;;;;;17864:23:0;;17734:157::o;17148:300::-;17230:13;17246:16;17254:7;17246;:16::i;:::-;17230:32;-1:-1:-1;17293:10:0;-1:-1:-1;;;;;17293:19:0;;;;:58;;-1:-1:-1;;;;;;18009:24:0;;17992:4;18009:24;;;:17;:24;;;;;;;;17340:10;18009:34;;;;;;;;;;17316:35;17285:90;;;;-1:-1:-1;;;17285:90:0;;5906:2:1;17285:90:0;;;5888:21:1;5945:2;5925:18;;;5918:30;5984:21;5964:18;;;5957:49;6023:18;;17285:90:0;;;;;;;;;17379:23;;;;:14;:23;;;;;;:28;;-1:-1:-1;;17379:28:0;-1:-1:-1;;;;;17379:28:0;;;;;;;;;17416;;17379:23;;17416:28;;;;;;;17226:222;17148:300;;:::o;16493:651::-;16594:13;16610:16;16618:7;16610;:16::i;:::-;16594:32;;16665:5;-1:-1:-1;;;;;16657:13:0;:4;-1:-1:-1;;;;;16657:13:0;;16649:45;;;;-1:-1:-1;;;16649:45:0;;6254:2:1;16649:45:0;;;6236:21:1;6293:2;6273:18;;;6266:30;6332:66;6312:18;;;6305:94;6416:18;;16649:45:0;6052:388:1;16649:45:0;16698:18;16713:2;16698:14;:18::i;:::-;16722:16;16741:23;;;:14;:23;;;;;;-1:-1:-1;;;;;16741:23:0;;;;16776:19;;:10;:19;;:45;;-1:-1:-1;16799:10:0;-1:-1:-1;;;;;16799:22:0;;;16776:45;:84;;;-1:-1:-1;;;;;;18009:24:0;;17992:4;18009:24;;;:17;:24;;;;;;;;16849:10;18009:34;;;;;;;;;;16825:35;16768:116;;;;-1:-1:-1;;;16768:116:0;;5906:2:1;16768:116:0;;;5888:21:1;5945:2;5925:18;;;5918:30;5984:21;5964:18;;;5957:49;6023:18;;16768:116:0;5704:343:1;16768:116:0;-1:-1:-1;;;;;16943:22:0;;;16939:114;;16979:23;;;;:14;:23;;;;;;16972:30;;-1:-1:-1;;16972:30:0;;;17012:36;16994:7;;16979:23;-1:-1:-1;;;;;17012:36:0;;;;;16979:23;;17012:36;16939:114;17079:11;:20;;;;;;;;;;;:25;;-1:-1:-1;;17079:25:0;-1:-1:-1;;;;;17079:25:0;;;;;;;;;17113:27;;17079:20;;17113:27;;;;;;;16590:554;;16493:651;;;:::o;15018:363::-;15125:15;15146:21;15161:5;15146:14;:21::i;:::-;-1:-1:-1;15186:1:0;15171:164;14784:25;14813:3;14784:32;15189:7;:23;15171:164;;;15254:5;-1:-1:-1;;;;;15234:25:0;:16;15242:7;15234;:16::i;:::-;-1:-1:-1;;;;;15234:25:0;;15230:101;;15267:44;;15290:14;15267:44;15318:7;;;:::i;:::-;;;15230:101;15214:9;;;;:::i;:::-;;;;15171:164;;;15338:39;;-1:-1:-1;;;15338:39:0;;7117:2:1;15338:39:0;;;7099:21:1;7156:2;7136:18;;;7129:30;7195:31;7175:18;;;7168:59;7244:18;;15338:39:0;6915:353:1;23082:414:0;23160:15;;:20;;:15;:20;23156:281;;23209:10;23194:26;;;;:14;:26;;;;;23187:33;23156:281;;;23236:34;23256:10;23268:1;23236:19;:34::i;:::-;-1:-1:-1;23327:10:0;17992:4;18009:24;;;:17;:24;;;;;;;;23347:4;18009:34;;;;;;;;;;23302:88;;;;-1:-1:-1;;;23302:88:0;;7475:2:1;23302:88:0;;;7457:21:1;;;7494:18;;;7487:30;7553:34;7533:18;;;7526:62;7605:18;;23302:88:0;7273:356:1;23302:88:0;23410:10;23395:26;;;;:14;:26;;;;;;;;:37;;;;;;-1:-1:-1;;;;;23395:37:0;;;;;;;;;;;;;23156:281;23445:47;;;7892:13:1;;7907:26;7888:46;7870:65;;7982:4;7970:17;;;7964:24;-1:-1:-1;;;;;8087:21:1;8065:20;;;8058:51;23481:10:0;8125:18:1;;;8118:43;23445:47:0;;;;;;;7858:2:1;23445:47:0;;;23082:414;:::o;16329:160::-;16441:44;;;;;-1:-1:-1;;;;;8518:15:1;;;16441:44:0;;;8500:34:1;8570:15;;8550:18;;;8543:43;8602:18;;;8595:34;;;8665:3;8645:18;;;8638:31;-1:-1:-1;8685:19:1;;;8678:30;16441:4:0;;:21;;8725:19:1;;16441:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16329:160;;;:::o;14877:137::-;14962:7;14975:19;14988:5;14975:12;:19::i;:::-;-1:-1:-1;15005:5:0;14877:137::o;23602:507::-;-1:-1:-1;;;;;23706:22:0;;;23676:27;23706:22;;;:14;:22;;;;;;;;23676:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23740:17;;23732:38;;;;-1:-1:-1;;;23732:38:0;;8957:2:1;23732:38:0;;;8939:21:1;8996:1;8976:18;;;8969:29;9034:10;9014:18;;;9007:38;9062:18;;23732:38:0;8755:331:1;23732:38:0;23906:12;;23850:14;;;;23844:58;;;;;23876:10;23844:58;;;9326:34:1;23896:4:0;9376:18:1;;;9369:43;23844:74:0;;;;;-1:-1:-1;;;;;23844:31:0;;;;;;9238:18:1;;23844:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:74;23836:105;;;;-1:-1:-1;;;23836:105:0;;9814:2:1;23836:105:0;;;9796:21:1;9853:2;9833:18;;;9826:30;9892:20;9872:18;;;9865:48;9930:18;;23836:105:0;9612:342:1;23836:105:0;23970:14;;;;24019:12;;23964:68;;-1:-1:-1;;;23964:68:0;;23999:10;23964:68;;;10221:34:1;-1:-1:-1;;;;;10291:15:1;;;10271:18;;;10264:43;10355:26;10343:39;;;10323:18;;;10316:67;23964:34:0;;;;;10133:18:1;;23964:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23956:87;;;;-1:-1:-1;;;23956:87:0;;10846:2:1;23956:87:0;;;10828:21:1;10885:1;10865:18;;;10858:29;10923:8;10903:18;;;10896:36;10949:18;;23956:87:0;10644:329:1;23956:87:0;24059:46;;-1:-1:-1;;;24059:46:0;;-1:-1:-1;;;;;11259:15:1;;24059:46:0;;;11241:34:1;24085:10:0;11291:18:1;;;11284:43;11343:18;;;11336:34;;;24059:4:0;;:17;;11153:18:1;;24059:46:0;10978:398:1;15691:254:0;15763:7;15776:21;15789:7;15776:12;:21::i;:::-;15801:13;15817:20;;;;;;;;;;;-1:-1:-1;;;;;15817:20:0;;15841:85;;-1:-1:-1;15894:25:0;;15691:254;-1:-1:-1;;15691:254:0:o;15385:302::-;15457:7;15470:21;15485:5;15470:14;:21::i;:::-;15495:15;15548;15543:123;14784:25;14813:3;14784:32;15569:7;:23;15543:123;;;15634:5;-1:-1:-1;;;;;15614:25:0;:16;15622:7;15614;:16::i;:::-;-1:-1:-1;;;;;15614:25:0;;15610:52;;15647:9;;;:::i;:::-;;;15610:52;15594:9;;;;:::i;:::-;;;;15543:123;;;-1:-1:-1;15676:7:0;15385:302;-1:-1:-1;;15385:302:0:o;17452:278::-;17544:8;17540:132;;;17577:10;17559:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;17559:39:0;;;;;;;;;:46;;-1:-1:-1;;17559:46:0;17601:4;17559:46;;;17540:132;;;17646:10;17628:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;17628:39:0;;;;;;;;;17621:46;;-1:-1:-1;;17621:46:0;;;17540:132;17680:46;;611:14:1;;604:22;586:41;;-1:-1:-1;;;;;17680:46:0;;;17695:10;;17680:46;;574:2:1;559:18;17680:46:0;;;;;;;17452:278;;:::o;22179:230::-;22237:12;14784:25;14813:3;14784:32;22285:12;;;22281:26;;-1:-1:-1;22306:1:0;;22179:230;-1:-1:-1;;22179:230:0:o;22281:26::-;22323:6;22401:2;22396:7;;;22340:65;;;;;:40;;22376:2;22371:7;;;22340:40;;22347:7;22340:40;:::i;:::-;:65;;;;:::i;:::-;22333:72;22179:230;-1:-1:-1;;;;22179:230:0:o;15949:376::-;16075:31;16088:4;16094:2;16098:7;16075:12;:31::i;:::-;16128:9;16114:10;:23;16110:212;;16167:73;;16244:45;16167:73;;;16244:45;-1:-1:-1;;;;;16167:40:0;;;16244:45;;16167:73;;16208:10;;16220:4;;16226:7;;16235:4;;;;16167:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;16167:122:0;;16159:158;;;;-1:-1:-1;;;16159:158:0;;13045:2:1;16159:158:0;;;13027:21:1;13084:2;13064:18;;;13057:30;13123:25;13103:18;;;13096:53;13166:18;;16159:158:0;12843:347:1;16159:158:0;15949:376;;;;;:::o;22608:231::-;22667:12;14784:25;14813:3;14784:32;22715:12;;;22711:26;;-1:-1:-1;22736:1:0;;22608:231;-1:-1:-1;;22608:231:0:o;22711:26::-;22753:6;22831:2;22826:7;;;22770:65;;;;;:40;;22806:2;22801:7;;;22770:40;;22777:7;22770:40;:::i;21343:629::-;21424:13;21443:21;21456:7;21443:12;:21::i;:::-;21509:20;21548:12;21558:2;21548:7;:12;:::i;:::-;21533:27;;;;:::i;:::-;;-1:-1:-1;21629:1:0;21622:2;21606:12;21622:2;21606:7;:12;:::i;:::-;21605:19;;;;:::i;:::-;21589:41;;21604:26;21589:41;;:::i;:::-;;-1:-1:-1;21691:2:0;21684;21667:13;21677:3;21667:7;:13;:::i;:::-;21666:20;;;;:::i;:::-;21650:43;;21665:28;21650:43;;:::i;:::-;21728:211;;;14005:79:1;21728:211:0;;;13993:92:1;21785:10:0;14101:12:1;;;14094:28;21797:10:0;14138:12:1;;;14131:28;21844:27:0;;;;;14201:66:1;14189:79;14175:12;;;14168:101;21905:33:0;14285:12:1;;;14278:101;21728:211:0;;;;;;;;;14395:12:1;;;;21728:211:0;;;21343:629;-1:-1:-1;;;21343:629:0:o;18885:24::-;;;;;;;:::i;14364:325::-;14457:4;14548:25;-1:-1:-1;;;;;;14548:25:0;;;;:71;;-1:-1:-1;14594:25:0;-1:-1:-1;;;;;;14594:25:0;;;14548:71;:127;;;-1:-1:-1;;;;;;;;14650:25:0;;;;14364:325::o;14239:121::-;14784:25;14813:3;14784:32;14306:9;:25;14298:58;;;;-1:-1:-1;;;14298:58:0;;14620:2:1;14298:58:0;;;14602:21:1;14659:2;14639:18;;;14632:30;14698:66;14678:18;;;14671:94;14782:18;;14298:58:0;14418:388:1;14298:58:0;14239:121;:::o;14060:102::-;-1:-1:-1;;;;;14121:15:0;;14113:45;;;;-1:-1:-1;;;14113:45:0;;15013:2:1;14113:45:0;;;14995:21:1;15052:2;15032:18;;;15025:30;15091:19;15071:18;;;15064:47;15128:18;;14113:45:0;14811:341:1;14:177;-1:-1:-1;;;;;;92:5:1;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;:::-;430:5;196:245;-1:-1:-1;;;196:245:1:o;638:548::-;750:4;779:2;808;797:9;790:21;840:6;834:13;883:6;878:2;867:9;863:18;856:34;908:1;918:140;932:6;929:1;926:13;918:140;;;1027:14;;;1023:23;;1017:30;993:17;;;1012:2;989:26;982:66;947:10;;918:140;;;922:3;1107:1;1102:2;1093:6;1082:9;1078:22;1074:31;1067:42;1177:2;1170;1166:7;1161:2;1153:6;1149:15;1145:29;1134:9;1130:45;1126:54;1118:62;;;;638:548;;;;:::o;1191:180::-;1250:6;1303:2;1291:9;1282:7;1278:23;1274:32;1271:52;;;1319:1;1316;1309:12;1271:52;-1:-1:-1;1342:23:1;;1191:180;-1:-1:-1;1191:180:1:o;1607:196::-;1675:20;;-1:-1:-1;;;;;1724:54:1;;1714:65;;1704:93;;1793:1;1790;1783:12;1704:93;1607:196;;;:::o;1808:254::-;1876:6;1884;1937:2;1925:9;1916:7;1912:23;1908:32;1905:52;;;1953:1;1950;1943:12;1905:52;1976:29;1995:9;1976:29;:::i;:::-;1966:39;2052:2;2037:18;;;;2024:32;;-1:-1:-1;;;1808:254:1:o;2249:328::-;2326:6;2334;2342;2395:2;2383:9;2374:7;2370:23;2366:32;2363:52;;;2411:1;2408;2401:12;2363:52;2434:29;2453:9;2434:29;:::i;:::-;2424:39;;2482:38;2516:2;2505:9;2501:18;2482:38;:::i;:::-;2472:48;;2567:2;2556:9;2552:18;2539:32;2529:42;;2249:328;;;;;:::o;2582:783::-;2672:6;2725:2;2713:9;2704:7;2700:23;2696:32;2693:52;;;2741:1;2738;2731:12;2693:52;2774:2;2768:9;2816:2;2808:6;2804:15;2885:6;2873:10;2870:22;2849:18;2837:10;2834:34;2831:62;2828:242;;;-1:-1:-1;;;2923:1:1;2916:88;3027:4;3024:1;3017:15;3055:4;3052:1;3045:15;2828:242;3086:2;3079:22;3123:23;;3186:26;3175:38;;3165:49;;3155:77;;3228:1;3225;3218:12;3155:77;3241:21;;3295:38;3329:2;3314:18;;3295:38;:::i;:::-;3290:2;3278:15;;3271:63;3282:6;2582:783;-1:-1:-1;;;2582:783:1:o;3370:186::-;3429:6;3482:2;3470:9;3461:7;3457:23;3453:32;3450:52;;;3498:1;3495;3488:12;3450:52;3521:29;3540:9;3521:29;:::i;3561:118::-;3647:5;3640:13;3633:21;3626:5;3623:32;3613:60;;3669:1;3666;3659:12;3684:315;3749:6;3757;3810:2;3798:9;3789:7;3785:23;3781:32;3778:52;;;3826:1;3823;3816:12;3778:52;3849:29;3868:9;3849:29;:::i;:::-;3839:39;;3928:2;3917:9;3913:18;3900:32;3941:28;3963:5;3941:28;:::i;:::-;3988:5;3978:15;;;3684:315;;;;;:::o;4184:808::-;4281:6;4289;4297;4305;4313;4366:3;4354:9;4345:7;4341:23;4337:33;4334:53;;;4383:1;4380;4373:12;4334:53;4406:29;4425:9;4406:29;:::i;:::-;4396:39;;4454:38;4488:2;4477:9;4473:18;4454:38;:::i;:::-;4444:48;;4539:2;4528:9;4524:18;4511:32;4501:42;;4594:2;4583:9;4579:18;4566:32;4617:18;4658:2;4650:6;4647:14;4644:34;;;4674:1;4671;4664:12;4644:34;4712:6;4701:9;4697:22;4687:32;;4757:7;4750:4;4746:2;4742:13;4738:27;4728:55;;4779:1;4776;4769:12;4728:55;4819:2;4806:16;4845:2;4837:6;4834:14;4831:34;;;4861:1;4858;4851:12;4831:34;4906:7;4901:2;4892:6;4888:2;4884:15;4880:24;4877:37;4874:57;;;4927:1;4924;4917:12;4874:57;4184:808;;;;-1:-1:-1;4184:808:1;;-1:-1:-1;4958:2:1;4950:11;;4980:6;4184:808;-1:-1:-1;;;4184:808:1:o;4997:260::-;5065:6;5073;5126:2;5114:9;5105:7;5101:23;5097:32;5094:52;;;5142:1;5139;5132:12;5094:52;5165:29;5184:9;5165:29;:::i;:::-;5155:39;;5213:38;5247:2;5236:9;5232:18;5213:38;:::i;:::-;5203:48;;4997:260;;;;;:::o;5262:437::-;5341:1;5337:12;;;;5384;;;5405:61;;5459:4;5451:6;5447:17;5437:27;;5405:61;5512:2;5504:6;5501:14;5481:18;5478:38;5475:218;;-1:-1:-1;;;5546:1:1;5539:88;5650:4;5647:1;5640:15;5678:4;5675:1;5668:15;5475:218;;5262:437;;;:::o;6445:184::-;-1:-1:-1;;;6494:1:1;6487:88;6594:4;6591:1;6584:15;6618:4;6615:1;6608:15;6634:136;6673:3;6701:5;6691:39;;6710:18;;:::i;:::-;-1:-1:-1;;;6746:18:1;;6634:136::o;6775:135::-;6814:3;6835:17;;;6832:43;;6855:18;;:::i;:::-;-1:-1:-1;6902:1:1;6891:13;;6775:135::o;9423:184::-;9493:6;9546:2;9534:9;9525:7;9521:23;9517:32;9514:52;;;9562:1;9559;9552:12;9514:52;-1:-1:-1;9585:16:1;;9423:184;-1:-1:-1;9423:184:1:o;10394:245::-;10461:6;10514:2;10502:9;10493:7;10489:23;10485:32;10482:52;;;10530:1;10527;10520:12;10482:52;10562:9;10556:16;10581:28;10603:5;10581:28;:::i;11381:292::-;11453:9;;;11420:7;11478:9;;11495:66;11489:73;;11474:89;11471:115;;;11566:18;;:::i;:::-;11639:1;11630:7;11625:16;11622:1;11619:23;11615:1;11608:9;11605:38;11595:72;;11647:18;;:::i;11678:216::-;11742:9;;;11770:11;;;11717:3;11800:9;;11828:10;;11824:19;;11853:10;;11845:19;;11821:44;11818:70;;;11868:18;;:::i;:::-;11818:70;;11678:216;;;;:::o;11899:685::-;12103:4;-1:-1:-1;;;;;12213:2:1;12205:6;12201:15;12190:9;12183:34;12265:2;12257:6;12253:15;12248:2;12237:9;12233:18;12226:43;;12305:6;12300:2;12289:9;12285:18;12278:34;12348:3;12343:2;12332:9;12328:18;12321:31;12389:6;12383:3;12372:9;12368:19;12361:35;12447:6;12439;12433:3;12422:9;12418:19;12405:49;12504:1;12498:3;12489:6;12478:9;12474:22;12470:32;12463:43;12574:3;12567:2;12563:7;12558:2;12550:6;12546:15;12542:29;12531:9;12527:45;12523:55;12515:63;;11899:685;;;;;;;;:::o;12589:249::-;12658:6;12711:2;12699:9;12690:7;12686:23;12682:32;12679:52;;;12727:1;12724;12717:12;12679:52;12759:9;12753:16;12778:30;12802:5;12778:30;:::i;13195:184::-;-1:-1:-1;;;13244:1:1;13237:88;13344:4;13341:1;13334:15;13368:4;13365:1;13358:15;13384:112;13416:1;13442;13432:35;;13447:18;;:::i;:::-;-1:-1:-1;13481:9:1;;13384:112::o;13501:125::-;13566:9;;;13587:10;;;13584:36;;;13600:18;;:::i;13631:120::-;13671:1;13697;13687:35;;13702:18;;:::i;:::-;-1:-1:-1;13736:9:1;;13631:120::o

Swarm Source

ipfs://ad1cda1626531d306efc30a9901630552e1810a6cac7d35273dce0b744d7af74

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Fractionalize rare watches into asset-backed NFTs, each featuring unique hand-drawn artworks representing specific components. Each collection is owned by a DAO, fostering transparency, participation, and true co-ownership.

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.