diff --git a/CommonDAO-DeedProtocol.code-workspace b/CommonDAO-DeedProtocol.code-workspace index 9dc673b1..227c0f38 100644 --- a/CommonDAO-DeedProtocol.code-workspace +++ b/CommonDAO-DeedProtocol.code-workspace @@ -2,7 +2,7 @@ "folders": [ { "name": "Frontend", - "path": "./packages/nextjs" + "path": "./packages/nextjs", }, { "name": "Hardhat", @@ -29,7 +29,9 @@ }, "[json]": { "editor.defaultFormatter": "vscode.json-language-features" - } + }, + "typescript.tsdk": "node_modules/typescript/lib", + "typescript.enablePromptUseWorkspaceTsdk": true }, "extensions": { "recommendations": [ diff --git a/packages/hardhat/.openzeppelin/sepolia.json b/packages/hardhat/.openzeppelin/sepolia.json new file mode 100644 index 00000000..c38b0b73 --- /dev/null +++ b/packages/hardhat/.openzeppelin/sepolia.json @@ -0,0 +1,511 @@ +{ + "manifestVersion": "3.2", + "proxies": [ + { + "address": "0xC2B2e27697670c9Fb686107a9831dC4E7a1cebE6", + "txHash": "0xd74235f83275a9c8bb1ed2e196afd31532777f09c021d1898c19144d2e5857a3", + "kind": "transparent" + }, + { + "address": "0xF34097Cc1e7523f531f725657DD19A55575FF403", + "txHash": "0xf6848d04c7249c49a8063bff7572c831574a1f9bb2d6e3e23db2f580f45c6cc0", + "kind": "transparent" + }, + { + "address": "0x78b9c24C210D88732939c59Bac500D9462a5356e", + "txHash": "0x3c1ad61da8668de6a63bef92e116b6ab458e49d5e133752931d508163fdb8b57", + "kind": "transparent" + }, + { + "address": "0x2274FC53C4524084A3978d5012228C7AAF6Ff0C9", + "txHash": "0xb2720f6ab6867e42b617e38a16143df32d910d37369db308cab9624faf226ffd", + "kind": "transparent" + }, + { + "address": "0x994cd3253c64fcd7eb185bd49b3d2CF9Fe082056", + "txHash": "0x89372293fa3b841cb5a4dd24641cdbdda89e611e82361835092ae8c3d71c31e3", + "kind": "transparent" + }, + { + "address": "0x5b2099Bd96341554cF90088f3632989845F8872D", + "txHash": "0x22e45e2f5310ff4d42c30ce61f09b81c4f05b18c9c243d9dc7456cc18d6b9f30", + "kind": "transparent" + }, + { + "address": "0x81AF972C86e55E45db1971fDe2549bEC0C7C8d70", + "txHash": "0x8de86710a1896ce202d629b3b6a0371a4490014cf9dfdb6b3d57f306213af476", + "kind": "transparent" + }, + { + "address": "0x46a2eEDd213081834f4CE11F6454F1A4F27E3813", + "txHash": "0x6d86340afd210a0df0bf4bfe68d8b3fde1182baf99bc2daa4d8ad699a1e5759e", + "kind": "transparent" + }, + { + "address": "0xc06F7D29b0BEed09Af19062AE61Df0c8D55476F5", + "txHash": "0xafb1b3f399556f688805497f5b0f9a1791d4b16db32b2b452a7eee862f5b73e9", + "kind": "transparent" + }, + { + "address": "0x517724C74BDda3511eCeDC5207BEEA5938047C1c", + "txHash": "0xfa38b1f60bc2a9bbbe301a5148775dcf4e842263453ef30e098326a4bde21c45", + "kind": "transparent" + }, + { + "address": "0xCc9E84F4eeEdBDA18ea84FEc0484e9120B0f863B", + "txHash": "0x600a79340fe71d4168e120a78eea4999928f2dd38743874cd5f691813ebdedbd", + "kind": "transparent" + }, + { + "address": "0xc4ff8fea0e6568503ec0eaf82c0b37027E38D1eb", + "txHash": "0xcf9697d44f70e3d219a98670fafcb13fba4e734122f431fa4d62ee4b3e0602bf", + "kind": "transparent" + }, + { + "address": "0x45b6F5B140010FBd7d4298F2250758b234dcB6aE", + "txHash": "0xdece72f0f7e69ad6d1f927e67d457cd12481e31d0eebb5eadbab4314f59598d1", + "kind": "transparent" + }, + { + "address": "0xFAd8616cA703F849d8DF35EE7928B5496d4516B4", + "txHash": "0xa518ea245e8e514d8ce8058016dc4e607c814b41cf61ac1b01121cfd81a61241", + "kind": "transparent" + }, + { + "address": "0x7B39Dfd4D3Dd403Dc524f096beD55B344C240AF7", + "txHash": "0xc716ce30707b1ed6b008766517cfeddeecb02736dc1543c4b25c2757e8e4499d", + "kind": "transparent" + }, + { + "address": "0x255CF249DD1580482066e71299177b5B5d24Ba96", + "txHash": "0x13ea02afe2fc0acd606e5e15561f461d07dfa20314873843886b33e3fea5c958", + "kind": "transparent" + }, + { + "address": "0x42B39e8fd8A63203869C9BB59583c70176192540", + "txHash": "0xbaa00a7baf382d99d626c3f339713b6f0011a8c0a2f71c1e8816bc6be9d46163", + "kind": "transparent" + }, + { + "address": "0xAd48c73B7144255f949aF4514a31DD1729B74931", + "txHash": "0xba38e4139f7ee60ffb28e5427c9e3c60bc73520fdcfd07beb7b7ca06176c76e6", + "kind": "transparent" + }, + { + "address": "0xd0A50194CeFf1A33E2a831F80EBfa2b11aC44B78", + "txHash": "0xcbfa7e4ab231946a0fae478e3f08923b29990bd16c20f7b30158b15953c659a0", + "kind": "transparent" + }, + { + "address": "0xEA6015008c7926E84C76b70344EbD31a48A6fd2c", + "txHash": "0xb835fc7220f21305aaa52880a106b9cea2d04e96334bc021008ebf82b9e0000b", + "kind": "transparent" + } + ], + "impls": { + "1f316e442a055454d4ae9a9c32ef7a434ca57c97171f409a65cc1ee4ca78b0b7": { + "address": "0x0e3c57E21F9f37f3277F14602891f53618ECcC85", + "txHash": "0x27aed9d514a84bb90f372b2a30f79a3b34f0b81e6205df33bc6464904c0050a9", + "layout": { + "solcVersion": "0.8.20", + "storage": [ + { + "label": "__gap", + "offset": 0, + "slot": "0", + "type": "t_array(t_uint256)48_storage", + "contract": "AccessManager", + "src": "contracts\\AccessManager.sol:11" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)25_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_struct(AccessControlStorage)34_storage": { + "label": "struct AccessControlUpgradeable.AccessControlStorage", + "members": [ + { + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)25_storage)", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(InitializableStorage)93_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(RoleData)25_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "hasRole", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.AccessControl": [ + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)25_storage)", + "src": "@openzeppelin\\contracts-upgradeable\\access\\AccessControlUpgradeable.sol:61", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin\\contracts-upgradeable\\proxy\\utils\\Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin\\contracts-upgradeable\\proxy\\utils\\Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + }, + "3dd70c1bf13c1bb2e61754c49d07a24415ee3d8f02d99e349ce60477df97ea17": { + "address": "0x1a98911e0b4d12Ef8FDE90a9EfCf16EAF23DCce0", + "txHash": "0xed0cb3a165a905f1c068136eab1d7f0a6ae2ac3662a66b4a4d3bc5f585f0ac53", + "layout": { + "solcVersion": "0.8.20", + "storage": [ + { + "label": "accessManager", + "offset": 0, + "slot": "0", + "type": "t_contract(AccessManager)4950", + "contract": "AccessManagerBase", + "src": "contracts\\AccessManager.sol:74" + }, + { + "label": "nextDeedId", + "offset": 0, + "slot": "1", + "type": "t_uint256", + "contract": "DeedNFT", + "src": "contracts\\DeedNFT.sol:14" + }, + { + "label": "deedInfoMap", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_uint256,t_struct(DeedInfo)5128_storage)", + "contract": "DeedNFT", + "src": "contracts\\DeedNFT.sol:15" + }, + { + "label": "__gap", + "offset": 0, + "slot": "3", + "type": "t_array(t_uint256)48_storage", + "contract": "DeedNFT", + "src": "contracts\\DeedNFT.sol:16" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_address)": { + "label": "mapping(uint256 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_string_storage)": { + "label": "mapping(uint256 => string)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(ERC721Storage)191_storage": { + "label": "struct ERC721Upgradeable.ERC721Storage", + "members": [ + { + "label": "_name", + "type": "t_string_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "_symbol", + "type": "t_string_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "_owners", + "type": "t_mapping(t_uint256,t_address)", + "offset": 0, + "slot": "2" + }, + { + "label": "_balances", + "type": "t_mapping(t_address,t_uint256)", + "offset": 0, + "slot": "3" + }, + { + "label": "_tokenApprovals", + "type": "t_mapping(t_uint256,t_address)", + "offset": 0, + "slot": "4" + }, + { + "label": "_operatorApprovals", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "offset": 0, + "slot": "5" + } + ], + "numberOfBytes": "192" + }, + "t_struct(ERC721URIStorageStorage)329_storage": { + "label": "struct ERC721URIStorageUpgradeable.ERC721URIStorageStorage", + "members": [ + { + "label": "_tokenURIs", + "type": "t_mapping(t_uint256,t_string_storage)", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(InitializableStorage)93_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_contract(AccessManager)4950": { + "label": "contract AccessManager", + "numberOfBytes": "20" + }, + "t_enum(AssetType)5144": { + "label": "enum DeedNFT.AssetType", + "members": [ + "Land", + "Vehicle", + "Estate", + "CommercialEquipment" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_uint256,t_struct(DeedInfo)5128_storage)": { + "label": "mapping(uint256 => struct DeedNFT.DeedInfo)", + "numberOfBytes": "32" + }, + "t_struct(DeedInfo)5128_storage": { + "label": "struct DeedNFT.DeedInfo", + "members": [ + { + "label": "assetType", + "type": "t_enum(AssetType)5144", + "offset": 0, + "slot": "0" + }, + { + "label": "isValidated", + "type": "t_bool", + "offset": 1, + "slot": "0" + } + ], + "numberOfBytes": "32" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.ERC721URIStorage": [ + { + "contract": "ERC721URIStorageUpgradeable", + "label": "_tokenURIs", + "type": "t_mapping(t_uint256,t_string_storage)", + "src": "@openzeppelin\\contracts-upgradeable\\token\\ERC721\\extensions\\ERC721URIStorageUpgradeable.sol:25", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.ERC721": [ + { + "contract": "ERC721Upgradeable", + "label": "_name", + "type": "t_string_storage", + "src": "@openzeppelin\\contracts-upgradeable\\token\\ERC721\\ERC721Upgradeable.sol:27", + "offset": 0, + "slot": "0" + }, + { + "contract": "ERC721Upgradeable", + "label": "_symbol", + "type": "t_string_storage", + "src": "@openzeppelin\\contracts-upgradeable\\token\\ERC721\\ERC721Upgradeable.sol:30", + "offset": 0, + "slot": "1" + }, + { + "contract": "ERC721Upgradeable", + "label": "_owners", + "type": "t_mapping(t_uint256,t_address)", + "src": "@openzeppelin\\contracts-upgradeable\\token\\ERC721\\ERC721Upgradeable.sol:32", + "offset": 0, + "slot": "2" + }, + { + "contract": "ERC721Upgradeable", + "label": "_balances", + "type": "t_mapping(t_address,t_uint256)", + "src": "@openzeppelin\\contracts-upgradeable\\token\\ERC721\\ERC721Upgradeable.sol:34", + "offset": 0, + "slot": "3" + }, + { + "contract": "ERC721Upgradeable", + "label": "_tokenApprovals", + "type": "t_mapping(t_uint256,t_address)", + "src": "@openzeppelin\\contracts-upgradeable\\token\\ERC721\\ERC721Upgradeable.sol:36", + "offset": 0, + "slot": "4" + }, + { + "contract": "ERC721Upgradeable", + "label": "_operatorApprovals", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "src": "@openzeppelin\\contracts-upgradeable\\token\\ERC721\\ERC721Upgradeable.sol:38", + "offset": 0, + "slot": "5" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin\\contracts-upgradeable\\proxy\\utils\\Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin\\contracts-upgradeable\\proxy\\utils\\Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + } + } +} diff --git a/packages/hardhat/.vscode/launch.json b/packages/hardhat/.vscode/launch.json index b56f0057..6111504f 100644 --- a/packages/hardhat/.vscode/launch.json +++ b/packages/hardhat/.vscode/launch.json @@ -10,6 +10,16 @@ "runtimeArgs": [ "test" ] + }, + { + "name": "Hardhat deploy sepolia", + "type": "node", + "request": "launch", + "console": "integratedTerminal", + "runtimeExecutable": "yarn", + "runtimeArgs": [ + "deploy:sepolia" + ] } ] } \ No newline at end of file diff --git a/packages/hardhat/contracts/AccessManager.sol b/packages/hardhat/contracts/AccessManager.sol index e7a73da9..9ca1df61 100644 --- a/packages/hardhat/contracts/AccessManager.sol +++ b/packages/hardhat/contracts/AccessManager.sol @@ -1,12 +1,21 @@ // SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.20; import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; -contract AccessManager is AccessControl { +contract AccessManager is AccessControlUpgradeable { bytes32 public constant VALIDATOR_ROLE = keccak256("VALIDATOR_ROLE"); bytes32 public constant AGENT_ROLE = keccak256("AGENT_ROLE"); + uint256[48] __gap; - constructor(address admin) { + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize(address admin) public initializer { _grantRole(DEFAULT_ADMIN_ROLE, admin); } @@ -54,15 +63,22 @@ contract AccessManager is AccessControl { /** * @dev See {IERC165-supportsInterface}. */ - function supportsInterface(bytes4 _interfaceId) public view virtual override(AccessControl) returns (bool) { + function supportsInterface( + bytes4 _interfaceId + ) public view virtual override(AccessControlUpgradeable) returns (bool) { return super.supportsInterface(_interfaceId); } } -contract AccessManagerBase is Context { +contract AccessManagerBase is ContextUpgradeable { AccessManager accessManager; - constructor(address _accessManager) { + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize(address _accessManager) public virtual initializer { accessManager = AccessManager(_accessManager); } diff --git a/packages/hardhat/contracts/DeedNFT.sol b/packages/hardhat/contracts/DeedNFT.sol index 82d9962c..f6165354 100644 --- a/packages/hardhat/contracts/DeedNFT.sol +++ b/packages/hardhat/contracts/DeedNFT.sol @@ -1,13 +1,15 @@ // SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.20; -import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; -import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "./AccessManager.sol"; -contract DeedNFT is ERC721, ERC721URIStorage, AccessManagerBase { +contract DeedNFT is ERC721Upgradeable, ERC721URIStorageUpgradeable, AccessManagerBase { struct DeedInfo { AssetType assetType; bool isValidated; + uint256[48] __gap; } uint256 public nextDeedId; @@ -20,13 +22,21 @@ contract DeedNFT is ERC721, ERC721URIStorage, AccessManagerBase { CommercialEquipment } - event DeedNFTMinted(uint256 deedId, DeedInfo deedInfo, address minter); + event DeedNFTMinted(uint256 deedId, DeedInfo deedInfo, address minter, string uri); event DeedNFTBurned(uint256 deedId); - event DeedNFTAssetValidationSet(uint256 deedId, bool isValid); - event DeedNFTIpfsDetailsSet(uint256 deedId, string newIpfsDetailsHash); - event DeedNFTAssetTypeSet(uint256 deedId, AssetType newAssetType); + event DeedNFTValidatedChanged(uint256 deedId, bool isValid); + event DeedNFTUriChanged(uint256 deedId, string newIpfsDetailsHash); + event DeedNFTAssetTypeChanged(uint256 deedId, AssetType newAssetType); - constructor(address _accessManager) ERC721("DeedNFT", "DEED") ERC721URIStorage() AccessManagerBase(_accessManager) { + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize(address admin) public override(AccessManagerBase) initializer { + __ERC721URIStorage_init(); + __ERC721_init("DeedNFT", "DEED"); + AccessManagerBase.initialize(admin); nextDeedId = 1; } @@ -57,7 +67,7 @@ contract DeedNFT is ERC721, ERC721URIStorage, AccessManagerBase { deedInfo.assetType = _assetType; _setTokenURI(nextDeedId, _ipfsDetailsHash); deedInfo.isValidated = true; - emit DeedNFTMinted(nextDeedId, deedInfo, _msgSender()); + emit DeedNFTMinted(nextDeedId, deedInfo, _msgSender(), _ipfsDetailsHash); nextDeedId = nextDeedId + 1; return nextDeedId; } @@ -78,14 +88,14 @@ contract DeedNFT is ERC721, ERC721URIStorage, AccessManagerBase { ) public virtual deedExists(_deedId) onlyOwner(_deedId) { _setTokenURI(_deedId, _ipfsDetailsHash); _setAssetValidation(_deedId, false); - emit DeedNFTIpfsDetailsSet(_deedId, _ipfsDetailsHash); + emit DeedNFTUriChanged(_deedId, _ipfsDetailsHash); } function setAssetType(uint256 _deedId, AssetType _assetType) public deedExists(_deedId) onlyOwner(_deedId) { DeedInfo storage deedInfo = deedInfoMap[_deedId]; deedInfo.assetType = _assetType; _setAssetValidation(_deedId, false); - emit DeedNFTAssetTypeSet(_deedId, _assetType); + emit DeedNFTAssetTypeChanged(_deedId, _assetType); } function getDeedInfo(uint256 _deedId) public view deedExists(_deedId) returns (DeedInfo memory) { @@ -99,17 +109,19 @@ contract DeedNFT is ERC721, ERC721URIStorage, AccessManagerBase { function supportsInterface( bytes4 _interfaceId - ) public view virtual override(ERC721, ERC721URIStorage) returns (bool) { + ) public view virtual override(ERC721Upgradeable, ERC721URIStorageUpgradeable) returns (bool) { return super.supportsInterface(_interfaceId); } - function tokenURI(uint256 _deedId) public view override(ERC721, ERC721URIStorage) returns (string memory) { + function tokenURI( + uint256 _deedId + ) public view override(ERC721Upgradeable, ERC721URIStorageUpgradeable) returns (string memory) { return super.tokenURI(_deedId); } function _setAssetValidation(uint256 _deedId, bool _isValid) internal { DeedInfo storage deedInfo = deedInfoMap[_deedId]; deedInfo.isValidated = _isValid; - emit DeedNFTAssetValidationSet(_deedId, _isValid); + emit DeedNFTValidatedChanged(_deedId, _isValid); } } diff --git a/packages/hardhat/contracts/FundsManager.sol b/packages/hardhat/contracts/FundsManager.sol deleted file mode 100644 index 37f7e8e6..00000000 --- a/packages/hardhat/contracts/FundsManager.sol +++ /dev/null @@ -1,96 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.20; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; -import "@openzeppelin/contracts/access/AccessControl.sol"; -import "@openzeppelin/contracts/utils/Strings.sol"; -import "./AccessManager.sol"; - -contract FundsManager is Context, AccessManagerBase { - event FundsStored(uint256 id, IERC20 token, uint256 amount, address sender, address caller, uint256 newBalance); - event FundsWithdrawn( - uint256 id, - IERC20 token, - uint256 amount, - address destination, - address caller, - uint256 newBalance - ); - - // AccountOwner -> AccountId -> TokenAddress -> Amount - mapping(address => mapping(uint256 => mapping(address => uint256))) public accountsMapping; - - constructor(address _accessManager) AccessManagerBase(_accessManager) {} - - /** - * Get the balance of an account - * @param _id AccountId - * @param _token TokenAddress - * @return Balance - */ - function balanceOf(uint256 _id, IERC20 _token) external view returns (uint256) { - return accountsMapping[_msgSender()][_id][address(_token)]; - } - - /** - * Pull tokens from sender and store them in the contract - * @param _id AccountId - * @param _token TokenAddress - * @param _amount Amount - * @param _sender Witch address to pull tokens from - */ - function store(uint256 _id, IERC20 _token, uint256 _amount, address _sender) external { - require( - _token.allowance(_sender, address(this)) >= _amount, - string.concat( - "[Funds Manager] Not enough allowance for account ", - Strings.toString(_id), - " and amount ", - Strings.toString(_amount) - ) - ); - - _token.transferFrom(_sender, address(this), _amount); - accountsMapping[_msgSender()][_id][address(_token)] += _amount; - - emit FundsStored( - _id, - _token, - _amount, - _sender, - _msgSender(), - accountsMapping[_msgSender()][_id][address(_token)] - ); - } - - /** - * Withdraw tokens from the contract and send them to the recipient - * @param _id AccountId - * @param _token TokenAddress - * @param _amount Amount - * @param _recipient Witch address to send tokens to - */ - function withdraw(uint256 _id, IERC20 _token, uint256 _amount, address _recipient) external { - require( - accountsMapping[_msgSender()][_id][address(_token)] >= _amount, - string.concat( - "[Funds Manager] Not enough funds for account ", - Strings.toString(_id), - " and amount ", - Strings.toString(_amount) - ) - ); - - accountsMapping[_msgSender()][_id][address(_token)] -= _amount; - _token.transfer(_recipient, _amount); - - emit FundsWithdrawn( - _id, - _token, - _amount, - _recipient, - _msgSender(), - accountsMapping[_msgSender()][_id][address(_token)] - ); - } -} diff --git a/packages/hardhat/contracts/LeaseAgreement.sol b/packages/hardhat/contracts/LeaseAgreement.sol deleted file mode 100644 index 71821086..00000000 --- a/packages/hardhat/contracts/LeaseAgreement.sol +++ /dev/null @@ -1,367 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.20; - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; -import "./DeedNFT.sol"; // Import the IDeedNFT interface -import "./LeaseNFT.sol"; -import "./SubdivisionNFT.sol"; // Import the ISubdivisionNFT interface -import "./FundsManager.sol"; -import "./AccessManager.sol"; - -interface ILeaseNFT { - function mint(address leaseOwner, uint256 leaseId) external; - - function burn(uint256 leaseId) external; -} - -contract LeaseAgreement is ReentrancyGuard, AccessManagerBase { - // CONSTANTS - uint256 private constant MONTH = 30.5 days; - uint256 private constant MAX_NB_MONTH_FOR_DEPOSIT = 3; - - struct LeaseDates { - uint256 startDate; - uint256 endDate; - uint256 rentDueDate; - uint256 distributableDate; - } - - struct Deposit { - uint256 amount; - bool paid; - } - - struct Lease { - address[] lesseeList; - uint256 rentAmount; - Deposit securityDeposit; - uint256 latePaymentFee; - uint32 gracePeriod; - LeaseDates dates; - uint256 extensionCount; - uint256 deedId; - address manager; - uint8 managerPercentage; - uint256 unclaimedRentAmount; - bool isArchived; - } - - struct RentPaymentInfo { - uint256 rentAmount; - uint256 totalBalance; - uint32 unpaidMonths; - uint256 rentDueDate; - } - - modifier onlyLessor(uint256 _leaseId) { - require(_msgSender() == leaseNFT.ownerOf(_leaseId), "[Lease Agreement] Sender must be Lessor"); - _; - } - modifier onlyActive(uint256 _leaseId) { - require( - block.timestamp < leases[_leaseId].dates.endDate && block.timestamp > leases[_leaseId].dates.startDate, - "[Lease Agreement] The contract has been archived." - ); - _; - } - mapping(uint256 => Lease) public leases; - uint256 public leaseCounter; - LeaseNFT public leaseNFT; - IERC20 public paymentToken; - DeedNFT public deedNFT; - SubdivisionNFT public subdivisionNFT; - FundsManager public fundsManager; - - event LeaseFundsManagerSet(address fundsManager); - event LeasePaymentTokenSet(address paymentToken); - event LeaseCreated(uint256 leaseId, Lease lease); - event LeaseTerminated(uint256 leaseId); - event LeasePaymentMade(uint256 leaseId, uint256 amount, uint256 unclaimedRentAmount); - event LeaseRentDistributed(uint256 leaseId, uint256 lessorAmount, uint256 managerAmount, uint256 distributableDate); - event LeaseManagerSet(uint256 leaseId, address manager, uint256 percentage); - event LeaseManagerUnset(uint256 leaseId); - event LeaseDueDateChanged(uint256 leaseId, uint256 newDueDate); - event LeaseDepositSubmited(uint256 leaseId, uint256 amount); - event LeaseExtended(uint256 leaseId, uint256 endDate, uint256 rentAmount, uint256 extensionCount); - - constructor( - address _leaseNFT, - address _paymentToken, - address _deedNFT, - address _subdivisionNFT, - address _fundsManager, - address _accessManager - ) AccessManagerBase(_accessManager) { - require(_leaseNFT != address(0), "[Lease Agreement] Invalid LeaseNFT address"); - require(_paymentToken != address(0), "[Lease Agreement] Invalid token address"); - require(_deedNFT != address(0), "[Lease Agreement] Invalid DeedNFT address"); - require(_subdivisionNFT != address(0), "[Lease Agreement] Invalid SubdivisionNFT address"); - - leaseNFT = LeaseNFT(_leaseNFT); - deedNFT = DeedNFT(_deedNFT); - subdivisionNFT = SubdivisionNFT(_subdivisionNFT); - - paymentToken = IERC20(_paymentToken); - emit LeasePaymentTokenSet(_paymentToken); - - fundsManager = FundsManager(_fundsManager); - emit LeaseFundsManagerSet(_fundsManager); - - leaseCounter = 0; - } - - function setFundsManager(address _fundsManager) public functionRoleOrAdmin(this.setFundsManager.selector) { - fundsManager = FundsManager(_fundsManager); - emit LeaseFundsManagerSet(_fundsManager); - } - - function getLesseeList(uint256 _leaseId) public view returns (address[] memory) { - Lease storage lease = leases[_leaseId]; - return lease.lesseeList; - } - - function setPaymentToken(address _paymentToken) public functionRoleOrAdmin(this.setPaymentToken.selector) { - paymentToken = IERC20(_paymentToken); - emit LeasePaymentTokenSet(_paymentToken); - } - - function createLease( - address[] memory _lesseeList, - uint256 _startDate, - uint256 _endDate, - uint256 _rentAmount, - uint256 _securityDepositAmount, - uint256 _deedId, - uint256 _latePaymentFee, - uint32 _gracePeriod - ) external { - require(_startDate < _endDate, "[Lease Agreement] Invalid start and end dates"); - require( - _endDate - _startDate > 1 * MONTH, - "[Lease Agreement] End date and start date should be 1 month appart" - ); - require(_gracePeriod >= 3); - require(_latePaymentFee >= 0 && _latePaymentFee <= 15); - bool isDeedOwner = _verifyDeedOwnership(_msgSender(), _deedId); - bool isSubdivisionOwner = _verifySubdivisionOwnership(_msgSender(), _deedId); - require(isDeedOwner || isSubdivisionOwner, "[Lease Agreement] Lessor must own the property NFT"); - - uint256 leaseId = leaseCounter; - leaseCounter++; - Lease storage lease = leases[leaseId]; - lease.lesseeList = _lesseeList; - lease.dates.startDate = _startDate; - lease.dates.endDate = _endDate; - lease.rentAmount = _rentAmount; - lease.securityDeposit.amount = _securityDepositAmount; - lease.dates.rentDueDate = _startDate + 1 * MONTH; - lease.extensionCount = 0; - lease.deedId = _deedId; - lease.securityDeposit.paid = _securityDepositAmount == 0; - lease.latePaymentFee = _latePaymentFee; - lease.gracePeriod = _gracePeriod; - lease.isArchived = false; - leaseNFT.mint(_msgSender(), leaseId); - lease.dates.distributableDate = lease.dates.rentDueDate; - - emit LeaseCreated(leaseId, lease); - } - - function containsAddress(address[] memory _addresses, address _address) internal pure returns (bool) { - bool contains = false; - for (uint i = 0; i < _addresses.length; i++) { - if (_addresses[i] == _address) { - contains = true; - break; - } - } - return contains; - } - - function transferLease(uint256 _leaseId, address[] memory _newLesseeList) public onlyLessor(_leaseId) { - Lease storage lease = leases[_leaseId]; - lease.lesseeList = _newLesseeList; - } - - function setManager(uint256 _leaseId, address _manager, uint8 _percentage) public onlyLessor(_leaseId) { - Lease storage lease = leases[_leaseId]; - require(_percentage >= 0 && _percentage <= 100, "[Lease Agreement] Invalid Manager percentage"); - - lease.manager = _manager; - lease.managerPercentage = _percentage; - - emit LeaseManagerSet(_leaseId, _manager, _percentage); - } - - function unsetManager(uint256 _leaseId) external { - Lease storage lease = leases[_leaseId]; - require( - _msgSender() == leaseNFT.ownerOf(_leaseId) || _msgSender() == lease.manager, - "[Lease Agreement] Only the Lessor or the Manager can remove the Manager" - ); - - lease.manager = address(0); - lease.managerPercentage = 0; - - emit LeaseManagerUnset(_leaseId); - } - - function submitDeposit(uint256 _leaseId) external nonReentrant { - Lease storage lease = leases[_leaseId]; - require( - containsAddress(lease.lesseeList, _msgSender()), - "[Lease Agreement] Only the Lessee can submit the deposit" - ); - require(!lease.securityDeposit.paid, "[Lease Agreement] Security deposit already paid"); - - fundsManager.store(_leaseId, paymentToken, lease.securityDeposit.amount, _msgSender()); - lease.securityDeposit.paid = true; - - emit LeaseDepositSubmited(_leaseId, lease.securityDeposit.amount); - } - - function setDueDate(uint256 _leaseId, uint256 _newDueDate) public onlyLessor(_leaseId) { - Lease storage lease = leases[_leaseId]; - require( - _newDueDate >= (lease.dates.rentDueDate + 1 * MONTH), - "[Lease Agreement] New rent due date must be at least a month after current one" - ); - - lease.dates.rentDueDate = _newDueDate; - - emit LeaseDueDateChanged(_leaseId, _newDueDate); - } - - function payRent(uint256 _leaseId) external nonReentrant { - Lease storage lease = leases[_leaseId]; - require(containsAddress(lease.lesseeList, _msgSender()), "[Lease Agreement] Only the Lessee can pay rent"); - require(lease.securityDeposit.paid, "[Lease Agreement] Security deposit must be paid first"); - require( - block.timestamp >= lease.dates.startDate && block.timestamp <= lease.dates.endDate, - "[Lease Agreement] Outside of lease duration" - ); - - RentPaymentInfo memory rentInfo = calculateRentPaymentInfo(_leaseId); - lease.unclaimedRentAmount += rentInfo.totalBalance; - lease.dates.rentDueDate += (rentInfo.unpaidMonths) * (1 * MONTH); - fundsManager.store(_leaseId, paymentToken, rentInfo.totalBalance, _msgSender()); - - emit LeaseDueDateChanged(_leaseId, lease.dates.rentDueDate); - emit LeasePaymentMade(_leaseId, rentInfo.totalBalance, lease.unclaimedRentAmount); - } - - function distributeRent(uint256 _leaseId) external nonReentrant { - Lease storage lease = leases[_leaseId]; - require( - _msgSender() == leaseNFT.ownerOf(_leaseId) || _msgSender() == lease.manager, - "[Lease Agreement] Caller must be the Lessor or the Manager" - ); - require(lease.unclaimedRentAmount > 0, "[Lease Agreement] No rent to distribute"); - uint256 nbMonthSinceLastDistribute = 0; - require( - block.timestamp > lease.dates.distributableDate, - "[Lease Agreement] Rent can only be distributed past the distributable date" - ); - - nbMonthSinceLastDistribute = (block.timestamp - lease.dates.distributableDate) / (1 * MONTH) + 1; - uint256 totalToClaim = lease.unclaimedRentAmount; - uint256 managerAmount = 0; - - if (lease.manager != address(0)) { - managerAmount = (totalToClaim * lease.managerPercentage) / 100; - fundsManager.withdraw(_leaseId, paymentToken, uint32(managerAmount), lease.manager); - } - - uint256 lessorAmount = totalToClaim - managerAmount; - fundsManager.withdraw(_leaseId, paymentToken, uint32(lessorAmount), leaseNFT.ownerOf(_leaseId)); - lease.unclaimedRentAmount = 0; - lease.dates.distributableDate += nbMonthSinceLastDistribute * (1 * MONTH); - - emit LeaseRentDistributed(_leaseId, uint32(lessorAmount), uint32(managerAmount), lease.dates.distributableDate); - } - - function extendLease(uint256 _leaseId, uint256 _extensionPeriod) external onlyLessor(_leaseId) { - Lease storage lease = leases[_leaseId]; - require(!lease.isArchived, "[Lease Agreement] Lease has been archived"); - require( - block.timestamp >= lease.dates.endDate - 45 days, // TODO: Configurable - "[Lease Agreement] Extension can only be requested in the last 45 days" - ); - require(lease.extensionCount < 2, "[Lease Agreement] Maximum extensions reached"); - lease.dates.endDate += _extensionPeriod; - lease.rentAmount += (lease.rentAmount * 3) / 100; - lease.extensionCount++; - - emit LeaseExtended(_leaseId, lease.dates.endDate, lease.rentAmount, lease.extensionCount); - } - - function withdrawDeposit(uint256 _leaseId) external nonReentrant { - Lease storage lease = leases[_leaseId]; - require( - lease.isArchived || block.timestamp > lease.dates.endDate, - "[Lease Agreement] Cannot withdraw deposit if Lease still active" - ); - require(containsAddress(lease.lesseeList, _msgSender()), "[Lease Agreement] Caller must be one of the lessees"); - RentPaymentInfo memory rentInfo = calculateRentPaymentInfo(_leaseId); - bool shouldSendDepositToLessor = (rentInfo.unpaidMonths >= MAX_NB_MONTH_FOR_DEPOSIT); - // Send security deposit to the sender of the lessee list - if (!shouldSendDepositToLessor) { - fundsManager.withdraw(_leaseId, paymentToken, lease.securityDeposit.amount, _msgSender()); - } - lease.isArchived = true; - } - - function burnLease(uint256 _leaseId) public { - Lease storage lease = leases[_leaseId]; - require( - _msgSender() == leaseNFT.ownerOf(_leaseId) || _msgSender() == lease.manager, - "[Lease Agreement] Sender must be manager or lessor" - ); - require(lease.isArchived, "[Lease Agreement] Lease has been archived"); - leaseNFT.burn(_leaseId); - } - - function terminateLease(uint256 _leaseId) external nonReentrant onlyLessor(_leaseId) { - Lease storage lease = leases[_leaseId]; - require(block.timestamp >= lease.dates.startDate, "[Lease Agreement] Lease has not started yet"); - RentPaymentInfo memory rentInfo = calculateRentPaymentInfo(_leaseId); - bool shouldSendDepositToLessor = (rentInfo.unpaidMonths >= MAX_NB_MONTH_FOR_DEPOSIT); - - // Send security deposit to the lessor if needed - if (shouldSendDepositToLessor) { - fundsManager.withdraw(_leaseId, paymentToken, lease.securityDeposit.amount, leaseNFT.ownerOf(_leaseId)); - } - lease.isArchived = true; - emit LeaseTerminated(_leaseId); - } - - function calculateRentPaymentInfo(uint256 _leaseId) public view returns (RentPaymentInfo memory rentInfo) { - Lease storage lease = leases[_leaseId]; - rentInfo.rentAmount = lease.rentAmount; - // sidenote: rent due date is incremented by 1 month each time the rent is paid.(function payRent) - if (block.timestamp > lease.dates.rentDueDate + (lease.gracePeriod * 1 days)) { - // Function to calculate rentAmountIncrease increase - rentInfo.rentAmount += (lease.rentAmount * lease.latePaymentFee) / 100; - rentInfo.unpaidMonths = uint32((block.timestamp - lease.dates.rentDueDate) / (1 * MONTH) + 1); - rentInfo.totalBalance = (rentInfo.unpaidMonths) * rentInfo.rentAmount; - } else { - rentInfo.unpaidMonths = 1; - rentInfo.totalBalance = rentInfo.rentAmount; - } - return rentInfo; - } - - function _verifySubdivisionOwnership(address _owner, uint256 _subdivisionId) internal view returns (bool) { - return subdivisionNFT.isOwnerOfSubdivision(_owner, _subdivisionId); - } - - function _verifyDeedOwnership(address _owner, uint256 _deedId) internal view returns (bool) { - try deedNFT.ownerOf(_deedId) returns (address owner) { - return owner == _owner; - } catch { - return false; - } - } -} diff --git a/packages/hardhat/contracts/LeaseNFT.sol b/packages/hardhat/contracts/LeaseNFT.sol deleted file mode 100644 index 9f51ba9f..00000000 --- a/packages/hardhat/contracts/LeaseNFT.sol +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.20; - -import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; -import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; -import "@openzeppelin/contracts/utils/Address.sol"; -import "@openzeppelin/contracts/utils/math/Math.sol"; -import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; -import "./AccessManager.sol"; - -contract LeaseNFT is ERC721, AccessManagerBase { - address private leaseAgreementAddress; - - event LeaseNFTMinted(address leaseOwner, uint256 leaseId, address minter); - event LeaseNFTBurned(uint256 leaseId, address burner); - event LeaseNFTAgreementSet(uint256 leaseId, address burner); - - constructor(address _accessManager) ERC721("LeaseNFT", "LEASE") AccessManagerBase(_accessManager) {} - - function setLeaseAgreementAddress(address _leaseAgreementAddress) external onlyAdmin { - leaseAgreementAddress = _leaseAgreementAddress; - } - - function mint(address _to, uint256 _leaseId) external { - require( - hasAdminRole() || _msgSender() == leaseAgreementAddress, - "[LeaseNFT] Only LeaseAgreement contract can mint the lease" - ); - _mint(_to, _leaseId); - emit LeaseNFTMinted(_to, _leaseId, _msgSender()); - } - - function exists(uint256 _leaseId) public view returns (bool) { - return _ownerOf(_leaseId) != address(0); - } - - function burn(uint256 _leaseId) external { - require( - hasAdminRole() || _msgSender() == leaseAgreementAddress, - "[LeaseNFT] Only LeaseAgreement can burn the lease" - ); - _burn(_leaseId); - emit LeaseNFTBurned(_leaseId, _msgSender()); - } -} diff --git a/packages/hardhat/contracts/SubdivisionNFT.sol b/packages/hardhat/contracts/SubdivisionNFT.sol deleted file mode 100644 index e399080c..00000000 --- a/packages/hardhat/contracts/SubdivisionNFT.sol +++ /dev/null @@ -1,100 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.20; -import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; -import "@openzeppelin/contracts/access/AccessControl.sol"; -import "./DeedNFT.sol"; -import "./AccessManager.sol"; - -contract SubdivisionNFT is ERC1155, AccessManagerBase { - struct SubdivisionInfo { - bytes ipfsDetailsHash; - address owner; - uint256 parentDeed; - } - - uint256 private _nextsubTokenID; - mapping(uint256 => SubdivisionInfo) private subdivisionInfoMap; - - bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); - DeedNFT public deedNFT; - - event SubdivisionMinted( - address subdivisionOwner, - uint256 subdivisionId, - uint256 deedId, - bytes ipfsDetailsHash, - address minter - ); - event SubdivisionBurned(address account, uint256 subdivisionId, uint256 deedId, bytes ipfsDetailsHash); - event SubdivisionInfoSet(uint256 tokenId, SubdivisionInfo info); - - constructor(address _deedNFT, address _accessManager) ERC1155("") AccessManagerBase(_accessManager) { - require(_deedNFT != address(0), "[SubdivisionNFT] Invalid DeedNFT address"); - - _nextsubTokenID = 1; - deedNFT = DeedNFT(_deedNFT); - } - - function mintSubdivision(SubdivisionInfo memory _info) public { - require( - _msgSender() == deedNFT.ownerOf(_info.parentDeed), - "[SubdivisionNFT] Sender must be the owner of the parent deed" - ); - require(deedNFT.canSubdivide(_info.parentDeed), "[SubdivisionNFT] Parent deed must be land or estate"); - - _mint(_info.owner, _nextsubTokenID, 1, _info.ipfsDetailsHash); - SubdivisionInfo storage subInfo = subdivisionInfoMap[_nextsubTokenID]; - subInfo.ipfsDetailsHash = _info.ipfsDetailsHash; - subInfo.owner = _info.owner; - subInfo.parentDeed = _info.parentDeed; - - emit SubdivisionMinted(_info.owner, _nextsubTokenID, _info.parentDeed, _info.ipfsDetailsHash, _msgSender()); - _nextsubTokenID = _nextsubTokenID + 1; - } - - function batchMint(SubdivisionInfo[] memory _infos) public { - for (uint i = 0; i < _infos.length; i++) { - mintSubdivision(_infos[i]); - } - } - - function setInfo(uint256 _subTokenId, SubdivisionInfo memory _newInfo) public virtual { - require( - isOwnerOfSubdivision(_msgSender(), _subTokenId) == true, - "[SubdivisionNFT] Sender Must be owner of subdivision to set info" - ); - - subdivisionInfoMap[_subTokenId] = _newInfo; - - emit SubdivisionInfoSet(_subTokenId, _newInfo); - } - - function burnSubdivision(uint256 _subTokenId) public { - require( - isOwnerOfSubdivision(_msgSender(), _subTokenId) == true, - "[SubdivisionNFT] Sender must be owner of the subdivision to burn it" - ); - - _burn(_msgSender(), _subTokenId, 1); - - emit SubdivisionBurned( - _msgSender(), - _subTokenId, - subdivisionInfoMap[_subTokenId].parentDeed, - subdivisionInfoMap[_subTokenId].ipfsDetailsHash - ); - } - - function getParentDeed(uint256 _subTokenId) public view returns (uint256) { - SubdivisionInfo storage info = subdivisionInfoMap[_subTokenId]; - return info.parentDeed; - } - - function isOwnerOfSubdivision(address _owner, uint256 _subTokenId) public view returns (bool) { - return balanceOf(_owner, _subTokenId) > 0; - } - - function supportsInterface(bytes4 _interfaceId) public view virtual override(ERC1155) returns (bool) { - return super.supportsInterface(_interfaceId); - } -} diff --git a/packages/hardhat/deploy-config.json b/packages/hardhat/deploy-config.json new file mode 100644 index 00000000..c0fa13cf --- /dev/null +++ b/packages/hardhat/deploy-config.json @@ -0,0 +1,7 @@ +{ + "sepolia": { + "manager": "0xD30aee396a54560581a3265Fd2194B0edB787525", + "deed-proxy": "0xEA6015008c7926E84C76b70344EbD31a48A6fd2c", + "access-manager-proxy": "0xd0A50194CeFf1A33E2a831F80EBfa2b11aC44B78" + } +} \ No newline at end of file diff --git a/packages/hardhat/deploy-config.ts b/packages/hardhat/deploy-config.ts deleted file mode 100644 index 6b2206f9..00000000 --- a/packages/hardhat/deploy-config.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const deployConfig = { - goerli: { - manager: "0x5D5C160A4Bb3444752ba35EEE16c4523E2398CAB", - }, - sepolia: { - manager: "0xD30aee396a54560581a3265Fd2194B0edB787525", - }, -} as const; diff --git a/packages/hardhat/deploy/00_deploy_AccessManager.ts b/packages/hardhat/deploy/00_deploy_AccessManager.ts index 72345262..f6524363 100644 --- a/packages/hardhat/deploy/00_deploy_AccessManager.ts +++ b/packages/hardhat/deploy/00_deploy_AccessManager.ts @@ -1,20 +1,36 @@ import { HardhatRuntimeEnvironment } from "hardhat/types"; import { DeployFunction } from "hardhat-deploy/types"; +import { getDeployConfig, updateDeployConfig } from "../scripts/deploy-config-update"; +import exportContractResult from "../scripts/export-contract"; -const deployDeedNFT: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const { deployer } = await hre.getNamedAccounts(); - const { deploy } = hre.deployments; - - await deploy("AccessManager", { - from: deployer, - // Contract constructor arguments - args: [deployer], - log: true, - - autoMine: true, +const deployAccessManager: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + const deployConfig = getDeployConfig(); + const networkConfig = deployConfig[hre.network.name]; + const manager = networkConfig.manager; + const proxy = networkConfig["access-manager-proxy"]; + const contractFactory = await hre.ethers.getContractFactory("AccessManager"); + let contract; + if (proxy) { + // Migrate + const result = await hre.upgrades.upgradeProxy(proxy, contractFactory); + contract = await result.waitForDeployment(); + console.log(`AccessManager upgraded with address`, await result.getAddress()); + } else { + // Deploy new proxy + const result = await hre.upgrades.deployProxy(contractFactory, [manager], { initializer: "initialize" }); + contract = await result.waitForDeployment(); + console.log(`New AccessManager proxy deployed with address`, await result.getAddress()); + networkConfig["access-manager-proxy"] = await result.getAddress(); + updateDeployConfig(deployConfig); + } // eslint-disable-next-line @typescript-eslint/no-var-requires + const tx = contract.deploymentTransaction(); + exportContractResult(hre.network, "AccessManager", { + ...tx, + ...contract, + address: networkConfig["access-manager-proxy"], }); }; -export default deployDeedNFT; +export default deployAccessManager; -deployDeedNFT.tags = ["DeedNFT"]; +deployAccessManager.tags = ["AccessManager"]; diff --git a/packages/hardhat/deploy/00_deploy_DeedNFT.ts b/packages/hardhat/deploy/00_deploy_DeedNFT.ts deleted file mode 100644 index 3ad52ef5..00000000 --- a/packages/hardhat/deploy/00_deploy_DeedNFT.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { HardhatRuntimeEnvironment } from "hardhat/types"; -import { DeployFunction } from "hardhat-deploy/types"; - -const deployDeedNFT: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const { deployer } = await hre.getNamedAccounts(); - const { deploy, get } = hre.deployments; - - const accessManagerAddress = (await get("AccessManager")).address; - - await deploy("DeedNFT", { - from: deployer, - // Contract constructor arguments - args: [accessManagerAddress], - log: true, - - autoMine: true, - }); -}; - -export default deployDeedNFT; - -deployDeedNFT.tags = ["DeedNFT"]; -deployDeedNFT.dependencies = ["AccessManager"]; diff --git a/packages/hardhat/deploy/01_deploy_DeedNFT.ts b/packages/hardhat/deploy/01_deploy_DeedNFT.ts new file mode 100644 index 00000000..66fbb6a8 --- /dev/null +++ b/packages/hardhat/deploy/01_deploy_DeedNFT.ts @@ -0,0 +1,35 @@ +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import { DeployFunction } from "hardhat-deploy/types"; +import { getDeployConfig, updateDeployConfig } from "../scripts/deploy-config-update"; +import exportContractResult from "../scripts/export-contract"; + +const deployDeedNFT: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + const deployConfig = getDeployConfig(); + const networkConfig = deployConfig[hre.network.name]; + const proxy = networkConfig["deed-proxy"]; + const accessManagerAddress = networkConfig["access-manager-proxy"]; + const contractFactory = await hre.ethers.getContractFactory("DeedNFT"); + let contract; + if (proxy) { + // Migrate + const result = await hre.upgrades.upgradeProxy(proxy, contractFactory); + contract = await result.waitForDeployment(); + console.log(`DeedNFT upgraded with address`, await result.getAddress()); + } else { + // Deploy new proxy + const result = await hre.upgrades.deployProxy(contractFactory, [accessManagerAddress], { + initializer: "initialize", + }); + contract = await result.waitForDeployment(); + console.log(`New DeedNFT proxy deployed with address`, await result.getAddress()); + networkConfig["deed-proxy"] = await result.getAddress(); + updateDeployConfig(deployConfig); + } // eslint-disable-next-line @typescript-eslint/no-var-requires + const tx = contract.deploymentTransaction(); + exportContractResult(hre.network, "DeedNFT", { ...tx, ...contract, address: networkConfig["deed-proxy"] }); +}; + +export default deployDeedNFT; + +deployDeedNFT.tags = ["DeedNFT"]; +deployDeedNFT.dependencies = ["AccessManager"]; diff --git a/packages/hardhat/deploy/02_deploy_LeaseNFT.ts b/packages/hardhat/deploy/02_deploy_LeaseNFT.ts index fbee12bc..c862a9a0 100644 --- a/packages/hardhat/deploy/02_deploy_LeaseNFT.ts +++ b/packages/hardhat/deploy/02_deploy_LeaseNFT.ts @@ -1,20 +1,16 @@ -import { HardhatRuntimeEnvironment } from "hardhat/types"; import { DeployFunction } from "hardhat-deploy/types"; -const deployLeaseNFT: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const { deployer } = await hre.getNamedAccounts(); - const { deploy, get } = hre.deployments; - - const accessManagerAddress = (await get("AccessManager")).address; - - await deploy("LeaseNFT", { - from: deployer, - // Contract constructor arguments - args: [accessManagerAddress], - log: true, - - autoMine: true, - }); +const deployLeaseNFT: DeployFunction = async function () { + // const { deployer } = await hre.getNamedAccounts(); + // const { deploy, get } = hre.deployments; + // const accessManagerAddress = (await get("AccessManager")).address; + // await deploy("LeaseNFT", { + // from: deployer, + // // Contract constructor arguments + // args: [accessManagerAddress], + // log: true, + // autoMine: true, + // }); }; export default deployLeaseNFT; diff --git a/packages/hardhat/deploy/03_deploy_FundsManager.ts b/packages/hardhat/deploy/03_deploy_FundsManager.ts index 2773b543..e8765307 100644 --- a/packages/hardhat/deploy/03_deploy_FundsManager.ts +++ b/packages/hardhat/deploy/03_deploy_FundsManager.ts @@ -1,20 +1,16 @@ -import { HardhatRuntimeEnvironment } from "hardhat/types"; import { DeployFunction } from "hardhat-deploy/types"; -const deployFundsManager: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const { deployer } = await hre.getNamedAccounts(); - const { deploy, get } = hre.deployments; - - const accessManagerAddress = (await get("AccessManager")).address; - - await deploy("FundsManager", { - from: deployer, - // Contract constructor arguments - args: [accessManagerAddress], - log: true, - - autoMine: true, - }); +const deployFundsManager: DeployFunction = async function () { + // const { deployer } = await hre.getNamedAccounts(); + // const { deploy, get } = hre.deployments; + // const accessManagerAddress = (await get("AccessManager")).address; + // await deploy("FundsManager", { + // from: deployer, + // // Contract constructor arguments + // args: [accessManagerAddress], + // log: true, + // autoMine: true, + // }); }; export default deployFundsManager; diff --git a/packages/hardhat/deploy/04_deploy_LeaseAgreement.ts b/packages/hardhat/deploy/04_deploy_LeaseAgreement.ts index 305e864a..13687d7a 100644 --- a/packages/hardhat/deploy/04_deploy_LeaseAgreement.ts +++ b/packages/hardhat/deploy/04_deploy_LeaseAgreement.ts @@ -1,35 +1,30 @@ -import { HardhatRuntimeEnvironment } from "hardhat/types"; import { DeployFunction } from "hardhat-deploy/types"; -const deployLeaseAgreement: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const { deployer } = await hre.getNamedAccounts(); - const { deploy, get } = hre.deployments; - - const accessManagerAddress = (await get("AccessManager")).address; - const deedNFTAddress = (await get("DeedNFT")).address; - const subdivisionNFTAddress = (await get("SubdivisionNFT")).address; - const leaseNFTAddress = (await get("LeaseNFT")).address; - const hnytAddress = "0x2d467a24095B262787f58ce97d9B130ce7232B57"; - const fundsManagerAddress = (await get("FundsManager")).address; - - const leaseAgreementContract = await deploy("LeaseAgreement", { - from: deployer, - // Contract constructor arguments - args: [ - leaseNFTAddress, - hnytAddress, - deedNFTAddress, - subdivisionNFTAddress, - fundsManagerAddress, - accessManagerAddress, - ], - log: true, - - autoMine: true, - }); - - const leaseNFT = await hre.ethers.getContract("LeaseNFT", deployer); - await leaseNFT.setLeaseAgreementAddress(leaseAgreementContract.address); +const deployLeaseAgreement: DeployFunction = async function () { + // const { deployer } = await hre.getNamedAccounts(); + // const { deploy, get } = hre.deployments; + // const accessManagerAddress = (await get("AccessManager")).address; + // const deedNFTAddress = (await get("DeedNFT")).address; + // const subdivisionNFTAddress = (await get("SubdivisionNFT")).address; + // const leaseNFTAddress = (await get("LeaseNFT")).address; + // const hnytAddress = "0x2d467a24095B262787f58ce97d9B130ce7232B57"; + // const fundsManagerAddress = (await get("FundsManager")).address; + // const leaseAgreementContract = await deploy("LeaseAgreement", { + // from: deployer, + // // Contract constructor arguments + // args: [ + // leaseNFTAddress, + // hnytAddress, + // deedNFTAddress, + // subdivisionNFTAddress, + // fundsManagerAddress, + // accessManagerAddress, + // ], + // log: true, + // autoMine: true, + // }); + // const leaseNFT = await hre.ethers.getContract("LeaseNFT", deployer); + // await leaseNFT.setLeaseAgreementAddress(leaseAgreementContract.address); }; export default deployLeaseAgreement; diff --git a/packages/hardhat/deploy/05_deploy_SubdivisionNFT.ts b/packages/hardhat/deploy/05_deploy_SubdivisionNFT.ts index cf92336b..47ee4167 100644 --- a/packages/hardhat/deploy/05_deploy_SubdivisionNFT.ts +++ b/packages/hardhat/deploy/05_deploy_SubdivisionNFT.ts @@ -1,21 +1,17 @@ -import { HardhatRuntimeEnvironment } from "hardhat/types"; import { DeployFunction } from "hardhat-deploy/types"; -const deploySubdivisionNFT: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const { deployer } = await hre.getNamedAccounts(); - const { deploy, get } = hre.deployments; - - const accessManagerAddress = (await get("AccessManager")).address; - const deedNFTAddress = (await get("DeedNFT")).address; - - await deploy("SubdivisionNFT", { - from: deployer, - // Contract constructor arguments - args: [deedNFTAddress, accessManagerAddress], - log: true, - - autoMine: true, - }); +const deploySubdivisionNFT: DeployFunction = async function () { + // const { deployer } = await hre.getNamedAccounts(); + // const { deploy, get } = hre.deployments; + // const accessManagerAddress = (await get("AccessManager")).address; + // const deedNFTAddress = (await get("DeedNFT")).address; + // await deploy("SubdivisionNFT", { + // from: deployer, + // // Contract constructor arguments + // args: [deedNFTAddress, accessManagerAddress], + // log: true, + // autoMine: true, + // }); }; export default deploySubdivisionNFT; diff --git a/packages/hardhat/deployments/sepolia/AccessManager.json b/packages/hardhat/deployments/sepolia/AccessManager.json index 5acafbaf..678b719f 100644 --- a/packages/hardhat/deployments/sepolia/AccessManager.json +++ b/packages/hardhat/deployments/sepolia/AccessManager.json @@ -1,504 +1 @@ -{ - "address": "0xCD4e41B590F3052F9420D69842FCe4ce4E83a797", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "admin", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "AccessControlBadConfirmation", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "neededRole", - "type": "bytes32" - } - ], - "name": "AccessControlUnauthorizedAccount", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "inputs": [], - "name": "AGENT_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "VALIDATOR_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_validator", - "type": "address" - } - ], - "name": "addValidator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_address", - "type": "address" - } - ], - "name": "hasAdminRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_address", - "type": "address" - } - ], - "name": "hasValidatorRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_validator", - "type": "address" - } - ], - "name": "removeValidator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "callerConfirmation", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x3521f8e1228efdd2a87296d9aead868ce28d7db956950d3a80957d0165136f44", - "receipt": { - "to": null, - "from": "0x91B0d67D3F47A30FBEeB159E67209Ad6cb2cE22E", - "contractAddress": "0xCD4e41B590F3052F9420D69842FCe4ce4E83a797", - "transactionIndex": 66, - "gasUsed": "446772", - "logsBloom": "0x00000004000000000000000000000100000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000020000000000000000000800000000000000000000000002000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000500000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x088d65cc98676e775dfa3316c52233c692a6e26ac4377a9cd901939520741ec8", - "transactionHash": "0x3521f8e1228efdd2a87296d9aead868ce28d7db956950d3a80957d0165136f44", - "logs": [ - { - "transactionIndex": 66, - "blockNumber": 5034801, - "transactionHash": "0x3521f8e1228efdd2a87296d9aead868ce28d7db956950d3a80957d0165136f44", - "address": "0xCD4e41B590F3052F9420D69842FCe4ce4E83a797", - "topics": [ - "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x00000000000000000000000091b0d67d3f47a30fbeeb159e67209ad6cb2ce22e", - "0x00000000000000000000000091b0d67d3f47a30fbeeb159e67209ad6cb2ce22e" - ], - "data": "0x", - "logIndex": 183, - "blockHash": "0x088d65cc98676e775dfa3316c52233c692a6e26ac4377a9cd901939520741ec8" - } - ], - "blockNumber": 5034801, - "cumulativeGasUsed": "9038319", - "status": 1, - "byzantium": true - }, - "args": [ - "0x91B0d67D3F47A30FBEeB159E67209Ad6cb2cE22E" - ], - "numDeployments": 1, - "solcInputHash": "9a595a16aee481b19c9cc69826d97edc", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"AGENT_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VALIDATOR_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_validator\",\"type\":\"address\"}],\"name\":\"addValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"hasAdminRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"hasValidatorRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_validator\",\"type\":\"address\"}],\"name\":\"removeValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"_interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"addValidator(address)\":{\"details\":\"Add a validator to the contract\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasAdminRole(address)\":{\"details\":\"Check if an address has the admin role\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"hasValidatorRole(address)\":{\"details\":\"Check if an address has the validator role\",\"params\":{\"_address\":\"The address to check\"}},\"removeValidator(address)\":{\"details\":\"Remove a validator from the contract\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/AccessManager.sol\":\"AccessManager\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IAccessControl} from \\\"./IAccessControl.sol\\\";\\nimport {Context} from \\\"../utils/Context.sol\\\";\\nimport {ERC165} from \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```solidity\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```solidity\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\\n * to enforce additional security measures for this role.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address account => bool) hasRole;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 role => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with an {AccessControlUnauthorizedAccount} error including the required role.\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual returns (bool) {\\n return _roles[role].hasRole[account];\\n }\\n\\n /**\\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\\n * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\\n * is missing `role`.\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert AccessControlUnauthorizedAccount(account, role);\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `callerConfirmation`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address callerConfirmation) public virtual {\\n if (callerConfirmation != _msgSender()) {\\n revert AccessControlBadConfirmation();\\n }\\n\\n _revokeRole(role, callerConfirmation);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\\n if (!hasRole(role, account)) {\\n _roles[role].hasRole[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\\n if (hasRole(role, account)) {\\n _roles[role].hasRole[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n return true;\\n } else {\\n return false;\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev The `account` is missing a role.\\n */\\n error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\\n\\n /**\\n * @dev The caller of a function is not the expected one.\\n *\\n * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\\n */\\n error AccessControlBadConfirmation();\\n\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `callerConfirmation`.\\n */\\n function renounceRole(bytes32 role, address callerConfirmation) external;\\n}\\n\",\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x75a4ee64c68dbd5f38bddd06e664a64c8271b4caa554fb6f0607dfd672bb4bf3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\"},\"contracts/AccessManager.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\r\\npragma solidity ^0.8.20;\\r\\nimport \\\"@openzeppelin/contracts/access/AccessControl.sol\\\";\\r\\n\\r\\ncontract AccessManager is AccessControl {\\r\\n bytes32 public constant VALIDATOR_ROLE = keccak256(\\\"VALIDATOR_ROLE\\\");\\r\\n bytes32 public constant AGENT_ROLE = keccak256(\\\"AGENT_ROLE\\\");\\r\\n\\r\\n constructor(address admin) {\\r\\n _grantRole(DEFAULT_ADMIN_ROLE, admin);\\r\\n }\\r\\n\\r\\n /**\\r\\n * Use this modifier to manage the fonction access more granularly\\r\\n * @param _functionSig The signature of the function to be called\\r\\n */\\r\\n modifier functionRoleOrAdmin(bytes32 _functionSig) {\\r\\n require(\\r\\n hasRole(DEFAULT_ADMIN_ROLE, _msgSender()) || hasRole(_functionSig, _msgSender()),\\r\\n \\\"[AccessManagement] Only the Admin or function granted user can interact\\\"\\r\\n );\\r\\n _;\\r\\n }\\r\\n\\r\\n /**\\r\\n * @dev Add a validator to the contract\\r\\n */\\r\\n function addValidator(address _validator) public functionRoleOrAdmin(this.addValidator.selector) {\\r\\n _grantRole(VALIDATOR_ROLE, _validator);\\r\\n }\\r\\n\\r\\n /**\\r\\n * @dev Remove a validator from the contract\\r\\n */\\r\\n function removeValidator(address _validator) public functionRoleOrAdmin(this.removeValidator.selector) {\\r\\n _revokeRole(VALIDATOR_ROLE, _validator);\\r\\n }\\r\\n\\r\\n /**\\r\\n * @dev Check if an address has the admin role\\r\\n */\\r\\n function hasAdminRole(address _address) public view returns (bool) {\\r\\n return hasRole(DEFAULT_ADMIN_ROLE, _address);\\r\\n }\\r\\n\\r\\n /**\\r\\n * @dev Check if an address has the validator role\\r\\n * @param _address The address to check\\r\\n */\\r\\n function hasValidatorRole(address _address) public view returns (bool) {\\r\\n return hasRole(VALIDATOR_ROLE, _address);\\r\\n }\\r\\n\\r\\n /**\\r\\n * @dev See {IERC165-supportsInterface}.\\r\\n */\\r\\n function supportsInterface(bytes4 _interfaceId) public view virtual override(AccessControl) returns (bool) {\\r\\n return super.supportsInterface(_interfaceId);\\r\\n }\\r\\n}\\r\\n\\r\\ncontract AccessManagerBase is Context {\\r\\n AccessManager accessManager;\\r\\n\\r\\n constructor(address _accessManager) {\\r\\n accessManager = AccessManager(_accessManager);\\r\\n }\\r\\n\\r\\n /**\\r\\n * Use this modifier to restrict to admin only\\r\\n */\\r\\n modifier onlyAdmin() {\\r\\n require(\\r\\n accessManager.hasRole(accessManager.DEFAULT_ADMIN_ROLE(), _msgSender()),\\r\\n \\\"[AccessManagement] Only the admin can interact\\\"\\r\\n );\\r\\n _;\\r\\n }\\r\\n\\r\\n /**\\r\\n * Use this modifier to restrict to validator only\\r\\n */\\r\\n modifier onlyValidator() {\\r\\n require(\\r\\n accessManager.hasRole(accessManager.VALIDATOR_ROLE(), _msgSender()),\\r\\n \\\"[AccessManagement] Only the validator can interact\\\"\\r\\n );\\r\\n _;\\r\\n }\\r\\n\\r\\n /**\\r\\n * Use this modifier to restrict to validator only\\r\\n */\\r\\n modifier onlyAgent() {\\r\\n require(\\r\\n accessManager.hasRole(accessManager.AGENT_ROLE(), _msgSender()),\\r\\n \\\"[AccessManagement] Only the agent can interact\\\"\\r\\n );\\r\\n _;\\r\\n }\\r\\n\\r\\n /**\\r\\n * Use this modifier to manage the fonction access more granularly\\r\\n */\\r\\n modifier onlyRole(bytes32 _role) {\\r\\n require(accessManager.hasRole(_role, _msgSender()), \\\"[AccessManager] Only the validator can interact\\\");\\r\\n _;\\r\\n }\\r\\n\\r\\n /**\\r\\n * Use this modifier to manage the fonction access more granularly\\r\\n * @param _functionSig The signature of the function to be called\\r\\n */\\r\\n modifier functionRoleOrAdmin(bytes32 _functionSig) {\\r\\n require(\\r\\n hasRole(accessManager.DEFAULT_ADMIN_ROLE(), _msgSender()) || hasRole(_functionSig, _msgSender()),\\r\\n \\\"[AccessManagement] Only the Admin or function granted user can interact\\\"\\r\\n );\\r\\n _;\\r\\n }\\r\\n\\r\\n function hasAdminRole() public view returns (bool) {\\r\\n return accessManager.hasAdminRole(_msgSender());\\r\\n }\\r\\n\\r\\n function hasValidatorRole() public view returns (bool) {\\r\\n return accessManager.hasValidatorRole(_msgSender());\\r\\n }\\r\\n\\r\\n function hasRole(bytes32 _role, address _address) public view returns (bool) {\\r\\n return accessManager.hasRole(_role, _address);\\r\\n }\\r\\n}\\r\\n\",\"keccak256\":\"0x5b2ca72fa86518264487c3ef31015a3fb9efa2e871723736611a2a41a28ec5ef\",\"license\":\"AGPL-3.0\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506040516107c23803806107c283398101604081905261002f916100ed565b61003a600082610041565b505061011d565b6000828152602081815260408083206001600160a01b038516845290915281205460ff166100e3576000838152602081815260408083206001600160a01b03861684529091529020805460ff1916600117905561009b3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016100e7565b5060005b92915050565b6000602082840312156100ff57600080fd5b81516001600160a01b038116811461011657600080fd5b9392505050565b6106968061012c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634d238c8e1161008c578063a217fddf11610066578063a217fddf146101c8578063c395fcb3146101d0578063c49baebe146101e3578063d547741f146101f857600080fd5b80634d238c8e1461018f57806391d14854146101a2578063940e1570146101b557600080fd5b806301ffc9a7146100d457806322459e18146100fc578063248a9ca3146101315780632f2ff15d1461015457806336568abe1461016957806340a141ff1461017c575b600080fd5b6100e76100e2366004610526565b61020b565b60405190151581526020015b60405180910390f35b6101237fcab5a0bfe0b79d2c4b1c2e02599fa044d115b7511f9659307cb427695096770981565b6040519081526020016100f3565b61012361013f366004610557565b60009081526020819052604090206001015490565b61016761016236600461058c565b61021c565b005b61016761017736600461058c565b610247565b61016761018a3660046105b8565b61027f565b61016761019d3660046105b8565b6102df565b6100e76101b036600461058c565b610336565b6100e76101c33660046105b8565b61035f565b610123600081565b6100e76101de3660046105b8565b610379565b61012360008051602061064183398151915281565b61016761020636600461058c565b610385565b6000610216826103aa565b92915050565b600082815260208190526040902060010154610237816103df565b61024183836103ec565b50505050565b6001600160a01b03811633146102705760405163334bd91960e11b815260040160405180910390fd5b61027a828261047e565b505050565b6340a141ff60e01b610292600033610336565b806102a257506102a28133610336565b6102c75760405162461bcd60e51b81526004016102be906105d3565b60405180910390fd5b61027a6000805160206106418339815191528361047e565b632691c64760e11b6102f2600033610336565b8061030257506103028133610336565b61031e5760405162461bcd60e51b81526004016102be906105d3565b61027a600080516020610641833981519152836103ec565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600061021660008051602061064183398151915283610336565b60006102168183610336565b6000828152602081905260409020600101546103a0816103df565b610241838361047e565b60006001600160e01b03198216637965db0b60e01b148061021657506301ffc9a760e01b6001600160e01b0319831614610216565b6103e981336104e9565b50565b60006103f88383610336565b610476576000838152602081815260408083206001600160a01b03861684529091529020805460ff1916600117905561042e3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610216565b506000610216565b600061048a8383610336565b15610476576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610216565b6104f38282610336565b6105225760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016102be565b5050565b60006020828403121561053857600080fd5b81356001600160e01b03198116811461055057600080fd5b9392505050565b60006020828403121561056957600080fd5b5035919050565b80356001600160a01b038116811461058757600080fd5b919050565b6000806040838503121561059f57600080fd5b823591506105af60208401610570565b90509250929050565b6000602082840312156105ca57600080fd5b61055082610570565b60208082526047908201527f5b4163636573734d616e6167656d656e745d204f6e6c79207468652041646d6960408201527f6e206f722066756e6374696f6e206772616e74656420757365722063616e20696060820152661b9d195c9858dd60ca1b608082015260a0019056fe21702c8af46127c7fa207f89d0b0a8441bb32959a0ac7df790e9ab1a25c98926a2646970667358221220c180b1101ab7dec8c2e1ca45bb0604dbf82c8be32ea261770781832d22912fca64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80634d238c8e1161008c578063a217fddf11610066578063a217fddf146101c8578063c395fcb3146101d0578063c49baebe146101e3578063d547741f146101f857600080fd5b80634d238c8e1461018f57806391d14854146101a2578063940e1570146101b557600080fd5b806301ffc9a7146100d457806322459e18146100fc578063248a9ca3146101315780632f2ff15d1461015457806336568abe1461016957806340a141ff1461017c575b600080fd5b6100e76100e2366004610526565b61020b565b60405190151581526020015b60405180910390f35b6101237fcab5a0bfe0b79d2c4b1c2e02599fa044d115b7511f9659307cb427695096770981565b6040519081526020016100f3565b61012361013f366004610557565b60009081526020819052604090206001015490565b61016761016236600461058c565b61021c565b005b61016761017736600461058c565b610247565b61016761018a3660046105b8565b61027f565b61016761019d3660046105b8565b6102df565b6100e76101b036600461058c565b610336565b6100e76101c33660046105b8565b61035f565b610123600081565b6100e76101de3660046105b8565b610379565b61012360008051602061064183398151915281565b61016761020636600461058c565b610385565b6000610216826103aa565b92915050565b600082815260208190526040902060010154610237816103df565b61024183836103ec565b50505050565b6001600160a01b03811633146102705760405163334bd91960e11b815260040160405180910390fd5b61027a828261047e565b505050565b6340a141ff60e01b610292600033610336565b806102a257506102a28133610336565b6102c75760405162461bcd60e51b81526004016102be906105d3565b60405180910390fd5b61027a6000805160206106418339815191528361047e565b632691c64760e11b6102f2600033610336565b8061030257506103028133610336565b61031e5760405162461bcd60e51b81526004016102be906105d3565b61027a600080516020610641833981519152836103ec565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600061021660008051602061064183398151915283610336565b60006102168183610336565b6000828152602081905260409020600101546103a0816103df565b610241838361047e565b60006001600160e01b03198216637965db0b60e01b148061021657506301ffc9a760e01b6001600160e01b0319831614610216565b6103e981336104e9565b50565b60006103f88383610336565b610476576000838152602081815260408083206001600160a01b03861684529091529020805460ff1916600117905561042e3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610216565b506000610216565b600061048a8383610336565b15610476576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610216565b6104f38282610336565b6105225760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016102be565b5050565b60006020828403121561053857600080fd5b81356001600160e01b03198116811461055057600080fd5b9392505050565b60006020828403121561056957600080fd5b5035919050565b80356001600160a01b038116811461058757600080fd5b919050565b6000806040838503121561059f57600080fd5b823591506105af60208401610570565b90509250929050565b6000602082840312156105ca57600080fd5b61055082610570565b60208082526047908201527f5b4163636573734d616e6167656d656e745d204f6e6c79207468652041646d6960408201527f6e206f722066756e6374696f6e206772616e74656420757365722063616e20696060820152661b9d195c9858dd60ca1b608082015260a0019056fe21702c8af46127c7fa207f89d0b0a8441bb32959a0ac7df790e9ab1a25c98926a2646970667358221220c180b1101ab7dec8c2e1ca45bb0604dbf82c8be32ea261770781832d22912fca64736f6c63430008140033", - "devdoc": { - "errors": { - "AccessControlBadConfirmation()": [ - { - "details": "The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}." - } - ], - "AccessControlUnauthorizedAccount(address,bytes32)": [ - { - "details": "The `account` is missing a role." - } - ] - }, - "events": { - "RoleAdminChanged(bytes32,bytes32,bytes32)": { - "details": "Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this." - }, - "RoleGranted(bytes32,address,address)": { - "details": "Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}." - }, - "RoleRevoked(bytes32,address,address)": { - "details": "Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)" - } - }, - "kind": "dev", - "methods": { - "addValidator(address)": { - "details": "Add a validator to the contract" - }, - "getRoleAdmin(bytes32)": { - "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." - }, - "grantRole(bytes32,address)": { - "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event." - }, - "hasAdminRole(address)": { - "details": "Check if an address has the admin role" - }, - "hasRole(bytes32,address)": { - "details": "Returns `true` if `account` has been granted `role`." - }, - "hasValidatorRole(address)": { - "details": "Check if an address has the validator role", - "params": { - "_address": "The address to check" - } - }, - "removeValidator(address)": { - "details": "Remove a validator from the contract" - }, - "renounceRole(bytes32,address)": { - "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event." - }, - "revokeRole(bytes32,address)": { - "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event." - }, - "supportsInterface(bytes4)": { - "details": "See {IERC165-supportsInterface}." - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 26, - "contract": "contracts/AccessManager.sol:AccessManager", - "label": "_roles", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_bytes32,t_struct(RoleData)21_storage)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_address,t_bool)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_mapping(t_bytes32,t_struct(RoleData)21_storage)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => struct AccessControl.RoleData)", - "numberOfBytes": "32", - "value": "t_struct(RoleData)21_storage" - }, - "t_struct(RoleData)21_storage": { - "encoding": "inplace", - "label": "struct AccessControl.RoleData", - "members": [ - { - "astId": 18, - "contract": "contracts/AccessManager.sol:AccessManager", - "label": "hasRole", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_address,t_bool)" - }, - { - "astId": 20, - "contract": "contracts/AccessManager.sol:AccessManager", - "label": "adminRole", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - } - ], - "numberOfBytes": "64" - } - } - } -} \ No newline at end of file +{"address":"0xd0A50194CeFf1A33E2a831F80EBfa2b11aC44B78","abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"AGENT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_validator","type":"address"}],"name":"addValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"hasAdminRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"hasValidatorRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_validator","type":"address"}],"name":"removeValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]} \ No newline at end of file diff --git a/packages/hardhat/deployments/sepolia/DeedNFT.json b/packages/hardhat/deployments/sepolia/DeedNFT.json index 01140331..4b2ae409 100644 --- a/packages/hardhat/deployments/sepolia/DeedNFT.json +++ b/packages/hardhat/deployments/sepolia/DeedNFT.json @@ -1,1132 +1 @@ -{ - "address": "0x215c20C0b355AB8b4c109c3FA88ab6B22B8ee80F", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_accessManager", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "ERC721IncorrectOwner", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "ERC721InsufficientApproval", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "approver", - "type": "address" - } - ], - "name": "ERC721InvalidApprover", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "operator", - "type": "address" - } - ], - "name": "ERC721InvalidOperator", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "ERC721InvalidOwner", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "ERC721InvalidReceiver", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "ERC721InvalidSender", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "ERC721NonexistentToken", - "type": "error" - }, - { - "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": [ - { - "indexed": false, - "internalType": "uint256", - "name": "_fromTokenId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_toTokenId", - "type": "uint256" - } - ], - "name": "BatchMetadataUpdate", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "deedId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "enum DeedNFT.AssetType", - "name": "newAssetType", - "type": "uint8" - } - ], - "name": "DeedNFTAssetTypeSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "deedId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bool", - "name": "isValid", - "type": "bool" - } - ], - "name": "DeedNFTAssetValidationSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "deedId", - "type": "uint256" - } - ], - "name": "DeedNFTBurned", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "deedId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "newIpfsDetailsHash", - "type": "string" - } - ], - "name": "DeedNFTIpfsDetailsSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "deedId", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "enum DeedNFT.AssetType", - "name": "assetType", - "type": "uint8" - }, - { - "internalType": "bool", - "name": "isValidated", - "type": "bool" - } - ], - "indexed": false, - "internalType": "struct DeedNFT.DeedInfo", - "name": "deedInfo", - "type": "tuple" - }, - { - "indexed": false, - "internalType": "address", - "name": "minter", - "type": "address" - } - ], - "name": "DeedNFTMinted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "_tokenId", - "type": "uint256" - } - ], - "name": "MetadataUpdate", - "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": "nonpayable", - "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": "_deedId", - "type": "uint256" - } - ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_deedId", - "type": "uint256" - } - ], - "name": "canSubdivide", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "getApproved", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_deedId", - "type": "uint256" - } - ], - "name": "getDeedInfo", - "outputs": [ - { - "components": [ - { - "internalType": "enum DeedNFT.AssetType", - "name": "assetType", - "type": "uint8" - }, - { - "internalType": "bool", - "name": "isValidated", - "type": "bool" - } - ], - "internalType": "struct DeedNFT.DeedInfo", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "hasAdminRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "_address", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "hasValidatorRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "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": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "string", - "name": "_ipfsDetailsHash", - "type": "string" - }, - { - "internalType": "enum DeedNFT.AssetType", - "name": "_assetType", - "type": "uint8" - } - ], - "name": "mintAsset", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "nextDeedId", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "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": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "safeTransferFrom", - "outputs": [], - "stateMutability": "nonpayable", - "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": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "name": "setApprovalForAll", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_deedId", - "type": "uint256" - }, - { - "internalType": "enum DeedNFT.AssetType", - "name": "_assetType", - "type": "uint8" - } - ], - "name": "setAssetType", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_deedId", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "_isValid", - "type": "bool" - } - ], - "name": "setAssetValidation", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_deedId", - "type": "uint256" - }, - { - "internalType": "string", - "name": "_ipfsDetailsHash", - "type": "string" - } - ], - "name": "setIpfsDetailsHash", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_deedId", - "type": "uint256" - } - ], - "name": "tokenURI", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "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": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x57ad2ba2d173057ce0c717516d1b11d1850867637b2723766a6cd64d779753cf", - "receipt": { - "to": null, - "from": "0x91B0d67D3F47A30FBEeB159E67209Ad6cb2cE22E", - "contractAddress": "0x215c20C0b355AB8b4c109c3FA88ab6B22B8ee80F", - "transactionIndex": 64, - "gasUsed": "1907073", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x902b3a06a1d5db1446897b7ad3a1ae099b35257f6a4e7a7657f17f5b7655a4ed", - "transactionHash": "0x57ad2ba2d173057ce0c717516d1b11d1850867637b2723766a6cd64d779753cf", - "logs": [], - "blockNumber": 5100727, - "cumulativeGasUsed": "7813001", - "status": 1, - "byzantium": true - }, - "args": [ - "0xCD4e41B590F3052F9420D69842FCe4ce4E83a797" - ], - "numDeployments": 3, - "solcInputHash": "c539a49b1aefee233566f7faf33b52cb", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_accessManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721IncorrectOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721InsufficientApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC721InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonexistentToken\",\"type\":\"error\"},{\"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\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_toTokenId\",\"type\":\"uint256\"}],\"name\":\"BatchMetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"deedId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enum DeedNFT.AssetType\",\"name\":\"newAssetType\",\"type\":\"uint8\"}],\"name\":\"DeedNFTAssetTypeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"deedId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"}],\"name\":\"DeedNFTAssetValidationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"deedId\",\"type\":\"uint256\"}],\"name\":\"DeedNFTBurned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"deedId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"newIpfsDetailsHash\",\"type\":\"string\"}],\"name\":\"DeedNFTIpfsDetailsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"deedId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"enum DeedNFT.AssetType\",\"name\":\"assetType\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isValidated\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"struct DeedNFT.DeedInfo\",\"name\":\"deedInfo\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"DeedNFTMinted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"MetadataUpdate\",\"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\":\"nonpayable\",\"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\":\"_deedId\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_deedId\",\"type\":\"uint256\"}],\"name\":\"canSubdivide\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_deedId\",\"type\":\"uint256\"}],\"name\":\"getDeedInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"enum DeedNFT.AssetType\",\"name\":\"assetType\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isValidated\",\"type\":\"bool\"}],\"internalType\":\"struct DeedNFT.DeedInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"hasAdminRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"hasValidatorRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_ipfsDetailsHash\",\"type\":\"string\"},{\"internalType\":\"enum DeedNFT.AssetType\",\"name\":\"_assetType\",\"type\":\"uint8\"}],\"name\":\"mintAsset\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextDeedId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"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\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_deedId\",\"type\":\"uint256\"},{\"internalType\":\"enum DeedNFT.AssetType\",\"name\":\"_assetType\",\"type\":\"uint8\"}],\"name\":\"setAssetType\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_deedId\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_isValid\",\"type\":\"bool\"}],\"name\":\"setAssetValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_deedId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_ipfsDetailsHash\",\"type\":\"string\"}],\"name\":\"setIpfsDetailsHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"_interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_deedId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC721IncorrectOwner(address,uint256,address)\":[{\"details\":\"Indicates an error related to the ownership over a particular token. Used in transfers.\",\"params\":{\"owner\":\"Address of the current owner of a token.\",\"sender\":\"Address whose tokens are being transferred.\",\"tokenId\":\"Identifier number of a token.\"}}],\"ERC721InsufficientApproval(address,uint256)\":[{\"details\":\"Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\",\"params\":{\"operator\":\"Address that may be allowed to operate on tokens without being their owner.\",\"tokenId\":\"Identifier number of a token.\"}}],\"ERC721InvalidApprover(address)\":[{\"details\":\"Indicates a failure with the `approver` of a token to be approved. Used in approvals.\",\"params\":{\"approver\":\"Address initiating an approval operation.\"}}],\"ERC721InvalidOperator(address)\":[{\"details\":\"Indicates a failure with the `operator` to be approved. Used in approvals.\",\"params\":{\"operator\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC721InvalidOwner(address)\":[{\"details\":\"Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. Used in balance queries.\",\"params\":{\"owner\":\"Address of the current owner of a token.\"}}],\"ERC721InvalidReceiver(address)\":[{\"details\":\"Indicates a failure with the token `receiver`. Used in transfers.\",\"params\":{\"receiver\":\"Address to which tokens are being transferred.\"}}],\"ERC721InvalidSender(address)\":[{\"details\":\"Indicates a failure with the token `sender`. Used in transfers.\",\"params\":{\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC721NonexistentToken(uint256)\":[{\"details\":\"Indicates a `tokenId` whose `owner` is the zero address.\",\"params\":{\"tokenId\":\"Identifier number of a token.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"BatchMetadataUpdate(uint256,uint256)\":{\"details\":\"This event emits when the metadata of a range of tokens is changed. So that the third-party platforms such as NFT market could timely update the images and related attributes of the NFTs.\"},\"MetadataUpdate(uint256)\":{\"details\":\"This event emits when the metadata of a token is changed. So that the third-party platforms such as NFT market could timely update the images and related attributes of the NFT.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/DeedNFT.sol\":\"DeedNFT\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IAccessControl} from \\\"./IAccessControl.sol\\\";\\nimport {Context} from \\\"../utils/Context.sol\\\";\\nimport {ERC165} from \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```solidity\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```solidity\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\\n * to enforce additional security measures for this role.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address account => bool) hasRole;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 role => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with an {AccessControlUnauthorizedAccount} error including the required role.\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual returns (bool) {\\n return _roles[role].hasRole[account];\\n }\\n\\n /**\\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\\n * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\\n * is missing `role`.\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert AccessControlUnauthorizedAccount(account, role);\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `callerConfirmation`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address callerConfirmation) public virtual {\\n if (callerConfirmation != _msgSender()) {\\n revert AccessControlBadConfirmation();\\n }\\n\\n _revokeRole(role, callerConfirmation);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\\n if (!hasRole(role, account)) {\\n _roles[role].hasRole[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\\n if (hasRole(role, account)) {\\n _roles[role].hasRole[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n return true;\\n } else {\\n return false;\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev The `account` is missing a role.\\n */\\n error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\\n\\n /**\\n * @dev The caller of a function is not the expected one.\\n *\\n * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\\n */\\n error AccessControlBadConfirmation();\\n\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `callerConfirmation`.\\n */\\n function renounceRole(bytes32 role, address callerConfirmation) external;\\n}\\n\",\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0xde7e9fd9aee8d4f40772f96bb3b58836cbc6dfc0227014a061947f8821ea9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC4906.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4906.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\nimport {IERC721} from \\\"./IERC721.sol\\\";\\n\\n/// @title EIP-721 Metadata Update Extension\\ninterface IERC4906 is IERC165, IERC721 {\\n /// @dev This event emits when the metadata of a token is changed.\\n /// So that the third-party platforms such as NFT market could\\n /// timely update the images and related attributes of the NFT.\\n event MetadataUpdate(uint256 _tokenId);\\n\\n /// @dev This event emits when the metadata of a range of tokens is changed.\\n /// So that the third-party platforms such as NFT market could\\n /// timely update the images and related attributes of the NFTs.\\n event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);\\n}\\n\",\"keccak256\":\"0xb31b86c03f4677dcffa4655285d62433509513be9bafa0e04984565052d34e44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC721} from \\\"../token/ERC721/IERC721.sol\\\";\\n\",\"keccak256\":\"0xc4d7ebf63eb2f6bf3fee1b6c0ee775efa9f31b4843a5511d07eea147e212932d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard ERC20 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.\\n */\\ninterface IERC20Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC20InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC20InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC20InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC20InvalidSpender(address spender);\\n}\\n\\n/**\\n * @dev Standard ERC721 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.\\n */\\ninterface IERC721Errors {\\n /**\\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.\\n * Used in balance queries.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721InvalidOwner(address owner);\\n\\n /**\\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721NonexistentToken(uint256 tokenId);\\n\\n /**\\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param tokenId Identifier number of a token.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC721InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC721InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC721InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC721InvalidOperator(address operator);\\n}\\n\\n/**\\n * @dev Standard ERC1155 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.\\n */\\ninterface IERC1155Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC1155InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC1155InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC1155MissingApprovalForAll(address operator, address owner);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC1155InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC1155InvalidOperator(address operator);\\n\\n /**\\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\\n * Used in batch transfers.\\n * @param idsLength Length of the array of token identifiers\\n * @param valuesLength Length of the array of token amounts\\n */\\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\\n}\\n\",\"keccak256\":\"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/ERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC721} from \\\"./IERC721.sol\\\";\\nimport {IERC721Receiver} from \\\"./IERC721Receiver.sol\\\";\\nimport {IERC721Metadata} from \\\"./extensions/IERC721Metadata.sol\\\";\\nimport {Context} from \\\"../../utils/Context.sol\\\";\\nimport {Strings} from \\\"../../utils/Strings.sol\\\";\\nimport {IERC165, ERC165} from \\\"../../utils/introspection/ERC165.sol\\\";\\nimport {IERC721Errors} from \\\"../../interfaces/draft-IERC6093.sol\\\";\\n\\n/**\\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\\n * {ERC721Enumerable}.\\n */\\nabstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors {\\n using Strings for uint256;\\n\\n // Token name\\n string private _name;\\n\\n // Token symbol\\n string private _symbol;\\n\\n mapping(uint256 tokenId => address) private _owners;\\n\\n mapping(address owner => uint256) private _balances;\\n\\n mapping(uint256 tokenId => address) private _tokenApprovals;\\n\\n mapping(address owner => mapping(address operator => bool)) private _operatorApprovals;\\n\\n /**\\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\\n return\\n interfaceId == type(IERC721).interfaceId ||\\n interfaceId == type(IERC721Metadata).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC721-balanceOf}.\\n */\\n function balanceOf(address owner) public view virtual returns (uint256) {\\n if (owner == address(0)) {\\n revert ERC721InvalidOwner(address(0));\\n }\\n return _balances[owner];\\n }\\n\\n /**\\n * @dev See {IERC721-ownerOf}.\\n */\\n function ownerOf(uint256 tokenId) public view virtual returns (address) {\\n return _requireOwned(tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-name}.\\n */\\n function name() public view virtual returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-symbol}.\\n */\\n function symbol() public view virtual returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-tokenURI}.\\n */\\n function tokenURI(uint256 tokenId) public view virtual returns (string memory) {\\n _requireOwned(tokenId);\\n\\n string memory baseURI = _baseURI();\\n return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : \\\"\\\";\\n }\\n\\n /**\\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\\n * by default, can be overridden in child contracts.\\n */\\n function _baseURI() internal view virtual returns (string memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IERC721-approve}.\\n */\\n function approve(address to, uint256 tokenId) public virtual {\\n _approve(to, tokenId, _msgSender());\\n }\\n\\n /**\\n * @dev See {IERC721-getApproved}.\\n */\\n function getApproved(uint256 tokenId) public view virtual returns (address) {\\n _requireOwned(tokenId);\\n\\n return _getApproved(tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-setApprovalForAll}.\\n */\\n function setApprovalForAll(address operator, bool approved) public virtual {\\n _setApprovalForAll(_msgSender(), operator, approved);\\n }\\n\\n /**\\n * @dev See {IERC721-isApprovedForAll}.\\n */\\n function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {\\n return _operatorApprovals[owner][operator];\\n }\\n\\n /**\\n * @dev See {IERC721-transferFrom}.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) public virtual {\\n if (to == address(0)) {\\n revert ERC721InvalidReceiver(address(0));\\n }\\n // Setting an \\\"auth\\\" arguments enables the `_isAuthorized` check which verifies that the token exists\\n // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.\\n address previousOwner = _update(to, tokenId, _msgSender());\\n if (previousOwner != from) {\\n revert ERC721IncorrectOwner(from, tokenId, previousOwner);\\n }\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) public {\\n safeTransferFrom(from, to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {\\n transferFrom(from, to, tokenId);\\n _checkOnERC721Received(from, to, tokenId, data);\\n }\\n\\n /**\\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\\n *\\n * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the\\n * core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances\\n * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by\\n * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.\\n */\\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\\n return _owners[tokenId];\\n }\\n\\n /**\\n * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.\\n */\\n function _getApproved(uint256 tokenId) internal view virtual returns (address) {\\n return _tokenApprovals[tokenId];\\n }\\n\\n /**\\n * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in\\n * particular (ignoring whether it is owned by `owner`).\\n *\\n * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\\n * assumption.\\n */\\n function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {\\n return\\n spender != address(0) &&\\n (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);\\n }\\n\\n /**\\n * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.\\n * Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets\\n * the `spender` for the specific `tokenId`.\\n *\\n * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\\n * assumption.\\n */\\n function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {\\n if (!_isAuthorized(owner, spender, tokenId)) {\\n if (owner == address(0)) {\\n revert ERC721NonexistentToken(tokenId);\\n } else {\\n revert ERC721InsufficientApproval(spender, tokenId);\\n }\\n }\\n }\\n\\n /**\\n * @dev Unsafe write access to the balances, used by extensions that \\\"mint\\\" tokens using an {ownerOf} override.\\n *\\n * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that\\n * a uint256 would ever overflow from increments when these increments are bounded to uint128 values.\\n *\\n * WARNING: Increasing an account's balance using this function tends to be paired with an override of the\\n * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership\\n * remain consistent with one another.\\n */\\n function _increaseBalance(address account, uint128 value) internal virtual {\\n unchecked {\\n _balances[account] += value;\\n }\\n }\\n\\n /**\\n * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner\\n * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.\\n *\\n * The `auth` argument is optional. If the value passed is non 0, then this function will check that\\n * `auth` is either the owner of the token, or approved to operate on the token (by the owner).\\n *\\n * Emits a {Transfer} event.\\n *\\n * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.\\n */\\n function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {\\n address from = _ownerOf(tokenId);\\n\\n // Perform (optional) operator check\\n if (auth != address(0)) {\\n _checkAuthorized(from, auth, tokenId);\\n }\\n\\n // Execute the update\\n if (from != address(0)) {\\n // Clear approval. No need to re-authorize or emit the Approval event\\n _approve(address(0), tokenId, address(0), false);\\n\\n unchecked {\\n _balances[from] -= 1;\\n }\\n }\\n\\n if (to != address(0)) {\\n unchecked {\\n _balances[to] += 1;\\n }\\n }\\n\\n _owners[tokenId] = to;\\n\\n emit Transfer(from, to, tokenId);\\n\\n return from;\\n }\\n\\n /**\\n * @dev Mints `tokenId` and transfers it to `to`.\\n *\\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - `to` cannot be the zero address.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _mint(address to, uint256 tokenId) internal {\\n if (to == address(0)) {\\n revert ERC721InvalidReceiver(address(0));\\n }\\n address previousOwner = _update(to, tokenId, address(0));\\n if (previousOwner != address(0)) {\\n revert ERC721InvalidSender(address(0));\\n }\\n }\\n\\n /**\\n * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeMint(address to, uint256 tokenId) internal {\\n _safeMint(to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n */\\n function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\\n _mint(to, tokenId);\\n _checkOnERC721Received(address(0), to, tokenId, data);\\n }\\n\\n /**\\n * @dev Destroys `tokenId`.\\n * The approval is cleared when the token is burned.\\n * This is an internal function that does not check if the sender is authorized to operate on the token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _burn(uint256 tokenId) internal {\\n address previousOwner = _update(address(0), tokenId, address(0));\\n if (previousOwner == address(0)) {\\n revert ERC721NonexistentToken(tokenId);\\n }\\n }\\n\\n /**\\n * @dev Transfers `tokenId` from `from` to `to`.\\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _transfer(address from, address to, uint256 tokenId) internal {\\n if (to == address(0)) {\\n revert ERC721InvalidReceiver(address(0));\\n }\\n address previousOwner = _update(to, tokenId, address(0));\\n if (previousOwner == address(0)) {\\n revert ERC721NonexistentToken(tokenId);\\n } else if (previousOwner != from) {\\n revert ERC721IncorrectOwner(from, tokenId, previousOwner);\\n }\\n }\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients\\n * are aware of the ERC721 standard to prevent tokens from being forever locked.\\n *\\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\\n *\\n * This internal function is like {safeTransferFrom} in the sense that it invokes\\n * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.\\n * implement alternative mechanisms to perform token transfer, such as signature-based.\\n *\\n * Requirements:\\n *\\n * - `tokenId` token must exist and be owned by `from`.\\n * - `to` cannot be the zero address.\\n * - `from` cannot be the zero address.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeTransfer(address from, address to, uint256 tokenId) internal {\\n _safeTransfer(from, to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is\\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n */\\n function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\\n _transfer(from, to, tokenId);\\n _checkOnERC721Received(from, to, tokenId, data);\\n }\\n\\n /**\\n * @dev Approve `to` to operate on `tokenId`\\n *\\n * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is\\n * either the owner of the token, or approved to operate on all tokens held by this owner.\\n *\\n * Emits an {Approval} event.\\n *\\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\\n */\\n function _approve(address to, uint256 tokenId, address auth) internal {\\n _approve(to, tokenId, auth, true);\\n }\\n\\n /**\\n * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not\\n * emitted in the context of transfers.\\n */\\n function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {\\n // Avoid reading the owner unless necessary\\n if (emitEvent || auth != address(0)) {\\n address owner = _requireOwned(tokenId);\\n\\n // We do not use _isAuthorized because single-token approvals should not be able to call approve\\n if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {\\n revert ERC721InvalidApprover(auth);\\n }\\n\\n if (emitEvent) {\\n emit Approval(owner, to, tokenId);\\n }\\n }\\n\\n _tokenApprovals[tokenId] = to;\\n }\\n\\n /**\\n * @dev Approve `operator` to operate on all of `owner` tokens\\n *\\n * Requirements:\\n * - operator can't be the address zero.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\\n if (operator == address(0)) {\\n revert ERC721InvalidOperator(operator);\\n }\\n _operatorApprovals[owner][operator] = approved;\\n emit ApprovalForAll(owner, operator, approved);\\n }\\n\\n /**\\n * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).\\n * Returns the owner.\\n *\\n * Overrides to ownership logic should be done to {_ownerOf}.\\n */\\n function _requireOwned(uint256 tokenId) internal view returns (address) {\\n address owner = _ownerOf(tokenId);\\n if (owner == address(0)) {\\n revert ERC721NonexistentToken(tokenId);\\n }\\n return owner;\\n }\\n\\n /**\\n * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the\\n * recipient doesn't accept the token transfer. The call is not executed if the target address is not a contract.\\n *\\n * @param from address representing the previous owner of the given token ID\\n * @param to target address that will receive the tokens\\n * @param tokenId uint256 ID of the token to be transferred\\n * @param data bytes optional data to send along with the call\\n */\\n function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private {\\n if (to.code.length > 0) {\\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\\n if (retval != IERC721Receiver.onERC721Received.selector) {\\n revert ERC721InvalidReceiver(to);\\n }\\n } catch (bytes memory reason) {\\n if (reason.length == 0) {\\n revert ERC721InvalidReceiver(to);\\n } else {\\n /// @solidity memory-safe-assembly\\n assembly {\\n revert(add(32, reason), mload(reason))\\n }\\n }\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x13dd061770956c8489b80cfc89d9cdfc8ea2783d953691ea037a380731d52784\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\\n * a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or\\n * {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\\n * a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the address zero.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be\\n * reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x7f7a26306c79a65fb8b3b6c757cd74660c532cd8a02e165488e30027dd34ca49\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721URIStorage.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {ERC721} from \\\"../ERC721.sol\\\";\\nimport {Strings} from \\\"../../../utils/Strings.sol\\\";\\nimport {IERC4906} from \\\"../../../interfaces/IERC4906.sol\\\";\\nimport {IERC165} from \\\"../../../interfaces/IERC165.sol\\\";\\n\\n/**\\n * @dev ERC721 token with storage based token URI management.\\n */\\nabstract contract ERC721URIStorage is IERC4906, ERC721 {\\n using Strings for uint256;\\n\\n // Interface ID as defined in ERC-4906. This does not correspond to a traditional interface ID as ERC-4906 only\\n // defines events and does not include any external function.\\n bytes4 private constant ERC4906_INTERFACE_ID = bytes4(0x49064906);\\n\\n // Optional mapping for token URIs\\n mapping(uint256 tokenId => string) private _tokenURIs;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) {\\n return interfaceId == ERC4906_INTERFACE_ID || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-tokenURI}.\\n */\\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\n _requireOwned(tokenId);\\n\\n string memory _tokenURI = _tokenURIs[tokenId];\\n string memory base = _baseURI();\\n\\n // If there is no base URI, return the token URI.\\n if (bytes(base).length == 0) {\\n return _tokenURI;\\n }\\n // If both are set, concatenate the baseURI and tokenURI (via string.concat).\\n if (bytes(_tokenURI).length > 0) {\\n return string.concat(base, _tokenURI);\\n }\\n\\n return super.tokenURI(tokenId);\\n }\\n\\n /**\\n * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.\\n *\\n * Emits {MetadataUpdate}.\\n */\\n function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {\\n _tokenURIs[tokenId] = _tokenURI;\\n emit MetadataUpdate(tokenId);\\n }\\n}\\n\",\"keccak256\":\"0xcc6f49e0c57072d6a18eef0d5fc22a4cc20462c18f0c365d2dd9a2c732fde670\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC721} from \\\"../IERC721.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721Metadata is IERC721 {\\n /**\\n * @dev Returns the token collection name.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the token collection symbol.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n */\\n function tokenURI(uint256 tokenId) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x37d1aaaa5a2908a09e9dcf56a26ddf762ecf295afb5964695937344fc6802ce1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x75a4ee64c68dbd5f38bddd06e664a64c8271b4caa554fb6f0607dfd672bb4bf3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Math} from \\\"./math/Math.sol\\\";\\nimport {SignedMath} from \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant HEX_DIGITS = \\\"0123456789abcdef\\\";\\n uint8 private constant ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev The `value` string doesn't fit in the specified `length`.\\n */\\n error StringsInsufficientHexLength(uint256 value, uint256 length);\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toStringSigned(int256 value) internal pure returns (string memory) {\\n return string.concat(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value)));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n uint256 localValue = value;\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = HEX_DIGITS[localValue & 0xf];\\n localValue >>= 4;\\n }\\n if (localValue != 0) {\\n revert StringsInsufficientHexLength(value, length);\\n }\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\\n * representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n /**\\n * @dev Muldiv operation overflow.\\n */\\n error MathOverflowedMulDiv();\\n\\n enum Rounding {\\n Floor, // Toward negative infinity\\n Ceil, // Toward positive infinity\\n Trunc, // Toward zero\\n Expand // Away from zero\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, with an overflow flag.\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds towards infinity instead\\n * of rounding towards zero.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (b == 0) {\\n // Guarantee the same behavior as in a regular Solidity division.\\n return a / b;\\n }\\n\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n * denominator == 0.\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n * Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0 = x * y; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n if (denominator <= prod1) {\\n revert MathOverflowedMulDiv();\\n }\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n uint256 twos = denominator & (0 - denominator);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\\n // works in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n * towards zero.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n */\\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n return uint8(rounding) % 2 == 1;\\n }\\n}\\n\",\"keccak256\":\"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72\",\"license\":\"MIT\"},\"contracts/AccessManager.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\r\\npragma solidity ^0.8.20;\\r\\nimport \\\"@openzeppelin/contracts/access/AccessControl.sol\\\";\\r\\n\\r\\ncontract AccessManager is AccessControl {\\r\\n bytes32 public constant VALIDATOR_ROLE = keccak256(\\\"VALIDATOR_ROLE\\\");\\r\\n bytes32 public constant AGENT_ROLE = keccak256(\\\"AGENT_ROLE\\\");\\r\\n\\r\\n constructor(address admin) {\\r\\n _grantRole(DEFAULT_ADMIN_ROLE, admin);\\r\\n }\\r\\n\\r\\n /**\\r\\n * Use this modifier to manage the fonction access more granularly\\r\\n * @param _functionSig The signature of the function to be called\\r\\n */\\r\\n modifier functionRoleOrAdmin(bytes32 _functionSig) {\\r\\n require(\\r\\n hasRole(DEFAULT_ADMIN_ROLE, _msgSender()) || hasRole(_functionSig, _msgSender()),\\r\\n \\\"[AccessManagement] Only the Admin or function granted user can interact\\\"\\r\\n );\\r\\n _;\\r\\n }\\r\\n\\r\\n /**\\r\\n * @dev Add a validator to the contract\\r\\n */\\r\\n function addValidator(address _validator) public functionRoleOrAdmin(this.addValidator.selector) {\\r\\n _grantRole(VALIDATOR_ROLE, _validator);\\r\\n }\\r\\n\\r\\n /**\\r\\n * @dev Remove a validator from the contract\\r\\n */\\r\\n function removeValidator(address _validator) public functionRoleOrAdmin(this.removeValidator.selector) {\\r\\n _revokeRole(VALIDATOR_ROLE, _validator);\\r\\n }\\r\\n\\r\\n /**\\r\\n * @dev Check if an address has the admin role\\r\\n */\\r\\n function hasAdminRole(address _address) public view returns (bool) {\\r\\n return hasRole(DEFAULT_ADMIN_ROLE, _address);\\r\\n }\\r\\n\\r\\n /**\\r\\n * @dev Check if an address has the validator role\\r\\n * @param _address The address to check\\r\\n */\\r\\n function hasValidatorRole(address _address) public view returns (bool) {\\r\\n return hasRole(VALIDATOR_ROLE, _address);\\r\\n }\\r\\n\\r\\n /**\\r\\n * @dev See {IERC165-supportsInterface}.\\r\\n */\\r\\n function supportsInterface(bytes4 _interfaceId) public view virtual override(AccessControl) returns (bool) {\\r\\n return super.supportsInterface(_interfaceId);\\r\\n }\\r\\n}\\r\\n\\r\\ncontract AccessManagerBase is Context {\\r\\n AccessManager accessManager;\\r\\n\\r\\n constructor(address _accessManager) {\\r\\n accessManager = AccessManager(_accessManager);\\r\\n }\\r\\n\\r\\n /**\\r\\n * Use this modifier to restrict to admin only\\r\\n */\\r\\n modifier onlyAdmin() {\\r\\n require(\\r\\n accessManager.hasRole(accessManager.DEFAULT_ADMIN_ROLE(), _msgSender()),\\r\\n \\\"[AccessManagement] Only the admin can interact\\\"\\r\\n );\\r\\n _;\\r\\n }\\r\\n\\r\\n /**\\r\\n * Use this modifier to restrict to validator only\\r\\n */\\r\\n modifier onlyValidator() {\\r\\n require(\\r\\n accessManager.hasRole(accessManager.VALIDATOR_ROLE(), _msgSender()),\\r\\n \\\"[AccessManagement] Only the validator can interact\\\"\\r\\n );\\r\\n _;\\r\\n }\\r\\n\\r\\n /**\\r\\n * Use this modifier to restrict to validator only\\r\\n */\\r\\n modifier onlyAgent() {\\r\\n require(\\r\\n accessManager.hasRole(accessManager.AGENT_ROLE(), _msgSender()),\\r\\n \\\"[AccessManagement] Only the agent can interact\\\"\\r\\n );\\r\\n _;\\r\\n }\\r\\n\\r\\n /**\\r\\n * Use this modifier to manage the fonction access more granularly\\r\\n */\\r\\n modifier onlyRole(bytes32 _role) {\\r\\n require(accessManager.hasRole(_role, _msgSender()), \\\"[AccessManager] Only the validator can interact\\\");\\r\\n _;\\r\\n }\\r\\n\\r\\n /**\\r\\n * Use this modifier to manage the fonction access more granularly\\r\\n * @param _functionSig The signature of the function to be called\\r\\n */\\r\\n modifier functionRoleOrAdmin(bytes32 _functionSig) {\\r\\n require(\\r\\n hasRole(accessManager.DEFAULT_ADMIN_ROLE(), _msgSender()) || hasRole(_functionSig, _msgSender()),\\r\\n \\\"[AccessManagement] Only the Admin or function granted user can interact\\\"\\r\\n );\\r\\n _;\\r\\n }\\r\\n\\r\\n function hasAdminRole() public view returns (bool) {\\r\\n return accessManager.hasAdminRole(_msgSender());\\r\\n }\\r\\n\\r\\n function hasValidatorRole() public view returns (bool) {\\r\\n return accessManager.hasValidatorRole(_msgSender());\\r\\n }\\r\\n\\r\\n function hasRole(bytes32 _role, address _address) public view returns (bool) {\\r\\n return accessManager.hasRole(_role, _address);\\r\\n }\\r\\n}\\r\\n\",\"keccak256\":\"0x5b2ca72fa86518264487c3ef31015a3fb9efa2e871723736611a2a41a28ec5ef\",\"license\":\"AGPL-3.0\"},\"contracts/DeedNFT.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0\\r\\npragma solidity ^0.8.20;\\r\\nimport \\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\";\\r\\nimport \\\"@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol\\\";\\r\\nimport \\\"./AccessManager.sol\\\";\\r\\n\\r\\ncontract DeedNFT is ERC721, ERC721URIStorage, AccessManagerBase {\\r\\n struct DeedInfo {\\r\\n AssetType assetType;\\r\\n bool isValidated;\\r\\n }\\r\\n\\r\\n uint256 public nextDeedId;\\r\\n mapping(uint256 => DeedInfo) private deedInfoMap;\\r\\n\\r\\n enum AssetType {\\r\\n Land,\\r\\n Vehicle,\\r\\n Estate,\\r\\n CommercialEquipment\\r\\n }\\r\\n\\r\\n event DeedNFTMinted(uint256 deedId, DeedInfo deedInfo, address minter);\\r\\n event DeedNFTBurned(uint256 deedId);\\r\\n event DeedNFTAssetValidationSet(uint256 deedId, bool isValid);\\r\\n event DeedNFTIpfsDetailsSet(uint256 deedId, string newIpfsDetailsHash);\\r\\n event DeedNFTAssetTypeSet(uint256 deedId, AssetType newAssetType);\\r\\n\\r\\n constructor(address _accessManager) ERC721(\\\"DeedNFT\\\", \\\"DEED\\\") ERC721URIStorage() AccessManagerBase(_accessManager) {\\r\\n nextDeedId = 1;\\r\\n }\\r\\n\\r\\n modifier deedExists(uint256 _deedId) {\\r\\n require(\\r\\n _ownerOf(_deedId) != address(0),\\r\\n string.concat(\\\"[DeedNFT] Deed does not exist with id \\\", Strings.toString(_deedId))\\r\\n );\\r\\n _;\\r\\n }\\r\\n\\r\\n modifier onlyOwner(uint256 _deedId) {\\r\\n require(\\r\\n _msgSender() == _ownerOf(_deedId),\\r\\n string.concat(\\\"[DeedNFT] Must be owner of the Deed with id \\\", Strings.toString(_deedId))\\r\\n );\\r\\n _;\\r\\n }\\r\\n\\r\\n function mintAsset(\\r\\n address _owner,\\r\\n string memory _ipfsDetailsHash,\\r\\n AssetType _assetType\\r\\n ) public onlyValidator returns (uint256) {\\r\\n _mint(_owner, nextDeedId);\\r\\n\\r\\n DeedInfo storage deedInfo = deedInfoMap[nextDeedId];\\r\\n deedInfo.assetType = _assetType;\\r\\n _setTokenURI(nextDeedId, _ipfsDetailsHash);\\r\\n deedInfo.isValidated = true;\\r\\n emit DeedNFTMinted(nextDeedId, deedInfo, _msgSender());\\r\\n nextDeedId = nextDeedId + 1;\\r\\n return nextDeedId;\\r\\n }\\r\\n\\r\\n function burn(uint256 _deedId) public onlyOwner(_deedId) {\\r\\n _burn(_deedId);\\r\\n emit DeedNFTBurned(_deedId);\\r\\n }\\r\\n\\r\\n function setAssetValidation(uint256 _deedId, bool _isValid) public onlyValidator {\\r\\n require(_ownerOf(_deedId) != _msgSender(), \\\"[DeedNFT] Owner cannot validate their own asset\\\");\\r\\n _setAssetValidation(_deedId, _isValid);\\r\\n }\\r\\n\\r\\n function setIpfsDetailsHash(\\r\\n uint256 _deedId,\\r\\n string memory _ipfsDetailsHash\\r\\n ) public virtual deedExists(_deedId) onlyOwner(_deedId) {\\r\\n _setTokenURI(_deedId, _ipfsDetailsHash);\\r\\n _setAssetValidation(_deedId, false);\\r\\n emit DeedNFTIpfsDetailsSet(_deedId, _ipfsDetailsHash);\\r\\n }\\r\\n\\r\\n function setAssetType(uint256 _deedId, AssetType _assetType) public deedExists(_deedId) onlyOwner(_deedId) {\\r\\n DeedInfo storage deedInfo = deedInfoMap[_deedId];\\r\\n deedInfo.assetType = _assetType;\\r\\n _setAssetValidation(_deedId, false);\\r\\n emit DeedNFTAssetTypeSet(_deedId, _assetType);\\r\\n }\\r\\n\\r\\n function getDeedInfo(uint256 _deedId) public view deedExists(_deedId) returns (DeedInfo memory) {\\r\\n return deedInfoMap[_deedId];\\r\\n }\\r\\n\\r\\n function canSubdivide(uint256 _deedId) external view returns (bool) {\\r\\n AssetType assetType = getDeedInfo(_deedId).assetType;\\r\\n return assetType == AssetType.Land || assetType == AssetType.Estate;\\r\\n }\\r\\n\\r\\n function supportsInterface(\\r\\n bytes4 _interfaceId\\r\\n ) public view virtual override(ERC721, ERC721URIStorage) returns (bool) {\\r\\n return super.supportsInterface(_interfaceId);\\r\\n }\\r\\n\\r\\n function tokenURI(uint256 _deedId) public view override(ERC721, ERC721URIStorage) returns (string memory) {\\r\\n return super.tokenURI(_deedId);\\r\\n }\\r\\n\\r\\n function _setAssetValidation(uint256 _deedId, bool _isValid) internal {\\r\\n DeedInfo storage deedInfo = deedInfoMap[_deedId];\\r\\n deedInfo.isValidated = _isValid;\\r\\n emit DeedNFTAssetValidationSet(_deedId, _isValid);\\r\\n }\\r\\n}\\r\\n\",\"keccak256\":\"0x0a434b9be5b984e2cb5a2941b9dd2e0120c80f8c3b287d8d890aeee9659ec013\",\"license\":\"AGPL-3.0\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b5060405162002231380380620022318339810160408190526200003491620000c2565b80604051806040016040528060078152602001661119595913919560ca1b815250604051806040016040528060048152602001631111515160e21b815250816000908162000083919062000199565b50600162000092828262000199565b5050600780546001600160a01b0319166001600160a01b0393909316929092179091555050600160085562000265565b600060208284031215620000d557600080fd5b81516001600160a01b0381168114620000ed57600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200011f57607f821691505b6020821081036200014057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200019457600081815260208120601f850160051c810160208610156200016f5750805b601f850160051c820191505b8181101562000190578281556001016200017b565b5050505b505050565b81516001600160401b03811115620001b557620001b5620000f4565b620001cd81620001c684546200010a565b8462000146565b602080601f831160018114620002055760008415620001ec5750858301515b600019600386901b1c1916600185901b17855562000190565b600085815260208120601f198616915b82811015620002365788860151825594840194600190910190840162000215565b5085821015620002555787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611fbc80620002756000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806370a08231116100c3578063b82c35691161007c578063b82c3569146102df578063b88d4fde146102f2578063b99c23e314610305578063c87b56dd1461030d578063e985e9c514610320578063f1bc66731461033357600080fd5b806370a082311461028d57806389b9e75f146102a057806391d14854146102a857806395d89b41146102bb578063985e3a64146102c3578063a22cb465146102cc57600080fd5b806342842e0e1161011557806342842e0e1461020e57806342966c681461022157806362d402bc146102345780636352211e14610254578063682ece02146102675780636f6c15dd1461027a57600080fd5b806301ffc9a71461015d57806306fdde0314610185578063081812fc1461019a578063095ea7b3146101c55780631a6c41e2146101da57806323b872dd146101fb575b600080fd5b61017061016b3660046117a8565b610346565b60405190151581526020015b60405180910390f35b61018d610357565b60405161017c9190611815565b6101ad6101a8366004611828565b6103e9565b6040516001600160a01b03909116815260200161017c565b6101d86101d336600461185d565b610412565b005b6101ed6101e8366004611942565b610421565b60405190815260200161017c565b6101d86102093660046119a0565b6105e6565b6101d861021c3660046119a0565b610671565b6101d861022f366004611828565b610691565b610247610242366004611828565b610737565b60405161017c9190611a14565b6101ad610262366004611828565b610807565b6101d8610275366004611a37565b610812565b6101d8610288366004611a71565b610951565b6101ed61029b366004611aa1565b610ad4565b610170610b1c565b6101706102b6366004611abc565b610b9f565b61018d610c15565b6101ed60085481565b6101d86102da366004611adf565b610c24565b6101706102ed366004611828565b610c2f565b6101d8610300366004611b0b565b610c75565b610170610c8c565b61018d61031b366004611828565b610ca6565b61017061032e366004611b87565b610cb1565b6101d8610341366004611bb1565b610cdf565b600061035182610df6565b92915050565b60606000805461036690611bf8565b80601f016020809104026020016040519081016040528092919081815260200182805461039290611bf8565b80156103df5780601f106103b4576101008083540402835291602001916103df565b820191906000526020600020905b8154815290600101906020018083116103c257829003601f168201915b5050505050905090565b60006103f482610e1b565b506000828152600460205260409020546001600160a01b0316610351565b61041d828233610e53565b5050565b6007546040805163624dd75f60e11b815290516000926001600160a01b0316916391d1485491839163c49baebe9160048083019260209291908290030181865afa158015610473573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104979190611c2c565b336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa1580156104e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105069190611c45565b61052b5760405162461bcd60e51b815260040161052290611c62565b60405180910390fd5b61053784600854610e60565b600854600090815260096020526040902080548390829060ff19166001836003811115610566576105666119dc565b021790555061057760085485610ec5565b805461ff0019166101001781556008547f7a6cbbca54e6b169e8cd2ccacd8dccc9872cfeb370d865d3be365243d1005f5590826105b13390565b6040516105c093929190611cb4565b60405180910390a16008546105d6906001611cf3565b60088190559150505b9392505050565b6001600160a01b03821661061057604051633250574960e11b815260006004820152602401610522565b600061061d838333610f0e565b9050836001600160a01b0316816001600160a01b03161461066b576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610522565b50505050565b61068c83838360405180602001604052806000815250610c75565b505050565b8061069b81611002565b6001600160a01b0316336001600160a01b0316146106b88261101d565b6040516020016106c89190611d14565b604051602081830303815290604052906106f55760405162461bcd60e51b81526004016105229190611815565b506106ff826110b0565b6040518281527f61c6643f6e835939ae6da3352c52e1b29a86e4ee6599ab73c5d9a416f75d6ed0906020015b60405180910390a15050565b604080518082019091526000808252602082015281600061075782611002565b6001600160a01b0316141561076b8261101d565b60405160200161077b9190611d6e565b604051602081830303815290604052906107a85760405162461bcd60e51b81526004016105229190611815565b506000838152600960205260409081902081518083019092528054829060ff1660038111156107d9576107d96119dc565b60038111156107ea576107ea6119dc565b81529054610100900460ff16151560209091015291505b50919050565b600061035182610e1b565b81600061081e82611002565b6001600160a01b031614156108328261101d565b6040516020016108429190611d6e565b6040516020818303038152906040529061086f5760405162461bcd60e51b81526004016105229190611815565b508261087a81611002565b6001600160a01b0316336001600160a01b0316146108978261101d565b6040516020016108a79190611d14565b604051602081830303815290604052906108d45760405162461bcd60e51b81526004016105229190611815565b50600084815260096020526040902080548490829060ff19166001836003811115610901576109016119dc565b02179055506109118560006110eb565b7f41779e8814a589644c78c07c027c39f8ba699dc2f20bf422c3065cdaa4b8a1b08585604051610942929190611dc2565b60405180910390a15050505050565b6007546040805163624dd75f60e11b815290516001600160a01b03909216916391d1485491839163c49baebe916004808201926020929091908290030181865afa1580156109a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c79190611c2c565b336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015610a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a369190611c45565b610a525760405162461bcd60e51b815260040161052290611c62565b33610a5c83611002565b6001600160a01b031603610aca5760405162461bcd60e51b815260206004820152602f60248201527f5b446565644e46545d204f776e65722063616e6e6f742076616c69646174652060448201526e1d1a195a5c881bdddb88185cdcd95d608a1b6064820152608401610522565b61041d82826110eb565b60006001600160a01b038216610b00576040516322718ad960e21b815260006004820152602401610522565b506001600160a01b031660009081526003602052604090205490565b6007546000906001600160a01b031663940e1570335b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610b76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9a9190611c45565b905090565b600754604051632474521560e21b8152600481018490526001600160a01b03838116602483015260009216906391d1485490604401602060405180830381865afa158015610bf1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105df9190611c45565b60606001805461036690611bf8565b61041d33838361114d565b600080610c3b83610737565b5190506000816003811115610c5257610c526119dc565b14806105df57506002816003811115610c6d57610c6d6119dc565b149392505050565b610c808484846105e6565b61066b848484846111ec565b6007546000906001600160a01b031663c395fcb333610b32565b606061035182611315565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b816000610ceb82611002565b6001600160a01b03161415610cff8261101d565b604051602001610d0f9190611d6e565b60405160208183030381529060405290610d3c5760405162461bcd60e51b81526004016105229190611815565b5082610d4781611002565b6001600160a01b0316336001600160a01b031614610d648261101d565b604051602001610d749190611d14565b60405160208183030381529060405290610da15760405162461bcd60e51b81526004016105229190611815565b50610dac8484610ec5565b610db78460006110eb565b7f3d50eea1c859d5d9795c74b4caf49f4cb0c69ec6b47702a84fab87f23fdc15388484604051610de8929190611dd6565b60405180910390a150505050565b60006001600160e01b03198216632483248360e11b1480610351575061035182611426565b600080610e2783611002565b90506001600160a01b03811661035157604051637e27328960e01b815260048101849052602401610522565b61068c8383836001611476565b6001600160a01b038216610e8a57604051633250574960e11b815260006004820152602401610522565b6000610e9883836000610f0e565b90506001600160a01b0381161561068c576040516339e3563760e11b815260006004820152602401610522565b6000828152600660205260409020610edd8282611e3d565b506040518281527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200161072b565b600080610f1a84611002565b90506001600160a01b03831615610f3657610f3681848661157c565b6001600160a01b03811615610f7457610f53600085600080611476565b6001600160a01b038116600090815260036020526040902080546000190190555b6001600160a01b03851615610fa3576001600160a01b0385166000908152600360205260409020805460010190555b60008481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6000908152600260205260409020546001600160a01b031690565b6060600061102a836115e0565b600101905060008167ffffffffffffffff81111561104a5761104a611887565b6040519080825280601f01601f191660200182016040528015611074576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461107e57509392505050565b60006110bf6000836000610f0e565b90506001600160a01b03811661041d57604051637e27328960e01b815260048101839052602401610522565b600082815260096020908152604091829020805461ff001916610100851515908102919091178255835186815292830152917f906235be09503d8fda345aadd07a77160f47ec7155cea0fb9d683684271c4f09910160405180910390a1505050565b6001600160a01b03821661117f57604051630b61174360e31b81526001600160a01b0383166004820152602401610522565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561066b57604051630a85bd0160e11b81526001600160a01b0384169063150b7a029061122e903390889087908790600401611efd565b6020604051808303816000875af1925050508015611269575060408051601f3d908101601f1916820190925261126691810190611f3a565b60015b6112d2573d808015611297576040519150601f19603f3d011682016040523d82523d6000602084013e61129c565b606091505b5080516000036112ca57604051633250574960e11b81526001600160a01b0385166004820152602401610522565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b1461130e57604051633250574960e11b81526001600160a01b0385166004820152602401610522565b5050505050565b606061132082610e1b565b506000828152600660205260408120805461133a90611bf8565b80601f016020809104026020016040519081016040528092919081815260200182805461136690611bf8565b80156113b35780601f10611388576101008083540402835291602001916113b3565b820191906000526020600020905b81548152906001019060200180831161139657829003601f168201915b5050505050905060006113d160408051602081019091526000815290565b905080516000036113e3575092915050565b8151156114155780826040516020016113fd929190611f57565b60405160208183030381529060405292505050919050565b61141e846116b8565b949350505050565b60006001600160e01b031982166380ac58cd60e01b148061145757506001600160e01b03198216635b5e139f60e01b145b8061035157506301ffc9a760e01b6001600160e01b0319831614610351565b808061148a57506001600160a01b03821615155b1561154c57600061149a84610e1b565b90506001600160a01b038316158015906114c65750826001600160a01b0316816001600160a01b031614155b80156114d957506114d78184610cb1565b155b156115025760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610522565b811561154a5783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b61158783838361172c565b61068c576001600160a01b0383166115b557604051637e27328960e01b815260048101829052602401610522565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610522565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061161f5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061164b576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061166957662386f26fc10000830492506010015b6305f5e1008310611681576305f5e100830492506008015b612710831061169557612710830492506004015b606483106116a7576064830492506002015b600a83106103515760010192915050565b60606116c382610e1b565b5060006116db60408051602081019091526000815290565b905060008151116116fb57604051806020016040528060008152506105df565b806117058461101d565b604051602001611716929190611f57565b6040516020818303038152906040529392505050565b60006001600160a01b0383161580159061141e5750826001600160a01b0316846001600160a01b0316148061176657506117668484610cb1565b8061141e5750506000908152600460205260409020546001600160a01b03908116911614919050565b6001600160e01b0319811681146117a557600080fd5b50565b6000602082840312156117ba57600080fd5b81356105df8161178f565b60005b838110156117e05781810151838201526020016117c8565b50506000910152565b600081518084526118018160208601602086016117c5565b601f01601f19169290920160200192915050565b6020815260006105df60208301846117e9565b60006020828403121561183a57600080fd5b5035919050565b80356001600160a01b038116811461185857600080fd5b919050565b6000806040838503121561187057600080fd5b61187983611841565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156118b8576118b8611887565b604051601f8501601f19908116603f011681019082821181831017156118e0576118e0611887565b816040528093508581528686860111156118f957600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261192457600080fd5b6105df8383356020850161189d565b80356004811061185857600080fd5b60008060006060848603121561195757600080fd5b61196084611841565b9250602084013567ffffffffffffffff81111561197c57600080fd5b61198886828701611913565b92505061199760408501611933565b90509250925092565b6000806000606084860312156119b557600080fd5b6119be84611841565b92506119cc60208501611841565b9150604084013590509250925092565b634e487b7160e01b600052602160045260246000fd5b60048110611a1057634e487b7160e01b600052602160045260246000fd5b9052565b6000604082019050611a278284516119f2565b6020928301511515919092015290565b60008060408385031215611a4a57600080fd5b82359150611a5a60208401611933565b90509250929050565b80151581146117a557600080fd5b60008060408385031215611a8457600080fd5b823591506020830135611a9681611a63565b809150509250929050565b600060208284031215611ab357600080fd5b6105df82611841565b60008060408385031215611acf57600080fd5b82359150611a5a60208401611841565b60008060408385031215611af257600080fd5b611afb83611841565b91506020830135611a9681611a63565b60008060008060808587031215611b2157600080fd5b611b2a85611841565b9350611b3860208601611841565b925060408501359150606085013567ffffffffffffffff811115611b5b57600080fd5b8501601f81018713611b6c57600080fd5b611b7b8782356020840161189d565b91505092959194509250565b60008060408385031215611b9a57600080fd5b611ba383611841565b9150611a5a60208401611841565b60008060408385031215611bc457600080fd5b82359150602083013567ffffffffffffffff811115611be257600080fd5b611bee85828601611913565b9150509250929050565b600181811c90821680611c0c57607f821691505b60208210810361080157634e487b7160e01b600052602260045260246000fd5b600060208284031215611c3e57600080fd5b5051919050565b600060208284031215611c5757600080fd5b81516105df81611a63565b60208082526032908201527f5b4163636573734d616e6167656d656e745d204f6e6c79207468652076616c6960408201527119185d1bdc8818d85b881a5b9d195c9858dd60721b606082015260800190565b83815282546080820190611cce6020840160ff83166119f2565b60081c60ff16151560408301526001600160a01b039290921660609091015292915050565b8082018082111561035157634e487b7160e01b600052601160045260246000fd5b7f5b446565644e46545d204d757374206265206f776e6572206f6620746865204481526b032b2b2103bb4ba341034b2160a51b602082015260008251611d6181602c8501602087016117c5565b91909101602c0192915050565b7f5b446565644e46545d204465656420646f6573206e6f7420657869737420776981526503a341034b2160d51b602082015260008251611db58160268501602087016117c5565b9190910160260192915050565b828152604081016105df60208301846119f2565b82815260406020820152600061141e60408301846117e9565b601f82111561068c57600081815260208120601f850160051c81016020861015611e165750805b601f850160051c820191505b81811015611e3557828155600101611e22565b505050505050565b815167ffffffffffffffff811115611e5757611e57611887565b611e6b81611e658454611bf8565b84611def565b602080601f831160018114611ea05760008415611e885750858301515b600019600386901b1c1916600185901b178555611e35565b600085815260208120601f198616915b82811015611ecf57888601518255948401946001909101908401611eb0565b5085821015611eed5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611f30908301846117e9565b9695505050505050565b600060208284031215611f4c57600080fd5b81516105df8161178f565b60008351611f698184602088016117c5565b835190830190611f7d8183602088016117c5565b0194935050505056fea2646970667358221220e6261d5139476063e0e3fc719046a8ff418fc755b194d537578148ddd643a1c364736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101585760003560e01c806370a08231116100c3578063b82c35691161007c578063b82c3569146102df578063b88d4fde146102f2578063b99c23e314610305578063c87b56dd1461030d578063e985e9c514610320578063f1bc66731461033357600080fd5b806370a082311461028d57806389b9e75f146102a057806391d14854146102a857806395d89b41146102bb578063985e3a64146102c3578063a22cb465146102cc57600080fd5b806342842e0e1161011557806342842e0e1461020e57806342966c681461022157806362d402bc146102345780636352211e14610254578063682ece02146102675780636f6c15dd1461027a57600080fd5b806301ffc9a71461015d57806306fdde0314610185578063081812fc1461019a578063095ea7b3146101c55780631a6c41e2146101da57806323b872dd146101fb575b600080fd5b61017061016b3660046117a8565b610346565b60405190151581526020015b60405180910390f35b61018d610357565b60405161017c9190611815565b6101ad6101a8366004611828565b6103e9565b6040516001600160a01b03909116815260200161017c565b6101d86101d336600461185d565b610412565b005b6101ed6101e8366004611942565b610421565b60405190815260200161017c565b6101d86102093660046119a0565b6105e6565b6101d861021c3660046119a0565b610671565b6101d861022f366004611828565b610691565b610247610242366004611828565b610737565b60405161017c9190611a14565b6101ad610262366004611828565b610807565b6101d8610275366004611a37565b610812565b6101d8610288366004611a71565b610951565b6101ed61029b366004611aa1565b610ad4565b610170610b1c565b6101706102b6366004611abc565b610b9f565b61018d610c15565b6101ed60085481565b6101d86102da366004611adf565b610c24565b6101706102ed366004611828565b610c2f565b6101d8610300366004611b0b565b610c75565b610170610c8c565b61018d61031b366004611828565b610ca6565b61017061032e366004611b87565b610cb1565b6101d8610341366004611bb1565b610cdf565b600061035182610df6565b92915050565b60606000805461036690611bf8565b80601f016020809104026020016040519081016040528092919081815260200182805461039290611bf8565b80156103df5780601f106103b4576101008083540402835291602001916103df565b820191906000526020600020905b8154815290600101906020018083116103c257829003601f168201915b5050505050905090565b60006103f482610e1b565b506000828152600460205260409020546001600160a01b0316610351565b61041d828233610e53565b5050565b6007546040805163624dd75f60e11b815290516000926001600160a01b0316916391d1485491839163c49baebe9160048083019260209291908290030181865afa158015610473573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104979190611c2c565b336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa1580156104e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105069190611c45565b61052b5760405162461bcd60e51b815260040161052290611c62565b60405180910390fd5b61053784600854610e60565b600854600090815260096020526040902080548390829060ff19166001836003811115610566576105666119dc565b021790555061057760085485610ec5565b805461ff0019166101001781556008547f7a6cbbca54e6b169e8cd2ccacd8dccc9872cfeb370d865d3be365243d1005f5590826105b13390565b6040516105c093929190611cb4565b60405180910390a16008546105d6906001611cf3565b60088190559150505b9392505050565b6001600160a01b03821661061057604051633250574960e11b815260006004820152602401610522565b600061061d838333610f0e565b9050836001600160a01b0316816001600160a01b03161461066b576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610522565b50505050565b61068c83838360405180602001604052806000815250610c75565b505050565b8061069b81611002565b6001600160a01b0316336001600160a01b0316146106b88261101d565b6040516020016106c89190611d14565b604051602081830303815290604052906106f55760405162461bcd60e51b81526004016105229190611815565b506106ff826110b0565b6040518281527f61c6643f6e835939ae6da3352c52e1b29a86e4ee6599ab73c5d9a416f75d6ed0906020015b60405180910390a15050565b604080518082019091526000808252602082015281600061075782611002565b6001600160a01b0316141561076b8261101d565b60405160200161077b9190611d6e565b604051602081830303815290604052906107a85760405162461bcd60e51b81526004016105229190611815565b506000838152600960205260409081902081518083019092528054829060ff1660038111156107d9576107d96119dc565b60038111156107ea576107ea6119dc565b81529054610100900460ff16151560209091015291505b50919050565b600061035182610e1b565b81600061081e82611002565b6001600160a01b031614156108328261101d565b6040516020016108429190611d6e565b6040516020818303038152906040529061086f5760405162461bcd60e51b81526004016105229190611815565b508261087a81611002565b6001600160a01b0316336001600160a01b0316146108978261101d565b6040516020016108a79190611d14565b604051602081830303815290604052906108d45760405162461bcd60e51b81526004016105229190611815565b50600084815260096020526040902080548490829060ff19166001836003811115610901576109016119dc565b02179055506109118560006110eb565b7f41779e8814a589644c78c07c027c39f8ba699dc2f20bf422c3065cdaa4b8a1b08585604051610942929190611dc2565b60405180910390a15050505050565b6007546040805163624dd75f60e11b815290516001600160a01b03909216916391d1485491839163c49baebe916004808201926020929091908290030181865afa1580156109a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c79190611c2c565b336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015610a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a369190611c45565b610a525760405162461bcd60e51b815260040161052290611c62565b33610a5c83611002565b6001600160a01b031603610aca5760405162461bcd60e51b815260206004820152602f60248201527f5b446565644e46545d204f776e65722063616e6e6f742076616c69646174652060448201526e1d1a195a5c881bdddb88185cdcd95d608a1b6064820152608401610522565b61041d82826110eb565b60006001600160a01b038216610b00576040516322718ad960e21b815260006004820152602401610522565b506001600160a01b031660009081526003602052604090205490565b6007546000906001600160a01b031663940e1570335b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610b76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9a9190611c45565b905090565b600754604051632474521560e21b8152600481018490526001600160a01b03838116602483015260009216906391d1485490604401602060405180830381865afa158015610bf1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105df9190611c45565b60606001805461036690611bf8565b61041d33838361114d565b600080610c3b83610737565b5190506000816003811115610c5257610c526119dc565b14806105df57506002816003811115610c6d57610c6d6119dc565b149392505050565b610c808484846105e6565b61066b848484846111ec565b6007546000906001600160a01b031663c395fcb333610b32565b606061035182611315565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b816000610ceb82611002565b6001600160a01b03161415610cff8261101d565b604051602001610d0f9190611d6e565b60405160208183030381529060405290610d3c5760405162461bcd60e51b81526004016105229190611815565b5082610d4781611002565b6001600160a01b0316336001600160a01b031614610d648261101d565b604051602001610d749190611d14565b60405160208183030381529060405290610da15760405162461bcd60e51b81526004016105229190611815565b50610dac8484610ec5565b610db78460006110eb565b7f3d50eea1c859d5d9795c74b4caf49f4cb0c69ec6b47702a84fab87f23fdc15388484604051610de8929190611dd6565b60405180910390a150505050565b60006001600160e01b03198216632483248360e11b1480610351575061035182611426565b600080610e2783611002565b90506001600160a01b03811661035157604051637e27328960e01b815260048101849052602401610522565b61068c8383836001611476565b6001600160a01b038216610e8a57604051633250574960e11b815260006004820152602401610522565b6000610e9883836000610f0e565b90506001600160a01b0381161561068c576040516339e3563760e11b815260006004820152602401610522565b6000828152600660205260409020610edd8282611e3d565b506040518281527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200161072b565b600080610f1a84611002565b90506001600160a01b03831615610f3657610f3681848661157c565b6001600160a01b03811615610f7457610f53600085600080611476565b6001600160a01b038116600090815260036020526040902080546000190190555b6001600160a01b03851615610fa3576001600160a01b0385166000908152600360205260409020805460010190555b60008481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6000908152600260205260409020546001600160a01b031690565b6060600061102a836115e0565b600101905060008167ffffffffffffffff81111561104a5761104a611887565b6040519080825280601f01601f191660200182016040528015611074576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461107e57509392505050565b60006110bf6000836000610f0e565b90506001600160a01b03811661041d57604051637e27328960e01b815260048101839052602401610522565b600082815260096020908152604091829020805461ff001916610100851515908102919091178255835186815292830152917f906235be09503d8fda345aadd07a77160f47ec7155cea0fb9d683684271c4f09910160405180910390a1505050565b6001600160a01b03821661117f57604051630b61174360e31b81526001600160a01b0383166004820152602401610522565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561066b57604051630a85bd0160e11b81526001600160a01b0384169063150b7a029061122e903390889087908790600401611efd565b6020604051808303816000875af1925050508015611269575060408051601f3d908101601f1916820190925261126691810190611f3a565b60015b6112d2573d808015611297576040519150601f19603f3d011682016040523d82523d6000602084013e61129c565b606091505b5080516000036112ca57604051633250574960e11b81526001600160a01b0385166004820152602401610522565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b1461130e57604051633250574960e11b81526001600160a01b0385166004820152602401610522565b5050505050565b606061132082610e1b565b506000828152600660205260408120805461133a90611bf8565b80601f016020809104026020016040519081016040528092919081815260200182805461136690611bf8565b80156113b35780601f10611388576101008083540402835291602001916113b3565b820191906000526020600020905b81548152906001019060200180831161139657829003601f168201915b5050505050905060006113d160408051602081019091526000815290565b905080516000036113e3575092915050565b8151156114155780826040516020016113fd929190611f57565b60405160208183030381529060405292505050919050565b61141e846116b8565b949350505050565b60006001600160e01b031982166380ac58cd60e01b148061145757506001600160e01b03198216635b5e139f60e01b145b8061035157506301ffc9a760e01b6001600160e01b0319831614610351565b808061148a57506001600160a01b03821615155b1561154c57600061149a84610e1b565b90506001600160a01b038316158015906114c65750826001600160a01b0316816001600160a01b031614155b80156114d957506114d78184610cb1565b155b156115025760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610522565b811561154a5783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b61158783838361172c565b61068c576001600160a01b0383166115b557604051637e27328960e01b815260048101829052602401610522565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610522565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061161f5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061164b576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061166957662386f26fc10000830492506010015b6305f5e1008310611681576305f5e100830492506008015b612710831061169557612710830492506004015b606483106116a7576064830492506002015b600a83106103515760010192915050565b60606116c382610e1b565b5060006116db60408051602081019091526000815290565b905060008151116116fb57604051806020016040528060008152506105df565b806117058461101d565b604051602001611716929190611f57565b6040516020818303038152906040529392505050565b60006001600160a01b0383161580159061141e5750826001600160a01b0316846001600160a01b0316148061176657506117668484610cb1565b8061141e5750506000908152600460205260409020546001600160a01b03908116911614919050565b6001600160e01b0319811681146117a557600080fd5b50565b6000602082840312156117ba57600080fd5b81356105df8161178f565b60005b838110156117e05781810151838201526020016117c8565b50506000910152565b600081518084526118018160208601602086016117c5565b601f01601f19169290920160200192915050565b6020815260006105df60208301846117e9565b60006020828403121561183a57600080fd5b5035919050565b80356001600160a01b038116811461185857600080fd5b919050565b6000806040838503121561187057600080fd5b61187983611841565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156118b8576118b8611887565b604051601f8501601f19908116603f011681019082821181831017156118e0576118e0611887565b816040528093508581528686860111156118f957600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261192457600080fd5b6105df8383356020850161189d565b80356004811061185857600080fd5b60008060006060848603121561195757600080fd5b61196084611841565b9250602084013567ffffffffffffffff81111561197c57600080fd5b61198886828701611913565b92505061199760408501611933565b90509250925092565b6000806000606084860312156119b557600080fd5b6119be84611841565b92506119cc60208501611841565b9150604084013590509250925092565b634e487b7160e01b600052602160045260246000fd5b60048110611a1057634e487b7160e01b600052602160045260246000fd5b9052565b6000604082019050611a278284516119f2565b6020928301511515919092015290565b60008060408385031215611a4a57600080fd5b82359150611a5a60208401611933565b90509250929050565b80151581146117a557600080fd5b60008060408385031215611a8457600080fd5b823591506020830135611a9681611a63565b809150509250929050565b600060208284031215611ab357600080fd5b6105df82611841565b60008060408385031215611acf57600080fd5b82359150611a5a60208401611841565b60008060408385031215611af257600080fd5b611afb83611841565b91506020830135611a9681611a63565b60008060008060808587031215611b2157600080fd5b611b2a85611841565b9350611b3860208601611841565b925060408501359150606085013567ffffffffffffffff811115611b5b57600080fd5b8501601f81018713611b6c57600080fd5b611b7b8782356020840161189d565b91505092959194509250565b60008060408385031215611b9a57600080fd5b611ba383611841565b9150611a5a60208401611841565b60008060408385031215611bc457600080fd5b82359150602083013567ffffffffffffffff811115611be257600080fd5b611bee85828601611913565b9150509250929050565b600181811c90821680611c0c57607f821691505b60208210810361080157634e487b7160e01b600052602260045260246000fd5b600060208284031215611c3e57600080fd5b5051919050565b600060208284031215611c5757600080fd5b81516105df81611a63565b60208082526032908201527f5b4163636573734d616e6167656d656e745d204f6e6c79207468652076616c6960408201527119185d1bdc8818d85b881a5b9d195c9858dd60721b606082015260800190565b83815282546080820190611cce6020840160ff83166119f2565b60081c60ff16151560408301526001600160a01b039290921660609091015292915050565b8082018082111561035157634e487b7160e01b600052601160045260246000fd5b7f5b446565644e46545d204d757374206265206f776e6572206f6620746865204481526b032b2b2103bb4ba341034b2160a51b602082015260008251611d6181602c8501602087016117c5565b91909101602c0192915050565b7f5b446565644e46545d204465656420646f6573206e6f7420657869737420776981526503a341034b2160d51b602082015260008251611db58160268501602087016117c5565b9190910160260192915050565b828152604081016105df60208301846119f2565b82815260406020820152600061141e60408301846117e9565b601f82111561068c57600081815260208120601f850160051c81016020861015611e165750805b601f850160051c820191505b81811015611e3557828155600101611e22565b505050505050565b815167ffffffffffffffff811115611e5757611e57611887565b611e6b81611e658454611bf8565b84611def565b602080601f831160018114611ea05760008415611e885750858301515b600019600386901b1c1916600185901b178555611e35565b600085815260208120601f198616915b82811015611ecf57888601518255948401946001909101908401611eb0565b5085821015611eed5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611f30908301846117e9565b9695505050505050565b600060208284031215611f4c57600080fd5b81516105df8161178f565b60008351611f698184602088016117c5565b835190830190611f7d8183602088016117c5565b0194935050505056fea2646970667358221220e6261d5139476063e0e3fc719046a8ff418fc755b194d537578148ddd643a1c364736f6c63430008140033", - "devdoc": { - "errors": { - "ERC721IncorrectOwner(address,uint256,address)": [ - { - "details": "Indicates an error related to the ownership over a particular token. Used in transfers.", - "params": { - "owner": "Address of the current owner of a token.", - "sender": "Address whose tokens are being transferred.", - "tokenId": "Identifier number of a token." - } - } - ], - "ERC721InsufficientApproval(address,uint256)": [ - { - "details": "Indicates a failure with the `operator`’s approval. Used in transfers.", - "params": { - "operator": "Address that may be allowed to operate on tokens without being their owner.", - "tokenId": "Identifier number of a token." - } - } - ], - "ERC721InvalidApprover(address)": [ - { - "details": "Indicates a failure with the `approver` of a token to be approved. Used in approvals.", - "params": { - "approver": "Address initiating an approval operation." - } - } - ], - "ERC721InvalidOperator(address)": [ - { - "details": "Indicates a failure with the `operator` to be approved. Used in approvals.", - "params": { - "operator": "Address that may be allowed to operate on tokens without being their owner." - } - } - ], - "ERC721InvalidOwner(address)": [ - { - "details": "Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. Used in balance queries.", - "params": { - "owner": "Address of the current owner of a token." - } - } - ], - "ERC721InvalidReceiver(address)": [ - { - "details": "Indicates a failure with the token `receiver`. Used in transfers.", - "params": { - "receiver": "Address to which tokens are being transferred." - } - } - ], - "ERC721InvalidSender(address)": [ - { - "details": "Indicates a failure with the token `sender`. Used in transfers.", - "params": { - "sender": "Address whose tokens are being transferred." - } - } - ], - "ERC721NonexistentToken(uint256)": [ - { - "details": "Indicates a `tokenId` whose `owner` is the zero address.", - "params": { - "tokenId": "Identifier number of a token." - } - } - ] - }, - "events": { - "Approval(address,address,uint256)": { - "details": "Emitted when `owner` enables `approved` to manage the `tokenId` token." - }, - "ApprovalForAll(address,address,bool)": { - "details": "Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets." - }, - "BatchMetadataUpdate(uint256,uint256)": { - "details": "This event emits when the metadata of a range of tokens is changed. So that the third-party platforms such as NFT market could timely update the images and related attributes of the NFTs." - }, - "MetadataUpdate(uint256)": { - "details": "This event emits when the metadata of a token is changed. So that the third-party platforms such as NFT market could timely update the images and related attributes of the NFT." - }, - "Transfer(address,address,uint256)": { - "details": "Emitted when `tokenId` token is transferred from `from` to `to`." - } - }, - "kind": "dev", - "methods": { - "approve(address,uint256)": { - "details": "See {IERC721-approve}." - }, - "balanceOf(address)": { - "details": "See {IERC721-balanceOf}." - }, - "getApproved(uint256)": { - "details": "See {IERC721-getApproved}." - }, - "isApprovedForAll(address,address)": { - "details": "See {IERC721-isApprovedForAll}." - }, - "name()": { - "details": "See {IERC721Metadata-name}." - }, - "ownerOf(uint256)": { - "details": "See {IERC721-ownerOf}." - }, - "safeTransferFrom(address,address,uint256)": { - "details": "See {IERC721-safeTransferFrom}." - }, - "safeTransferFrom(address,address,uint256,bytes)": { - "details": "See {IERC721-safeTransferFrom}." - }, - "setApprovalForAll(address,bool)": { - "details": "See {IERC721-setApprovalForAll}." - }, - "symbol()": { - "details": "See {IERC721Metadata-symbol}." - }, - "transferFrom(address,address,uint256)": { - "details": "See {IERC721-transferFrom}." - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 2216, - "contract": "contracts/DeedNFT.sol:DeedNFT", - "label": "_name", - "offset": 0, - "slot": "0", - "type": "t_string_storage" - }, - { - "astId": 2218, - "contract": "contracts/DeedNFT.sol:DeedNFT", - "label": "_symbol", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 2222, - "contract": "contracts/DeedNFT.sol:DeedNFT", - "label": "_owners", - "offset": 0, - "slot": "2", - "type": "t_mapping(t_uint256,t_address)" - }, - { - "astId": 2226, - "contract": "contracts/DeedNFT.sol:DeedNFT", - "label": "_balances", - "offset": 0, - "slot": "3", - "type": "t_mapping(t_address,t_uint256)" - }, - { - "astId": 2230, - "contract": "contracts/DeedNFT.sol:DeedNFT", - "label": "_tokenApprovals", - "offset": 0, - "slot": "4", - "type": "t_mapping(t_uint256,t_address)" - }, - { - "astId": 2236, - "contract": "contracts/DeedNFT.sol:DeedNFT", - "label": "_operatorApprovals", - "offset": 0, - "slot": "5", - "type": "t_mapping(t_address,t_mapping(t_address,t_bool))" - }, - { - "astId": 3355, - "contract": "contracts/DeedNFT.sol:DeedNFT", - "label": "_tokenURIs", - "offset": 0, - "slot": "6", - "type": "t_mapping(t_uint256,t_string_storage)" - }, - { - "astId": 5700, - "contract": "contracts/DeedNFT.sol:DeedNFT", - "label": "accessManager", - "offset": 0, - "slot": "7", - "type": "t_contract(AccessManager)5695" - }, - { - "astId": 5864, - "contract": "contracts/DeedNFT.sol:DeedNFT", - "label": "nextDeedId", - "offset": 0, - "slot": "8", - "type": "t_uint256" - }, - { - "astId": 5869, - "contract": "contracts/DeedNFT.sol:DeedNFT", - "label": "deedInfoMap", - "offset": 0, - "slot": "9", - "type": "t_mapping(t_uint256,t_struct(DeedInfo)5862_storage)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_contract(AccessManager)5695": { - "encoding": "inplace", - "label": "contract AccessManager", - "numberOfBytes": "20" - }, - "t_enum(AssetType)5874": { - "encoding": "inplace", - "label": "enum DeedNFT.AssetType", - "numberOfBytes": "1" - }, - "t_mapping(t_address,t_bool)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_mapping(t_address,t_mapping(t_address,t_bool))": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => mapping(address => bool))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_bool)" - }, - "t_mapping(t_address,t_uint256)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => uint256)", - "numberOfBytes": "32", - "value": "t_uint256" - }, - "t_mapping(t_uint256,t_address)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => address)", - "numberOfBytes": "32", - "value": "t_address" - }, - "t_mapping(t_uint256,t_string_storage)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => string)", - "numberOfBytes": "32", - "value": "t_string_storage" - }, - "t_mapping(t_uint256,t_struct(DeedInfo)5862_storage)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => struct DeedNFT.DeedInfo)", - "numberOfBytes": "32", - "value": "t_struct(DeedInfo)5862_storage" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(DeedInfo)5862_storage": { - "encoding": "inplace", - "label": "struct DeedNFT.DeedInfo", - "members": [ - { - "astId": 5859, - "contract": "contracts/DeedNFT.sol:DeedNFT", - "label": "assetType", - "offset": 0, - "slot": "0", - "type": "t_enum(AssetType)5874" - }, - { - "astId": 5861, - "contract": "contracts/DeedNFT.sol:DeedNFT", - "label": "isValidated", - "offset": 1, - "slot": "0", - "type": "t_bool" - } - ], - "numberOfBytes": "32" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file +{"address":"0xEA6015008c7926E84C76b70344EbD31a48A6fd2c","abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"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":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deedId","type":"uint256"},{"indexed":false,"internalType":"enum DeedNFT.AssetType","name":"newAssetType","type":"uint8"}],"name":"DeedNFTAssetTypeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deedId","type":"uint256"}],"name":"DeedNFTBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deedId","type":"uint256"},{"components":[{"internalType":"enum DeedNFT.AssetType","name":"assetType","type":"uint8"},{"internalType":"bool","name":"isValidated","type":"bool"}],"indexed":false,"internalType":"struct DeedNFT.DeedInfo","name":"deedInfo","type":"tuple"},{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"DeedNFTMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deedId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newIpfsDetailsHash","type":"string"}],"name":"DeedNFTUriChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deedId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isValid","type":"bool"}],"name":"DeedNFTValidatedChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","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":"nonpayable","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":"_deedId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_deedId","type":"uint256"}],"name":"canSubdivide","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_deedId","type":"uint256"}],"name":"getDeedInfo","outputs":[{"components":[{"internalType":"enum DeedNFT.AssetType","name":"assetType","type":"uint8"},{"internalType":"bool","name":"isValidated","type":"bool"}],"internalType":"struct DeedNFT.DeedInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasAdminRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address","name":"_address","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasValidatorRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"string","name":"_ipfsDetailsHash","type":"string"},{"internalType":"enum DeedNFT.AssetType","name":"_assetType","type":"uint8"}],"name":"mintAsset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextDeedId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_deedId","type":"uint256"},{"internalType":"enum DeedNFT.AssetType","name":"_assetType","type":"uint8"}],"name":"setAssetType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_deedId","type":"uint256"},{"internalType":"bool","name":"_isValid","type":"bool"}],"name":"setAssetValidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_deedId","type":"uint256"},{"internalType":"string","name":"_ipfsDetailsHash","type":"string"}],"name":"setIpfsDetailsHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_deedId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"nonpayable","type":"function"}]} \ No newline at end of file diff --git a/packages/hardhat/deployments/sepolia/solcInputs/750f7c1382bfda4f69a410c16afffb7a.json b/packages/hardhat/deployments/sepolia/solcInputs/750f7c1382bfda4f69a410c16afffb7a.json deleted file mode 100644 index 88f5a501..00000000 --- a/packages/hardhat/deployments/sepolia/solcInputs/750f7c1382bfda4f69a410c16afffb7a.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "@openzeppelin/contracts/access/AccessControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAccessControl} from \"./IAccessControl.sol\";\nimport {Context} from \"../utils/Context.sol\";\nimport {ERC165} from \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address account => bool) hasRole;\n bytes32 adminRole;\n }\n\n mapping(bytes32 role => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with an {AccessControlUnauthorizedAccount} error including the required role.\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual returns (bool) {\n return _roles[role].hasRole[account];\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\n * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\n * is missing `role`.\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert AccessControlUnauthorizedAccount(account, role);\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address callerConfirmation) public virtual {\n if (callerConfirmation != _msgSender()) {\n revert AccessControlBadConfirmation();\n }\n\n _revokeRole(role, callerConfirmation);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\n if (!hasRole(role, account)) {\n _roles[role].hasRole[account] = true;\n emit RoleGranted(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\n if (hasRole(role, account)) {\n _roles[role].hasRole[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n}\n" - }, - "@openzeppelin/contracts/access/IAccessControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev The `account` is missing a role.\n */\n error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\n\n /**\n * @dev The caller of a function is not the expected one.\n *\n * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\n */\n error AccessControlBadConfirmation();\n\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n */\n function renounceRole(bytes32 role, address callerConfirmation) external;\n}\n" - }, - "@openzeppelin/contracts/interfaces/draft-IERC6093.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.\n */\ninterface IERC20Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC20InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC20InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC20InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.\n */\ninterface IERC721Errors {\n /**\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.\n * Used in balance queries.\n * @param owner Address of the current owner of a token.\n */\n error ERC721InvalidOwner(address owner);\n\n /**\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\n * @param tokenId Identifier number of a token.\n */\n error ERC721NonexistentToken(uint256 tokenId);\n\n /**\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param tokenId Identifier number of a token.\n * @param owner Address of the current owner of a token.\n */\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC721InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC721InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param tokenId Identifier number of a token.\n */\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC721InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.\n */\ninterface IERC1155Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n * @param tokenId Identifier number of a token.\n */\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC1155InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC1155InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param owner Address of the current owner of a token.\n */\n error ERC1155MissingApprovalForAll(address operator, address owner);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC1155InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC1155InvalidOperator(address operator);\n\n /**\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n * Used in batch transfers.\n * @param idsLength Length of the array of token identifiers\n * @param valuesLength Length of the array of token amounts\n */\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n" - }, - "@openzeppelin/contracts/interfaces/IERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n" - }, - "@openzeppelin/contracts/interfaces/IERC4906.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4906.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\nimport {IERC721} from \"./IERC721.sol\";\n\n/// @title EIP-721 Metadata Update Extension\ninterface IERC4906 is IERC165, IERC721 {\n /// @dev This event emits when the metadata of a token is changed.\n /// So that the third-party platforms such as NFT market could\n /// timely update the images and related attributes of the NFT.\n event MetadataUpdate(uint256 _tokenId);\n\n /// @dev This event emits when the metadata of a range of tokens is changed.\n /// So that the third-party platforms such as NFT market could\n /// timely update the images and related attributes of the NFTs.\n event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);\n}\n" - }, - "@openzeppelin/contracts/interfaces/IERC721.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC721} from \"../token/ERC721/IERC721.sol\";\n" - }, - "@openzeppelin/contracts/token/ERC1155/ERC1155.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/ERC1155.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC1155} from \"./IERC1155.sol\";\nimport {IERC1155Receiver} from \"./IERC1155Receiver.sol\";\nimport {IERC1155MetadataURI} from \"./extensions/IERC1155MetadataURI.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC165, ERC165} from \"../../utils/introspection/ERC165.sol\";\nimport {Arrays} from \"../../utils/Arrays.sol\";\nimport {IERC1155Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the basic standard multi-token.\n * See https://eips.ethereum.org/EIPS/eip-1155\n * Originally based on code by Enjin: https://github.com/enjin/erc-1155\n */\nabstract contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI, IERC1155Errors {\n using Arrays for uint256[];\n using Arrays for address[];\n\n mapping(uint256 id => mapping(address account => uint256)) private _balances;\n\n mapping(address account => mapping(address operator => bool)) private _operatorApprovals;\n\n // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json\n string private _uri;\n\n /**\n * @dev See {_setURI}.\n */\n constructor(string memory uri_) {\n _setURI(uri_);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC1155).interfaceId ||\n interfaceId == type(IERC1155MetadataURI).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC1155MetadataURI-uri}.\n *\n * This implementation returns the same URI for *all* token types. It relies\n * on the token type ID substitution mechanism\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\n *\n * Clients calling this function must replace the `\\{id\\}` substring with the\n * actual token type ID.\n */\n function uri(uint256 /* id */) public view virtual returns (string memory) {\n return _uri;\n }\n\n /**\n * @dev See {IERC1155-balanceOf}.\n */\n function balanceOf(address account, uint256 id) public view virtual returns (uint256) {\n return _balances[id][account];\n }\n\n /**\n * @dev See {IERC1155-balanceOfBatch}.\n *\n * Requirements:\n *\n * - `accounts` and `ids` must have the same length.\n */\n function balanceOfBatch(\n address[] memory accounts,\n uint256[] memory ids\n ) public view virtual returns (uint256[] memory) {\n if (accounts.length != ids.length) {\n revert ERC1155InvalidArrayLength(ids.length, accounts.length);\n }\n\n uint256[] memory batchBalances = new uint256[](accounts.length);\n\n for (uint256 i = 0; i < accounts.length; ++i) {\n batchBalances[i] = balanceOf(accounts.unsafeMemoryAccess(i), ids.unsafeMemoryAccess(i));\n }\n\n return batchBalances;\n }\n\n /**\n * @dev See {IERC1155-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC1155-isApprovedForAll}.\n */\n function isApprovedForAll(address account, address operator) public view virtual returns (bool) {\n return _operatorApprovals[account][operator];\n }\n\n /**\n * @dev See {IERC1155-safeTransferFrom}.\n */\n function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes memory data) public virtual {\n address sender = _msgSender();\n if (from != sender && !isApprovedForAll(from, sender)) {\n revert ERC1155MissingApprovalForAll(sender, from);\n }\n _safeTransferFrom(from, to, id, value, data);\n }\n\n /**\n * @dev See {IERC1155-safeBatchTransferFrom}.\n */\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory values,\n bytes memory data\n ) public virtual {\n address sender = _msgSender();\n if (from != sender && !isApprovedForAll(from, sender)) {\n revert ERC1155MissingApprovalForAll(sender, from);\n }\n _safeBatchTransferFrom(from, to, ids, values, data);\n }\n\n /**\n * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`. Will mint (or burn) if `from`\n * (or `to`) is the zero address.\n *\n * Emits a {TransferSingle} event if the arrays contain one element, and {TransferBatch} otherwise.\n *\n * Requirements:\n *\n * - If `to` refers to a smart contract, it must implement either {IERC1155Receiver-onERC1155Received}\n * or {IERC1155Receiver-onERC1155BatchReceived} and return the acceptance magic value.\n * - `ids` and `values` must have the same length.\n *\n * NOTE: The ERC-1155 acceptance check is not performed in this function. See {_updateWithAcceptanceCheck} instead.\n */\n function _update(address from, address to, uint256[] memory ids, uint256[] memory values) internal virtual {\n if (ids.length != values.length) {\n revert ERC1155InvalidArrayLength(ids.length, values.length);\n }\n\n address operator = _msgSender();\n\n for (uint256 i = 0; i < ids.length; ++i) {\n uint256 id = ids.unsafeMemoryAccess(i);\n uint256 value = values.unsafeMemoryAccess(i);\n\n if (from != address(0)) {\n uint256 fromBalance = _balances[id][from];\n if (fromBalance < value) {\n revert ERC1155InsufficientBalance(from, fromBalance, value, id);\n }\n unchecked {\n // Overflow not possible: value <= fromBalance\n _balances[id][from] = fromBalance - value;\n }\n }\n\n if (to != address(0)) {\n _balances[id][to] += value;\n }\n }\n\n if (ids.length == 1) {\n uint256 id = ids.unsafeMemoryAccess(0);\n uint256 value = values.unsafeMemoryAccess(0);\n emit TransferSingle(operator, from, to, id, value);\n } else {\n emit TransferBatch(operator, from, to, ids, values);\n }\n }\n\n /**\n * @dev Version of {_update} that performs the token acceptance check by calling\n * {IERC1155Receiver-onERC1155Received} or {IERC1155Receiver-onERC1155BatchReceived} on the receiver address if it\n * contains code (eg. is a smart contract at the moment of execution).\n *\n * IMPORTANT: Overriding this function is discouraged because it poses a reentrancy risk from the receiver. So any\n * update to the contract state after this function would break the check-effect-interaction pattern. Consider\n * overriding {_update} instead.\n */\n function _updateWithAcceptanceCheck(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory values,\n bytes memory data\n ) internal virtual {\n _update(from, to, ids, values);\n if (to != address(0)) {\n address operator = _msgSender();\n if (ids.length == 1) {\n uint256 id = ids.unsafeMemoryAccess(0);\n uint256 value = values.unsafeMemoryAccess(0);\n _doSafeTransferAcceptanceCheck(operator, from, to, id, value, data);\n } else {\n _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, values, data);\n }\n }\n }\n\n /**\n * @dev Transfers a `value` tokens of token type `id` from `from` to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `from` must have a balance of tokens of type `id` of at least `value` amount.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function _safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes memory data) internal {\n if (to == address(0)) {\n revert ERC1155InvalidReceiver(address(0));\n }\n if (from == address(0)) {\n revert ERC1155InvalidSender(address(0));\n }\n (uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);\n _updateWithAcceptanceCheck(from, to, ids, values, data);\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n * - `ids` and `values` must have the same length.\n */\n function _safeBatchTransferFrom(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory values,\n bytes memory data\n ) internal {\n if (to == address(0)) {\n revert ERC1155InvalidReceiver(address(0));\n }\n if (from == address(0)) {\n revert ERC1155InvalidSender(address(0));\n }\n _updateWithAcceptanceCheck(from, to, ids, values, data);\n }\n\n /**\n * @dev Sets a new URI for all token types, by relying on the token type ID\n * substitution mechanism\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\n *\n * By this mechanism, any occurrence of the `\\{id\\}` substring in either the\n * URI or any of the values in the JSON file at said URI will be replaced by\n * clients with the token type ID.\n *\n * For example, the `https://token-cdn-domain/\\{id\\}.json` URI would be\n * interpreted by clients as\n * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`\n * for token type ID 0x4cce0.\n *\n * See {uri}.\n *\n * Because these URIs cannot be meaningfully represented by the {URI} event,\n * this function emits no events.\n */\n function _setURI(string memory newuri) internal virtual {\n _uri = newuri;\n }\n\n /**\n * @dev Creates a `value` amount of tokens of type `id`, and assigns them to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function _mint(address to, uint256 id, uint256 value, bytes memory data) internal {\n if (to == address(0)) {\n revert ERC1155InvalidReceiver(address(0));\n }\n (uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);\n _updateWithAcceptanceCheck(address(0), to, ids, values, data);\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `values` must have the same length.\n * - `to` cannot be the zero address.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function _mintBatch(address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\n if (to == address(0)) {\n revert ERC1155InvalidReceiver(address(0));\n }\n _updateWithAcceptanceCheck(address(0), to, ids, values, data);\n }\n\n /**\n * @dev Destroys a `value` amount of tokens of type `id` from `from`\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `from` must have at least `value` amount of tokens of type `id`.\n */\n function _burn(address from, uint256 id, uint256 value) internal {\n if (from == address(0)) {\n revert ERC1155InvalidSender(address(0));\n }\n (uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);\n _updateWithAcceptanceCheck(from, address(0), ids, values, \"\");\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `from` must have at least `value` amount of tokens of type `id`.\n * - `ids` and `values` must have the same length.\n */\n function _burnBatch(address from, uint256[] memory ids, uint256[] memory values) internal {\n if (from == address(0)) {\n revert ERC1155InvalidSender(address(0));\n }\n _updateWithAcceptanceCheck(from, address(0), ids, values, \"\");\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n *\n * Requirements:\n *\n * - `operator` cannot be the zero address.\n */\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\n if (operator == address(0)) {\n revert ERC1155InvalidOperator(address(0));\n }\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Performs an acceptance check by calling {IERC1155-onERC1155Received} on the `to` address\n * if it contains code at the moment of execution.\n */\n function _doSafeTransferAcceptanceCheck(\n address operator,\n address from,\n address to,\n uint256 id,\n uint256 value,\n bytes memory data\n ) private {\n if (to.code.length > 0) {\n try IERC1155Receiver(to).onERC1155Received(operator, from, id, value, data) returns (bytes4 response) {\n if (response != IERC1155Receiver.onERC1155Received.selector) {\n // Tokens rejected\n revert ERC1155InvalidReceiver(to);\n }\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n // non-ERC1155Receiver implementer\n revert ERC1155InvalidReceiver(to);\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n }\n }\n\n /**\n * @dev Performs a batch acceptance check by calling {IERC1155-onERC1155BatchReceived} on the `to` address\n * if it contains code at the moment of execution.\n */\n function _doSafeBatchTransferAcceptanceCheck(\n address operator,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory values,\n bytes memory data\n ) private {\n if (to.code.length > 0) {\n try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, values, data) returns (\n bytes4 response\n ) {\n if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {\n // Tokens rejected\n revert ERC1155InvalidReceiver(to);\n }\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n // non-ERC1155Receiver implementer\n revert ERC1155InvalidReceiver(to);\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n }\n }\n\n /**\n * @dev Creates an array in memory with only one value for each of the elements provided.\n */\n function _asSingletonArrays(\n uint256 element1,\n uint256 element2\n ) private pure returns (uint256[] memory array1, uint256[] memory array2) {\n /// @solidity memory-safe-assembly\n assembly {\n // Load the free memory pointer\n array1 := mload(0x40)\n // Set array length to 1\n mstore(array1, 1)\n // Store the single element at the next word after the length (where content starts)\n mstore(add(array1, 0x20), element1)\n\n // Repeat for next array locating it right after the first array\n array2 := add(array1, 0x40)\n mstore(array2, 1)\n mstore(add(array2, 0x20), element2)\n\n // Update the free memory pointer by pointing after the second array\n mstore(0x40, add(array2, 0x40))\n }\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/extensions/IERC1155MetadataURI.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC1155} from \"../IERC1155.sol\";\n\n/**\n * @dev Interface of the optional ERC1155MetadataExtension interface, as defined\n * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].\n */\ninterface IERC1155MetadataURI is IERC1155 {\n /**\n * @dev Returns the URI for token type `id`.\n *\n * If the `\\{id\\}` substring is present in the URI, it must be replaced by\n * clients with the actual token type ID.\n */\n function uri(uint256 id) external view returns (string memory);\n}\n" - }, - "@openzeppelin/contracts/token/ERC1155/IERC1155.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\n */\ninterface IERC1155 is IERC165 {\n /**\n * @dev Emitted when `value` amount of tokens of type `id` are transferred from `from` to `to` by `operator`.\n */\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\n\n /**\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\n * transfers.\n */\n event TransferBatch(\n address indexed operator,\n address indexed from,\n address indexed to,\n uint256[] ids,\n uint256[] values\n );\n\n /**\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\n * `approved`.\n */\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\n\n /**\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\n *\n * If an {URI} event was emitted for `id`, the standard\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\n * returned by {IERC1155MetadataURI-uri}.\n */\n event URI(string value, uint256 indexed id);\n\n /**\n * @dev Returns the value of tokens of token type `id` owned by `account`.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function balanceOf(address account, uint256 id) external view returns (uint256);\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\n *\n * Requirements:\n *\n * - `accounts` and `ids` must have the same length.\n */\n function balanceOfBatch(\n address[] calldata accounts,\n uint256[] calldata ids\n ) external view returns (uint256[] memory);\n\n /**\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\n *\n * Emits an {ApprovalForAll} event.\n *\n * Requirements:\n *\n * - `operator` cannot be the caller.\n */\n function setApprovalForAll(address operator, bool approved) external;\n\n /**\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\n *\n * See {setApprovalForAll}.\n */\n function isApprovedForAll(address account, address operator) external view returns (bool);\n\n /**\n * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`.\n *\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\n * to an untrusted contract, when invoking {onERC1155Received} on the receiver.\n * Ensure to follow the checks-effects-interactions pattern and consider employing\n * reentrancy guards when interacting with untrusted contracts.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\n * - `from` must have a balance of tokens of type `id` of at least `value` amount.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\n *\n *\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\n * to an untrusted contract, when invoking {onERC1155BatchReceived} on the receiver.\n * Ensure to follow the checks-effects-interactions pattern and consider employing\n * reentrancy guards when interacting with untrusted contracts.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `values` must have the same length.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external;\n}\n" - }, - "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Interface that must be implemented by smart contracts in order to receive\n * ERC-1155 token transfers.\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * ==== Security Considerations\n *\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\n * generally recommended is:\n *\n * ```solidity\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\n * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\n * doThing(..., value);\n * }\n *\n * function doThing(..., uint256 value) public {\n * token.safeTransferFrom(msg.sender, address(this), value);\n * ...\n * }\n * ```\n *\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\n * {SafeERC20-safeTransferFrom}).\n *\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\n * contracts should have entry points that don't rely on permit.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n *\n * CAUTION: See Security Considerations above.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/IERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC20Permit} from \"../extensions/IERC20Permit.sol\";\nimport {Address} from \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n /**\n * @dev An operation with an ERC20 token failed.\n */\n error SafeERC20FailedOperation(address token);\n\n /**\n * @dev Indicates a failed `decreaseAllowance` request.\n */\n error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n forceApprove(token, spender, oldAllowance + value);\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n * value, non-reverting calls are assumed to be successful.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n unchecked {\n uint256 currentAllowance = token.allowance(address(this), spender);\n if (currentAllowance < requestedDecrease) {\n revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n }\n forceApprove(token, spender, currentAllowance - requestedDecrease);\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n * to be set to zero before setting it to a non-zero value, such as USDT.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data);\n if (returndata.length != 0 && !abi.decode(returndata, (bool))) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n // and not revert is the subcall reverts.\n\n (bool success, bytes memory returndata) = address(token).call(data);\n return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/ERC721.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC721} from \"./IERC721.sol\";\nimport {IERC721Receiver} from \"./IERC721Receiver.sol\";\nimport {IERC721Metadata} from \"./extensions/IERC721Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {Strings} from \"../../utils/Strings.sol\";\nimport {IERC165, ERC165} from \"../../utils/introspection/ERC165.sol\";\nimport {IERC721Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\nabstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors {\n using Strings for uint256;\n\n // Token name\n string private _name;\n\n // Token symbol\n string private _symbol;\n\n mapping(uint256 tokenId => address) private _owners;\n\n mapping(address owner => uint256) private _balances;\n\n mapping(uint256 tokenId => address) private _tokenApprovals;\n\n mapping(address owner => mapping(address operator => bool)) private _operatorApprovals;\n\n /**\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC721).interfaceId ||\n interfaceId == type(IERC721Metadata).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721-balanceOf}.\n */\n function balanceOf(address owner) public view virtual returns (uint256) {\n if (owner == address(0)) {\n revert ERC721InvalidOwner(address(0));\n }\n return _balances[owner];\n }\n\n /**\n * @dev See {IERC721-ownerOf}.\n */\n function ownerOf(uint256 tokenId) public view virtual returns (address) {\n return _requireOwned(tokenId);\n }\n\n /**\n * @dev See {IERC721Metadata-name}.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IERC721Metadata-symbol}.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId) public view virtual returns (string memory) {\n _requireOwned(tokenId);\n\n string memory baseURI = _baseURI();\n return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : \"\";\n }\n\n /**\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n * by default, can be overridden in child contracts.\n */\n function _baseURI() internal view virtual returns (string memory) {\n return \"\";\n }\n\n /**\n * @dev See {IERC721-approve}.\n */\n function approve(address to, uint256 tokenId) public virtual {\n _approve(to, tokenId, _msgSender());\n }\n\n /**\n * @dev See {IERC721-getApproved}.\n */\n function getApproved(uint256 tokenId) public view virtual returns (address) {\n _requireOwned(tokenId);\n\n return _getApproved(tokenId);\n }\n\n /**\n * @dev See {IERC721-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC721-isApprovedForAll}.\n */\n function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {\n return _operatorApprovals[owner][operator];\n }\n\n /**\n * @dev See {IERC721-transferFrom}.\n */\n function transferFrom(address from, address to, uint256 tokenId) public virtual {\n if (to == address(0)) {\n revert ERC721InvalidReceiver(address(0));\n }\n // Setting an \"auth\" arguments enables the `_isAuthorized` check which verifies that the token exists\n // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.\n address previousOwner = _update(to, tokenId, _msgSender());\n if (previousOwner != from) {\n revert ERC721IncorrectOwner(from, tokenId, previousOwner);\n }\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId) public {\n safeTransferFrom(from, to, tokenId, \"\");\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {\n transferFrom(from, to, tokenId);\n _checkOnERC721Received(from, to, tokenId, data);\n }\n\n /**\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n *\n * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the\n * core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances\n * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by\n * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.\n */\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n return _owners[tokenId];\n }\n\n /**\n * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.\n */\n function _getApproved(uint256 tokenId) internal view virtual returns (address) {\n return _tokenApprovals[tokenId];\n }\n\n /**\n * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in\n * particular (ignoring whether it is owned by `owner`).\n *\n * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\n * assumption.\n */\n function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {\n return\n spender != address(0) &&\n (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);\n }\n\n /**\n * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.\n * Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets\n * the `spender` for the specific `tokenId`.\n *\n * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\n * assumption.\n */\n function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {\n if (!_isAuthorized(owner, spender, tokenId)) {\n if (owner == address(0)) {\n revert ERC721NonexistentToken(tokenId);\n } else {\n revert ERC721InsufficientApproval(spender, tokenId);\n }\n }\n }\n\n /**\n * @dev Unsafe write access to the balances, used by extensions that \"mint\" tokens using an {ownerOf} override.\n *\n * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that\n * a uint256 would ever overflow from increments when these increments are bounded to uint128 values.\n *\n * WARNING: Increasing an account's balance using this function tends to be paired with an override of the\n * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership\n * remain consistent with one another.\n */\n function _increaseBalance(address account, uint128 value) internal virtual {\n unchecked {\n _balances[account] += value;\n }\n }\n\n /**\n * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner\n * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.\n *\n * The `auth` argument is optional. If the value passed is non 0, then this function will check that\n * `auth` is either the owner of the token, or approved to operate on the token (by the owner).\n *\n * Emits a {Transfer} event.\n *\n * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.\n */\n function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {\n address from = _ownerOf(tokenId);\n\n // Perform (optional) operator check\n if (auth != address(0)) {\n _checkAuthorized(from, auth, tokenId);\n }\n\n // Execute the update\n if (from != address(0)) {\n // Clear approval. No need to re-authorize or emit the Approval event\n _approve(address(0), tokenId, address(0), false);\n\n unchecked {\n _balances[from] -= 1;\n }\n }\n\n if (to != address(0)) {\n unchecked {\n _balances[to] += 1;\n }\n }\n\n _owners[tokenId] = to;\n\n emit Transfer(from, to, tokenId);\n\n return from;\n }\n\n /**\n * @dev Mints `tokenId` and transfers it to `to`.\n *\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - `to` cannot be the zero address.\n *\n * Emits a {Transfer} event.\n */\n function _mint(address to, uint256 tokenId) internal {\n if (to == address(0)) {\n revert ERC721InvalidReceiver(address(0));\n }\n address previousOwner = _update(to, tokenId, address(0));\n if (previousOwner != address(0)) {\n revert ERC721InvalidSender(address(0));\n }\n }\n\n /**\n * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeMint(address to, uint256 tokenId) internal {\n _safeMint(to, tokenId, \"\");\n }\n\n /**\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n */\n function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\n _mint(to, tokenId);\n _checkOnERC721Received(address(0), to, tokenId, data);\n }\n\n /**\n * @dev Destroys `tokenId`.\n * The approval is cleared when the token is burned.\n * This is an internal function that does not check if the sender is authorized to operate on the token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n *\n * Emits a {Transfer} event.\n */\n function _burn(uint256 tokenId) internal {\n address previousOwner = _update(address(0), tokenId, address(0));\n if (previousOwner == address(0)) {\n revert ERC721NonexistentToken(tokenId);\n }\n }\n\n /**\n * @dev Transfers `tokenId` from `from` to `to`.\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n *\n * Emits a {Transfer} event.\n */\n function _transfer(address from, address to, uint256 tokenId) internal {\n if (to == address(0)) {\n revert ERC721InvalidReceiver(address(0));\n }\n address previousOwner = _update(to, tokenId, address(0));\n if (previousOwner == address(0)) {\n revert ERC721NonexistentToken(tokenId);\n } else if (previousOwner != from) {\n revert ERC721IncorrectOwner(from, tokenId, previousOwner);\n }\n }\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients\n * are aware of the ERC721 standard to prevent tokens from being forever locked.\n *\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\n *\n * This internal function is like {safeTransferFrom} in the sense that it invokes\n * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.\n * implement alternative mechanisms to perform token transfer, such as signature-based.\n *\n * Requirements:\n *\n * - `tokenId` token must exist and be owned by `from`.\n * - `to` cannot be the zero address.\n * - `from` cannot be the zero address.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeTransfer(address from, address to, uint256 tokenId) internal {\n _safeTransfer(from, to, tokenId, \"\");\n }\n\n /**\n * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n */\n function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\n _transfer(from, to, tokenId);\n _checkOnERC721Received(from, to, tokenId, data);\n }\n\n /**\n * @dev Approve `to` to operate on `tokenId`\n *\n * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is\n * either the owner of the token, or approved to operate on all tokens held by this owner.\n *\n * Emits an {Approval} event.\n *\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n */\n function _approve(address to, uint256 tokenId, address auth) internal {\n _approve(to, tokenId, auth, true);\n }\n\n /**\n * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not\n * emitted in the context of transfers.\n */\n function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {\n // Avoid reading the owner unless necessary\n if (emitEvent || auth != address(0)) {\n address owner = _requireOwned(tokenId);\n\n // We do not use _isAuthorized because single-token approvals should not be able to call approve\n if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {\n revert ERC721InvalidApprover(auth);\n }\n\n if (emitEvent) {\n emit Approval(owner, to, tokenId);\n }\n }\n\n _tokenApprovals[tokenId] = to;\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Requirements:\n * - operator can't be the address zero.\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\n if (operator == address(0)) {\n revert ERC721InvalidOperator(operator);\n }\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).\n * Returns the owner.\n *\n * Overrides to ownership logic should be done to {_ownerOf}.\n */\n function _requireOwned(uint256 tokenId) internal view returns (address) {\n address owner = _ownerOf(tokenId);\n if (owner == address(0)) {\n revert ERC721NonexistentToken(tokenId);\n }\n return owner;\n }\n\n /**\n * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the\n * recipient doesn't accept the token transfer. The call is not executed if the target address is not a contract.\n *\n * @param from address representing the previous owner of the given token ID\n * @param to target address that will receive the tokens\n * @param tokenId uint256 ID of the token to be transferred\n * @param data bytes optional data to send along with the call\n */\n function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private {\n if (to.code.length > 0) {\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\n if (retval != IERC721Receiver.onERC721Received.selector) {\n revert ERC721InvalidReceiver(to);\n }\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n revert ERC721InvalidReceiver(to);\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n }\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721URIStorage.sol)\n\npragma solidity ^0.8.20;\n\nimport {ERC721} from \"../ERC721.sol\";\nimport {Strings} from \"../../../utils/Strings.sol\";\nimport {IERC4906} from \"../../../interfaces/IERC4906.sol\";\nimport {IERC165} from \"../../../interfaces/IERC165.sol\";\n\n/**\n * @dev ERC721 token with storage based token URI management.\n */\nabstract contract ERC721URIStorage is IERC4906, ERC721 {\n using Strings for uint256;\n\n // Interface ID as defined in ERC-4906. This does not correspond to a traditional interface ID as ERC-4906 only\n // defines events and does not include any external function.\n bytes4 private constant ERC4906_INTERFACE_ID = bytes4(0x49064906);\n\n // Optional mapping for token URIs\n mapping(uint256 tokenId => string) private _tokenURIs;\n\n /**\n * @dev See {IERC165-supportsInterface}\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) {\n return interfaceId == ERC4906_INTERFACE_ID || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n _requireOwned(tokenId);\n\n string memory _tokenURI = _tokenURIs[tokenId];\n string memory base = _baseURI();\n\n // If there is no base URI, return the token URI.\n if (bytes(base).length == 0) {\n return _tokenURI;\n }\n // If both are set, concatenate the baseURI and tokenURI (via string.concat).\n if (bytes(_tokenURI).length > 0) {\n return string.concat(base, _tokenURI);\n }\n\n return super.tokenURI(tokenId);\n }\n\n /**\n * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.\n *\n * Emits {MetadataUpdate}.\n */\n function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {\n _tokenURIs[tokenId] = _tokenURI;\n emit MetadataUpdate(tokenId);\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC721} from \"../IERC721.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721Metadata is IERC721 {\n /**\n * @dev Returns the token collection name.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the token collection symbol.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n */\n function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/IERC721.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n /**\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n */\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n */\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n */\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n /**\n * @dev Returns the number of tokens in ``owner``'s account.\n */\n function balanceOf(address owner) external view returns (uint256 balance);\n\n /**\n * @dev Returns the owner of the `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function ownerOf(uint256 tokenId) external view returns (address owner);\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\n * a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or\n * {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\n * a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n /**\n * @dev Transfers `tokenId` token from `from` to `to`.\n *\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 tokenId) external;\n\n /**\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n * The approval is cleared when the token is transferred.\n *\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n *\n * Requirements:\n *\n * - The caller must own the token or be an approved operator.\n * - `tokenId` must exist.\n *\n * Emits an {Approval} event.\n */\n function approve(address to, uint256 tokenId) external;\n\n /**\n * @dev Approve or remove `operator` as an operator for the caller.\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n *\n * Requirements:\n *\n * - The `operator` cannot be the address zero.\n *\n * Emits an {ApprovalForAll} event.\n */\n function setApprovalForAll(address operator, bool approved) external;\n\n /**\n * @dev Returns the account approved for `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function getApproved(uint256 tokenId) external view returns (address operator);\n\n /**\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n *\n * See {setApprovalForAll}\n */\n function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be\n * reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" - }, - "@openzeppelin/contracts/utils/Address.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error AddressInsufficientBalance(address account);\n\n /**\n * @dev There's no code at `target` (it is not a contract).\n */\n error AddressEmptyCode(address target);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedInnerCall();\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n if (address(this).balance < amount) {\n revert AddressInsufficientBalance(address(this));\n }\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n if (!success) {\n revert FailedInnerCall();\n }\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason or custom error, it is bubbled\n * up by this function (like regular Solidity function calls). However, if\n * the call reverted with no returned reason, this function reverts with a\n * {FailedInnerCall} error.\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n if (address(this).balance < value) {\n revert AddressInsufficientBalance(address(this));\n }\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an\n * unsuccessful call.\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata\n ) internal view returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n // only check if target is a contract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n if (returndata.length == 0 && target.code.length == 0) {\n revert AddressEmptyCode(target);\n }\n return returndata;\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n * revert reason or with a default {FailedInnerCall} error.\n */\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n return returndata;\n }\n }\n\n /**\n * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.\n */\n function _revert(bytes memory returndata) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert FailedInnerCall();\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Arrays.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Arrays.sol)\n\npragma solidity ^0.8.20;\n\nimport {StorageSlot} from \"./StorageSlot.sol\";\nimport {Math} from \"./math/Math.sol\";\n\n/**\n * @dev Collection of functions related to array types.\n */\nlibrary Arrays {\n using StorageSlot for bytes32;\n\n /**\n * @dev Searches a sorted `array` and returns the first index that contains\n * a value greater or equal to `element`. If no such index exists (i.e. all\n * values in the array are strictly less than `element`), the array length is\n * returned. Time complexity O(log n).\n *\n * `array` is expected to be sorted in ascending order, and to contain no\n * repeated elements.\n */\n function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {\n uint256 low = 0;\n uint256 high = array.length;\n\n if (high == 0) {\n return 0;\n }\n\n while (low < high) {\n uint256 mid = Math.average(low, high);\n\n // Note that mid will always be strictly less than high (i.e. it will be a valid array index)\n // because Math.average rounds towards zero (it does integer division with truncation).\n if (unsafeAccess(array, mid).value > element) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.\n if (low > 0 && unsafeAccess(array, low - 1).value == element) {\n return low - 1;\n } else {\n return low;\n }\n }\n\n /**\n * @dev Access an array in an \"unsafe\" way. Skips solidity \"index-out-of-range\" check.\n *\n * WARNING: Only use if you are certain `pos` is lower than the array length.\n */\n function unsafeAccess(address[] storage arr, uint256 pos) internal pure returns (StorageSlot.AddressSlot storage) {\n bytes32 slot;\n // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr`\n // following https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays.\n\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0, arr.slot)\n slot := add(keccak256(0, 0x20), pos)\n }\n return slot.getAddressSlot();\n }\n\n /**\n * @dev Access an array in an \"unsafe\" way. Skips solidity \"index-out-of-range\" check.\n *\n * WARNING: Only use if you are certain `pos` is lower than the array length.\n */\n function unsafeAccess(bytes32[] storage arr, uint256 pos) internal pure returns (StorageSlot.Bytes32Slot storage) {\n bytes32 slot;\n // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr`\n // following https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays.\n\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0, arr.slot)\n slot := add(keccak256(0, 0x20), pos)\n }\n return slot.getBytes32Slot();\n }\n\n /**\n * @dev Access an array in an \"unsafe\" way. Skips solidity \"index-out-of-range\" check.\n *\n * WARNING: Only use if you are certain `pos` is lower than the array length.\n */\n function unsafeAccess(uint256[] storage arr, uint256 pos) internal pure returns (StorageSlot.Uint256Slot storage) {\n bytes32 slot;\n // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr`\n // following https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays.\n\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0, arr.slot)\n slot := add(keccak256(0, 0x20), pos)\n }\n return slot.getUint256Slot();\n }\n\n /**\n * @dev Access an array in an \"unsafe\" way. Skips solidity \"index-out-of-range\" check.\n *\n * WARNING: Only use if you are certain `pos` is lower than the array length.\n */\n function unsafeMemoryAccess(uint256[] memory arr, uint256 pos) internal pure returns (uint256 res) {\n assembly {\n res := mload(add(add(arr, 0x20), mul(pos, 0x20)))\n }\n }\n\n /**\n * @dev Access an array in an \"unsafe\" way. Skips solidity \"index-out-of-range\" check.\n *\n * WARNING: Only use if you are certain `pos` is lower than the array length.\n */\n function unsafeMemoryAccess(address[] memory arr, uint256 pos) internal pure returns (address res) {\n assembly {\n res := mload(add(add(arr, 0x20), mul(pos, 0x20)))\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Context.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/introspection/ERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/introspection/IERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" - }, - "@openzeppelin/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Muldiv operation overflow.\n */\n error MathOverflowedMulDiv();\n\n enum Rounding {\n Floor, // Toward negative infinity\n Ceil, // Toward positive infinity\n Trunc, // Toward zero\n Expand // Away from zero\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with an overflow flag.\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds towards infinity instead\n * of rounding towards zero.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n if (b == 0) {\n // Guarantee the same behavior as in a regular Solidity division.\n return a / b;\n }\n\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n * denominator == 0.\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n * Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0 = x * y; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n if (denominator <= prod1) {\n revert MathOverflowedMulDiv();\n }\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n uint256 twos = denominator & (0 - denominator);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n // works in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n * towards zero.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n */\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n return uint8(rounding) % 2 == 1;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/math/SignedMath.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // must be unchecked in order to support `n = type(int256).min`\n return uint256(n >= 0 ? n : -n);\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n uint256 private _status;\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n constructor() {\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n _status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/StorageSlot.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(newImplementation.code.length > 0);\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Strings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n uint8 private constant ADDRESS_LENGTH = 20;\n\n /**\n * @dev The `value` string doesn't fit in the specified `length`.\n */\n error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toStringSigned(int256 value) internal pure returns (string memory) {\n return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n uint256 localValue = value;\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = HEX_DIGITS[localValue & 0xf];\n localValue >>= 4;\n }\n if (localValue != 0) {\n revert StringsInsufficientHexLength(value, length);\n }\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n * representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n" - }, - "contracts/AccessManager.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\nimport \"@openzeppelin/contracts/access/AccessControl.sol\";\r\n\r\ncontract AccessManager is AccessControl {\r\n bytes32 public constant VALIDATOR_ROLE = keccak256(\"VALIDATOR_ROLE\");\r\n bytes32 public constant AGENT_ROLE = keccak256(\"AGENT_ROLE\");\r\n\r\n constructor(address admin) {\r\n _grantRole(DEFAULT_ADMIN_ROLE, admin);\r\n }\r\n\r\n /**\r\n * Use this modifier to manage the fonction access more granularly\r\n * @param _functionSig The signature of the function to be called\r\n */\r\n modifier functionRoleOrAdmin(bytes32 _functionSig) {\r\n require(\r\n hasRole(DEFAULT_ADMIN_ROLE, _msgSender()) || hasRole(_functionSig, _msgSender()),\r\n \"[AccessManagement] Only the Admin or function granted user can interact\"\r\n );\r\n _;\r\n }\r\n\r\n /**\r\n * @dev Add a validator to the contract\r\n */\r\n function addValidator(address _validator) public functionRoleOrAdmin(this.addValidator.selector) {\r\n _grantRole(VALIDATOR_ROLE, _validator);\r\n }\r\n\r\n /**\r\n * @dev Remove a validator from the contract\r\n */\r\n function removeValidator(address _validator) public functionRoleOrAdmin(this.removeValidator.selector) {\r\n _revokeRole(VALIDATOR_ROLE, _validator);\r\n }\r\n\r\n /**\r\n * @dev Check if an address has the admin role\r\n */\r\n function hasAdminRole(address _address) public view returns (bool) {\r\n return hasRole(DEFAULT_ADMIN_ROLE, _address);\r\n }\r\n\r\n /**\r\n * @dev Check if an address has the validator role\r\n * @param _address The address to check\r\n */\r\n function hasValidatorRole(address _address) public view returns (bool) {\r\n return hasRole(VALIDATOR_ROLE, _address);\r\n }\r\n\r\n /**\r\n * @dev See {IERC165-supportsInterface}.\r\n */\r\n function supportsInterface(bytes4 _interfaceId) public view virtual override(AccessControl) returns (bool) {\r\n return super.supportsInterface(_interfaceId);\r\n }\r\n}\r\n\r\ncontract AccessManagerBase is Context {\r\n AccessManager accessManager;\r\n\r\n constructor(address _accessManager) {\r\n accessManager = AccessManager(_accessManager);\r\n }\r\n\r\n /**\r\n * Use this modifier to restrict to admin only\r\n */\r\n modifier onlyAdmin() {\r\n require(\r\n accessManager.hasRole(accessManager.DEFAULT_ADMIN_ROLE(), _msgSender()),\r\n \"[AccessManagement] Only the admin can interact\"\r\n );\r\n _;\r\n }\r\n\r\n /**\r\n * Use this modifier to restrict to validator only\r\n */\r\n modifier onlyValidator() {\r\n require(\r\n accessManager.hasRole(accessManager.VALIDATOR_ROLE(), _msgSender()),\r\n \"[AccessManagement] Only the validator can interact\"\r\n );\r\n _;\r\n }\r\n\r\n /**\r\n * Use this modifier to restrict to validator only\r\n */\r\n modifier onlyAgent() {\r\n require(\r\n accessManager.hasRole(accessManager.AGENT_ROLE(), _msgSender()),\r\n \"[AccessManagement] Only the agent can interact\"\r\n );\r\n _;\r\n }\r\n\r\n /**\r\n * Use this modifier to manage the fonction access more granularly\r\n */\r\n modifier onlyRole(bytes32 _role) {\r\n require(accessManager.hasRole(_role, _msgSender()), \"[AccessManager] Only the validator can interact\");\r\n _;\r\n }\r\n\r\n /**\r\n * Use this modifier to manage the fonction access more granularly\r\n * @param _functionSig The signature of the function to be called\r\n */\r\n modifier functionRoleOrAdmin(bytes32 _functionSig) {\r\n require(\r\n hasRole(accessManager.DEFAULT_ADMIN_ROLE(), _msgSender()) || hasRole(_functionSig, _msgSender()),\r\n \"[AccessManagement] Only the Admin or function granted user can interact\"\r\n );\r\n _;\r\n }\r\n\r\n function hasAdminRole() public view returns (bool) {\r\n return accessManager.hasAdminRole(_msgSender());\r\n }\r\n\r\n function hasValidatorRole() public view returns (bool) {\r\n return accessManager.hasValidatorRole(_msgSender());\r\n }\r\n\r\n function hasRole(bytes32 _role, address _address) public view returns (bool) {\r\n return accessManager.hasRole(_role, _address);\r\n }\r\n}\r\n" - }, - "contracts/DeedNFT.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\r\nimport \"@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol\";\r\nimport \"./AccessManager.sol\";\r\n\r\ncontract DeedNFT is ERC721, ERC721URIStorage, AccessManagerBase {\r\n struct DeedInfo {\r\n AssetType assetType;\r\n bool isValidated;\r\n }\r\n\r\n uint256 public nextDeedId;\r\n mapping(uint256 => DeedInfo) private deedInfoMap;\r\n\r\n enum AssetType {\r\n Land,\r\n Vehicle,\r\n Estate,\r\n CommercialEquipment\r\n }\r\n\r\n event DeedNFTMinted(uint256 deedId, DeedInfo deedInfo, address minter);\r\n event DeedNFTBurned(uint256 deedId);\r\n event DeedNFTAssetValidationSet(uint256 deedId, bool isValid);\r\n event DeedNFTIpfsDetailsSet(uint256 deedId, string newIpfsDetailsHash);\r\n event DeedNFTAssetTypeSet(uint256 deedId, AssetType newAssetType);\r\n\r\n constructor(address _accessManager) ERC721(\"DeedNFT\", \"DEED\") ERC721URIStorage() AccessManagerBase(_accessManager) {\r\n nextDeedId = 1;\r\n }\r\n\r\n modifier deedExists(uint256 _deedId) {\r\n require(\r\n _ownerOf(_deedId) != address(0),\r\n string.concat(\"[DeedNFT] Deed does not exist with id \", Strings.toString(_deedId))\r\n );\r\n _;\r\n }\r\n\r\n modifier onlyOwner(uint256 _deedId) {\r\n require(\r\n _msgSender() == _ownerOf(_deedId),\r\n string.concat(\"[DeedNFT] Must be owner of the Deed with id \", Strings.toString(_deedId))\r\n );\r\n _;\r\n }\r\n\r\n function mintAsset(\r\n address _owner,\r\n string memory _ipfsDetailsHash,\r\n AssetType _assetType\r\n ) public onlyValidator returns (uint256) {\r\n _mint(_owner, nextDeedId);\r\n\r\n DeedInfo storage deedInfo = deedInfoMap[nextDeedId];\r\n deedInfo.assetType = _assetType;\r\n deedInfo.isValidated = true;\r\n _setTokenURI(nextDeedId, _ipfsDetailsHash);\r\n emit DeedNFTMinted(nextDeedId, deedInfo, _msgSender());\r\n nextDeedId = nextDeedId + 1;\r\n return nextDeedId;\r\n }\r\n\r\n function burn(uint256 _deedId) public onlyOwner(_deedId) {\r\n _burn(_deedId);\r\n emit DeedNFTBurned(_deedId);\r\n }\r\n\r\n function setAssetValidation(uint256 _deedId, bool _isValid) public onlyValidator {\r\n require(_ownerOf(_deedId) != _msgSender(), \"[DeedNFT] Owner cannot validate their own asset\");\r\n _setAssetValidation(_deedId, _isValid);\r\n }\r\n\r\n function setIpfsDetailsHash(\r\n uint256 _deedId,\r\n string memory _ipfsDetailsHash\r\n ) public virtual deedExists(_deedId) onlyOwner(_deedId) {\r\n _setTokenURI(_deedId, _ipfsDetailsHash);\r\n _setAssetValidation(_deedId, false);\r\n emit DeedNFTIpfsDetailsSet(_deedId, _ipfsDetailsHash);\r\n }\r\n\r\n function setAssetType(uint256 _deedId, AssetType _assetType) public deedExists(_deedId) onlyOwner(_deedId) {\r\n DeedInfo storage deedInfo = deedInfoMap[_deedId];\r\n deedInfo.assetType = _assetType;\r\n _setAssetValidation(_deedId, false);\r\n emit DeedNFTAssetTypeSet(_deedId, _assetType);\r\n }\r\n\r\n function getDeedInfo(uint256 _deedId) public view deedExists(_deedId) returns (DeedInfo memory) {\r\n return deedInfoMap[_deedId];\r\n }\r\n\r\n function canSubdivide(uint256 _deedId) external view returns (bool) {\r\n AssetType assetType = getDeedInfo(_deedId).assetType;\r\n return assetType == AssetType.Land || assetType == AssetType.Estate;\r\n }\r\n\r\n function supportsInterface(\r\n bytes4 _interfaceId\r\n ) public view virtual override(ERC721, ERC721URIStorage) returns (bool) {\r\n return super.supportsInterface(_interfaceId);\r\n }\r\n\r\n function tokenURI(uint256 _deedId) public view override(ERC721, ERC721URIStorage) returns (string memory) {\r\n return super.tokenURI(_deedId);\r\n }\r\n\r\n function _setAssetValidation(uint256 _deedId, bool _isValid) internal {\r\n DeedInfo storage deedInfo = deedInfoMap[_deedId];\r\n deedInfo.isValidated = _isValid;\r\n emit DeedNFTAssetValidationSet(_deedId, _isValid);\r\n }\r\n}\r\n" - }, - "contracts/FundsManager.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\r\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\r\nimport \"@openzeppelin/contracts/access/AccessControl.sol\";\r\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\r\nimport \"./AccessManager.sol\";\r\n\r\ncontract FundsManager is Context, AccessManagerBase {\r\n event FundsStored(uint256 id, IERC20 token, uint256 amount, address sender, address caller, uint256 newBalance);\r\n event FundsWithdrawn(\r\n uint256 id,\r\n IERC20 token,\r\n uint256 amount,\r\n address destination,\r\n address caller,\r\n uint256 newBalance\r\n );\r\n\r\n // AccountOwner -> AccountId -> TokenAddress -> Amount\r\n mapping(address => mapping(uint256 => mapping(address => uint256))) public accountsMapping;\r\n\r\n constructor(address _accessManager) AccessManagerBase(_accessManager) {}\r\n\r\n /**\r\n * Get the balance of an account\r\n * @param _id AccountId\r\n * @param _token TokenAddress\r\n * @return Balance\r\n */\r\n function balanceOf(uint256 _id, IERC20 _token) external view returns (uint256) {\r\n return accountsMapping[_msgSender()][_id][address(_token)];\r\n }\r\n\r\n /**\r\n * Pull tokens from sender and store them in the contract\r\n * @param _id AccountId\r\n * @param _token TokenAddress\r\n * @param _amount Amount\r\n * @param _sender Witch address to pull tokens from\r\n */\r\n function store(uint256 _id, IERC20 _token, uint256 _amount, address _sender) external {\r\n require(\r\n _token.allowance(_sender, address(this)) >= _amount,\r\n string.concat(\r\n \"[Funds Manager] Not enough allowance for account \",\r\n Strings.toString(_id),\r\n \" and amount \",\r\n Strings.toString(_amount)\r\n )\r\n );\r\n\r\n _token.transferFrom(_sender, address(this), _amount);\r\n accountsMapping[_msgSender()][_id][address(_token)] += _amount;\r\n\r\n emit FundsStored(\r\n _id,\r\n _token,\r\n _amount,\r\n _sender,\r\n _msgSender(),\r\n accountsMapping[_msgSender()][_id][address(_token)]\r\n );\r\n }\r\n\r\n /**\r\n * Withdraw tokens from the contract and send them to the recipient\r\n * @param _id AccountId\r\n * @param _token TokenAddress\r\n * @param _amount Amount\r\n * @param _recipient Witch address to send tokens to\r\n */\r\n function withdraw(uint256 _id, IERC20 _token, uint256 _amount, address _recipient) external {\r\n require(\r\n accountsMapping[_msgSender()][_id][address(_token)] >= _amount,\r\n string.concat(\r\n \"[Funds Manager] Not enough funds for account \",\r\n Strings.toString(_id),\r\n \" and amount \",\r\n Strings.toString(_amount)\r\n )\r\n );\r\n\r\n accountsMapping[_msgSender()][_id][address(_token)] -= _amount;\r\n _token.transfer(_recipient, _amount);\r\n\r\n emit FundsWithdrawn(\r\n _id,\r\n _token,\r\n _amount,\r\n _recipient,\r\n _msgSender(),\r\n accountsMapping[_msgSender()][_id][address(_token)]\r\n );\r\n }\r\n}\r\n" - }, - "contracts/LeaseAgreement.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\n\r\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\r\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\r\nimport \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\r\nimport \"./DeedNFT.sol\"; // Import the IDeedNFT interface\r\nimport \"./LeaseNFT.sol\";\r\nimport \"./SubdivisionNFT.sol\"; // Import the ISubdivisionNFT interface\r\nimport \"./FundsManager.sol\";\r\nimport \"./AccessManager.sol\";\r\n\r\ninterface ILeaseNFT {\r\n function mint(address leaseOwner, uint256 leaseId) external;\r\n\r\n function burn(uint256 leaseId) external;\r\n}\r\n\r\ncontract LeaseAgreement is ReentrancyGuard, AccessManagerBase {\r\n // CONSTANTS\r\n uint256 private constant MONTH = 30.5 days;\r\n uint256 private constant MAX_NB_MONTH_FOR_DEPOSIT = 3;\r\n\r\n struct LeaseDates {\r\n uint256 startDate;\r\n uint256 endDate;\r\n uint256 rentDueDate;\r\n uint256 distributableDate;\r\n }\r\n\r\n struct Deposit {\r\n uint256 amount;\r\n bool paid;\r\n }\r\n\r\n struct Lease {\r\n address[] lesseeList;\r\n uint256 rentAmount;\r\n Deposit securityDeposit;\r\n uint256 latePaymentFee;\r\n uint32 gracePeriod;\r\n LeaseDates dates;\r\n uint256 extensionCount;\r\n uint256 deedId;\r\n address manager;\r\n uint8 managerPercentage;\r\n uint256 unclaimedRentAmount;\r\n bool isArchived;\r\n }\r\n\r\n struct RentPaymentInfo {\r\n uint256 rentAmount;\r\n uint256 totalBalance;\r\n uint32 unpaidMonths;\r\n uint256 rentDueDate;\r\n }\r\n\r\n modifier onlyLessor(uint256 _leaseId) {\r\n require(_msgSender() == leaseNFT.ownerOf(_leaseId), \"[Lease Agreement] Sender must be Lessor\");\r\n _;\r\n }\r\n modifier onlyActive(uint256 _leaseId) {\r\n require(\r\n block.timestamp < leases[_leaseId].dates.endDate && block.timestamp > leases[_leaseId].dates.startDate,\r\n \"[Lease Agreement] The contract has been archived.\"\r\n );\r\n _;\r\n }\r\n mapping(uint256 => Lease) public leases;\r\n uint256 public leaseCounter;\r\n LeaseNFT public leaseNFT;\r\n IERC20 public paymentToken;\r\n DeedNFT public deedNFT;\r\n SubdivisionNFT public subdivisionNFT;\r\n FundsManager public fundsManager;\r\n\r\n event LeaseFundsManagerSet(address fundsManager);\r\n event LeasePaymentTokenSet(address paymentToken);\r\n event LeaseCreated(uint256 leaseId, Lease lease);\r\n event LeaseTerminated(uint256 leaseId);\r\n event LeasePaymentMade(uint256 leaseId, uint256 amount, uint256 unclaimedRentAmount);\r\n event LeaseRentDistributed(uint256 leaseId, uint256 lessorAmount, uint256 managerAmount, uint256 distributableDate);\r\n event LeaseManagerSet(uint256 leaseId, address manager, uint256 percentage);\r\n event LeaseManagerUnset(uint256 leaseId);\r\n event LeaseDueDateChanged(uint256 leaseId, uint256 newDueDate);\r\n event LeaseDepositSubmited(uint256 leaseId, uint256 amount);\r\n event LeaseExtended(uint256 leaseId, uint256 endDate, uint256 rentAmount, uint256 extensionCount);\r\n\r\n constructor(\r\n address _leaseNFT,\r\n address _paymentToken,\r\n address _deedNFT,\r\n address _subdivisionNFT,\r\n address _fundsManager,\r\n address _accessManager\r\n ) AccessManagerBase(_accessManager) {\r\n require(_leaseNFT != address(0), \"[Lease Agreement] Invalid LeaseNFT address\");\r\n require(_paymentToken != address(0), \"[Lease Agreement] Invalid token address\");\r\n require(_deedNFT != address(0), \"[Lease Agreement] Invalid DeedNFT address\");\r\n require(_subdivisionNFT != address(0), \"[Lease Agreement] Invalid SubdivisionNFT address\");\r\n\r\n leaseNFT = LeaseNFT(_leaseNFT);\r\n deedNFT = DeedNFT(_deedNFT);\r\n subdivisionNFT = SubdivisionNFT(_subdivisionNFT);\r\n\r\n paymentToken = IERC20(_paymentToken);\r\n emit LeasePaymentTokenSet(_paymentToken);\r\n\r\n fundsManager = FundsManager(_fundsManager);\r\n emit LeaseFundsManagerSet(_fundsManager);\r\n\r\n leaseCounter = 0;\r\n }\r\n\r\n function setFundsManager(address _fundsManager) public functionRoleOrAdmin(this.setFundsManager.selector) {\r\n fundsManager = FundsManager(_fundsManager);\r\n emit LeaseFundsManagerSet(_fundsManager);\r\n }\r\n\r\n function getLesseeList(uint256 _leaseId) public view returns (address[] memory) {\r\n Lease storage lease = leases[_leaseId];\r\n return lease.lesseeList;\r\n }\r\n\r\n function setPaymentToken(address _paymentToken) public functionRoleOrAdmin(this.setPaymentToken.selector) {\r\n paymentToken = IERC20(_paymentToken);\r\n emit LeasePaymentTokenSet(_paymentToken);\r\n }\r\n\r\n function createLease(\r\n address[] memory _lesseeList,\r\n uint256 _startDate,\r\n uint256 _endDate,\r\n uint256 _rentAmount,\r\n uint256 _securityDepositAmount,\r\n uint256 _deedId,\r\n uint256 _latePaymentFee,\r\n uint32 _gracePeriod\r\n ) external {\r\n require(_startDate < _endDate, \"[Lease Agreement] Invalid start and end dates\");\r\n require(\r\n _endDate - _startDate > 1 * MONTH,\r\n \"[Lease Agreement] End date and start date should be 1 month appart\"\r\n );\r\n require(_gracePeriod >= 3);\r\n require(_latePaymentFee >= 0 && _latePaymentFee <= 15);\r\n bool isDeedOwner = _verifyDeedOwnership(_msgSender(), _deedId);\r\n bool isSubdivisionOwner = _verifySubdivisionOwnership(_msgSender(), _deedId);\r\n require(isDeedOwner || isSubdivisionOwner, \"[Lease Agreement] Lessor must own the property NFT\");\r\n\r\n uint256 leaseId = leaseCounter;\r\n leaseCounter++;\r\n Lease storage lease = leases[leaseId];\r\n lease.lesseeList = _lesseeList;\r\n lease.dates.startDate = _startDate;\r\n lease.dates.endDate = _endDate;\r\n lease.rentAmount = _rentAmount;\r\n lease.securityDeposit.amount = _securityDepositAmount;\r\n lease.dates.rentDueDate = _startDate + 1 * MONTH;\r\n lease.extensionCount = 0;\r\n lease.deedId = _deedId;\r\n lease.securityDeposit.paid = _securityDepositAmount == 0;\r\n lease.latePaymentFee = _latePaymentFee;\r\n lease.gracePeriod = _gracePeriod;\r\n lease.isArchived = false;\r\n leaseNFT.mint(_msgSender(), leaseId);\r\n lease.dates.distributableDate = lease.dates.rentDueDate;\r\n\r\n emit LeaseCreated(leaseId, lease);\r\n }\r\n\r\n function containsAddress(address[] memory _addresses, address _address) internal pure returns (bool) {\r\n bool contains = false;\r\n for (uint i = 0; i < _addresses.length; i++) {\r\n if (_addresses[i] == _address) {\r\n contains = true;\r\n break;\r\n }\r\n }\r\n return contains;\r\n }\r\n\r\n function transferLease(uint256 _leaseId, address[] memory _newLesseeList) public onlyLessor(_leaseId) {\r\n Lease storage lease = leases[_leaseId];\r\n lease.lesseeList = _newLesseeList;\r\n }\r\n\r\n function setManager(uint256 _leaseId, address _manager, uint8 _percentage) public onlyLessor(_leaseId) {\r\n Lease storage lease = leases[_leaseId];\r\n require(_percentage >= 0 && _percentage <= 100, \"[Lease Agreement] Invalid Manager percentage\");\r\n\r\n lease.manager = _manager;\r\n lease.managerPercentage = _percentage;\r\n\r\n emit LeaseManagerSet(_leaseId, _manager, _percentage);\r\n }\r\n\r\n function unsetManager(uint256 _leaseId) external {\r\n Lease storage lease = leases[_leaseId];\r\n require(\r\n _msgSender() == leaseNFT.ownerOf(_leaseId) || _msgSender() == lease.manager,\r\n \"[Lease Agreement] Only the Lessor or the Manager can remove the Manager\"\r\n );\r\n\r\n lease.manager = address(0);\r\n lease.managerPercentage = 0;\r\n\r\n emit LeaseManagerUnset(_leaseId);\r\n }\r\n\r\n function submitDeposit(uint256 _leaseId) external nonReentrant {\r\n Lease storage lease = leases[_leaseId];\r\n require(\r\n containsAddress(lease.lesseeList, _msgSender()),\r\n \"[Lease Agreement] Only the Lessee can submit the deposit\"\r\n );\r\n require(!lease.securityDeposit.paid, \"[Lease Agreement] Security deposit already paid\");\r\n\r\n fundsManager.store(_leaseId, paymentToken, lease.securityDeposit.amount, _msgSender());\r\n lease.securityDeposit.paid = true;\r\n\r\n emit LeaseDepositSubmited(_leaseId, lease.securityDeposit.amount);\r\n }\r\n\r\n function setDueDate(uint256 _leaseId, uint256 _newDueDate) public onlyLessor(_leaseId) {\r\n Lease storage lease = leases[_leaseId];\r\n require(\r\n _newDueDate >= (lease.dates.rentDueDate + 1 * MONTH),\r\n \"[Lease Agreement] New rent due date must be at least a month after current one\"\r\n );\r\n\r\n lease.dates.rentDueDate = _newDueDate;\r\n\r\n emit LeaseDueDateChanged(_leaseId, _newDueDate);\r\n }\r\n\r\n function payRent(uint256 _leaseId) external nonReentrant {\r\n Lease storage lease = leases[_leaseId];\r\n require(containsAddress(lease.lesseeList, _msgSender()), \"[Lease Agreement] Only the Lessee can pay rent\");\r\n require(lease.securityDeposit.paid, \"[Lease Agreement] Security deposit must be paid first\");\r\n require(\r\n block.timestamp >= lease.dates.startDate && block.timestamp <= lease.dates.endDate,\r\n \"[Lease Agreement] Outside of lease duration\"\r\n );\r\n\r\n RentPaymentInfo memory rentInfo = calculateRentPaymentInfo(_leaseId);\r\n lease.unclaimedRentAmount += rentInfo.totalBalance;\r\n lease.dates.rentDueDate += (rentInfo.unpaidMonths) * (1 * MONTH);\r\n fundsManager.store(_leaseId, paymentToken, rentInfo.totalBalance, _msgSender());\r\n\r\n emit LeaseDueDateChanged(_leaseId, lease.dates.rentDueDate);\r\n emit LeasePaymentMade(_leaseId, rentInfo.totalBalance, lease.unclaimedRentAmount);\r\n }\r\n\r\n function distributeRent(uint256 _leaseId) external nonReentrant {\r\n Lease storage lease = leases[_leaseId];\r\n require(\r\n _msgSender() == leaseNFT.ownerOf(_leaseId) || _msgSender() == lease.manager,\r\n \"[Lease Agreement] Caller must be the Lessor or the Manager\"\r\n );\r\n require(lease.unclaimedRentAmount > 0, \"[Lease Agreement] No rent to distribute\");\r\n uint256 nbMonthSinceLastDistribute = 0;\r\n require(\r\n block.timestamp > lease.dates.distributableDate,\r\n \"[Lease Agreement] Rent can only be distributed past the distributable date\"\r\n );\r\n\r\n nbMonthSinceLastDistribute = (block.timestamp - lease.dates.distributableDate) / (1 * MONTH) + 1;\r\n uint256 totalToClaim = lease.unclaimedRentAmount;\r\n uint256 managerAmount = 0;\r\n\r\n if (lease.manager != address(0)) {\r\n managerAmount = (totalToClaim * lease.managerPercentage) / 100;\r\n fundsManager.withdraw(_leaseId, paymentToken, uint32(managerAmount), lease.manager);\r\n }\r\n\r\n uint256 lessorAmount = totalToClaim - managerAmount;\r\n fundsManager.withdraw(_leaseId, paymentToken, uint32(lessorAmount), leaseNFT.ownerOf(_leaseId));\r\n lease.unclaimedRentAmount = 0;\r\n lease.dates.distributableDate += nbMonthSinceLastDistribute * (1 * MONTH);\r\n\r\n emit LeaseRentDistributed(_leaseId, uint32(lessorAmount), uint32(managerAmount), lease.dates.distributableDate);\r\n }\r\n\r\n function extendLease(uint256 _leaseId, uint256 _extensionPeriod) external onlyLessor(_leaseId) {\r\n Lease storage lease = leases[_leaseId];\r\n require(!lease.isArchived, \"[Lease Agreement] Lease has been archived\");\r\n require(\r\n block.timestamp >= lease.dates.endDate - 45 days, // TODO: Configurable\r\n \"[Lease Agreement] Extension can only be requested in the last 45 days\"\r\n );\r\n require(lease.extensionCount < 2, \"[Lease Agreement] Maximum extensions reached\");\r\n lease.dates.endDate += _extensionPeriod;\r\n lease.rentAmount += (lease.rentAmount * 3) / 100;\r\n lease.extensionCount++;\r\n\r\n emit LeaseExtended(_leaseId, lease.dates.endDate, lease.rentAmount, lease.extensionCount);\r\n }\r\n\r\n function withdrawDeposit(uint256 _leaseId) external nonReentrant {\r\n Lease storage lease = leases[_leaseId];\r\n require(\r\n lease.isArchived || block.timestamp > lease.dates.endDate,\r\n \"[Lease Agreement] Cannot withdraw deposit if Lease still active\"\r\n );\r\n require(containsAddress(lease.lesseeList, _msgSender()), \"[Lease Agreement] Caller must be one of the lessees\");\r\n RentPaymentInfo memory rentInfo = calculateRentPaymentInfo(_leaseId);\r\n bool shouldSendDepositToLessor = (rentInfo.unpaidMonths >= MAX_NB_MONTH_FOR_DEPOSIT);\r\n // Send security deposit to the sender of the lessee list\r\n if (!shouldSendDepositToLessor) {\r\n fundsManager.withdraw(_leaseId, paymentToken, lease.securityDeposit.amount, _msgSender());\r\n }\r\n lease.isArchived = true;\r\n }\r\n\r\n function burnLease(uint256 _leaseId) public {\r\n Lease storage lease = leases[_leaseId];\r\n require(\r\n _msgSender() == leaseNFT.ownerOf(_leaseId) || _msgSender() == lease.manager,\r\n \"[Lease Agreement] Sender must be manager or lessor\"\r\n );\r\n require(lease.isArchived, \"[Lease Agreement] Lease has been archived\");\r\n leaseNFT.burn(_leaseId);\r\n }\r\n\r\n function terminateLease(uint256 _leaseId) external nonReentrant onlyLessor(_leaseId) {\r\n Lease storage lease = leases[_leaseId];\r\n require(block.timestamp >= lease.dates.startDate, \"[Lease Agreement] Lease has not started yet\");\r\n RentPaymentInfo memory rentInfo = calculateRentPaymentInfo(_leaseId);\r\n bool shouldSendDepositToLessor = (rentInfo.unpaidMonths >= MAX_NB_MONTH_FOR_DEPOSIT);\r\n\r\n // Send security deposit to the lessor if needed\r\n if (shouldSendDepositToLessor) {\r\n fundsManager.withdraw(_leaseId, paymentToken, lease.securityDeposit.amount, leaseNFT.ownerOf(_leaseId));\r\n }\r\n lease.isArchived = true;\r\n emit LeaseTerminated(_leaseId);\r\n }\r\n\r\n function calculateRentPaymentInfo(uint256 _leaseId) public view returns (RentPaymentInfo memory rentInfo) {\r\n Lease storage lease = leases[_leaseId];\r\n rentInfo.rentAmount = lease.rentAmount;\r\n // sidenote: rent due date is incremented by 1 month each time the rent is paid.(function payRent)\r\n if (block.timestamp > lease.dates.rentDueDate + (lease.gracePeriod * 1 days)) {\r\n // Function to calculate rentAmountIncrease increase\r\n rentInfo.rentAmount += (lease.rentAmount * lease.latePaymentFee) / 100;\r\n rentInfo.unpaidMonths = uint32((block.timestamp - lease.dates.rentDueDate) / (1 * MONTH) + 1);\r\n rentInfo.totalBalance = (rentInfo.unpaidMonths) * rentInfo.rentAmount;\r\n } else {\r\n rentInfo.unpaidMonths = 1;\r\n rentInfo.totalBalance = rentInfo.rentAmount;\r\n }\r\n return rentInfo;\r\n }\r\n\r\n function _verifySubdivisionOwnership(address _owner, uint256 _subdivisionId) internal view returns (bool) {\r\n return subdivisionNFT.isOwnerOfSubdivision(_owner, _subdivisionId);\r\n }\r\n\r\n function _verifyDeedOwnership(address _owner, uint256 _deedId) internal view returns (bool) {\r\n try deedNFT.ownerOf(_deedId) returns (address owner) {\r\n return owner == _owner;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n" - }, - "contracts/LeaseNFT.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\n\r\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\r\nimport \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\r\nimport \"@openzeppelin/contracts/utils/Address.sol\";\r\nimport \"@openzeppelin/contracts/utils/math/Math.sol\";\r\nimport \"@openzeppelin/contracts/utils/introspection/ERC165.sol\";\r\nimport \"./AccessManager.sol\";\r\n\r\ncontract LeaseNFT is ERC721, AccessManagerBase {\r\n address private leaseAgreementAddress;\r\n\r\n event LeaseNFTMinted(address leaseOwner, uint256 leaseId, address minter);\r\n event LeaseNFTBurned(uint256 leaseId, address burner);\r\n event LeaseNFTAgreementSet(uint256 leaseId, address burner);\r\n\r\n constructor(address _accessManager) ERC721(\"LeaseNFT\", \"LEASE\") AccessManagerBase(_accessManager) {}\r\n\r\n function setLeaseAgreementAddress(address _leaseAgreementAddress) external onlyAdmin {\r\n leaseAgreementAddress = _leaseAgreementAddress;\r\n }\r\n\r\n function mint(address _to, uint256 _leaseId) external {\r\n require(\r\n hasAdminRole() || _msgSender() == leaseAgreementAddress,\r\n \"[LeaseNFT] Only LeaseAgreement contract can mint the lease\"\r\n );\r\n _mint(_to, _leaseId);\r\n emit LeaseNFTMinted(_to, _leaseId, _msgSender());\r\n }\r\n\r\n function exists(uint256 _leaseId) public view returns (bool) {\r\n return _ownerOf(_leaseId) != address(0);\r\n }\r\n\r\n function burn(uint256 _leaseId) external {\r\n require(\r\n hasAdminRole() || _msgSender() == leaseAgreementAddress,\r\n \"[LeaseNFT] Only LeaseAgreement can burn the lease\"\r\n );\r\n _burn(_leaseId);\r\n emit LeaseNFTBurned(_leaseId, _msgSender());\r\n }\r\n}\r\n" - }, - "contracts/SubdivisionNFT.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\nimport \"@openzeppelin/contracts/token/ERC1155/ERC1155.sol\";\r\nimport \"@openzeppelin/contracts/access/AccessControl.sol\";\r\nimport \"./DeedNFT.sol\";\r\nimport \"./AccessManager.sol\";\r\n\r\ncontract SubdivisionNFT is ERC1155, AccessManagerBase {\r\n struct SubdivisionInfo {\r\n bytes ipfsDetailsHash;\r\n address owner;\r\n uint256 parentDeed;\r\n }\r\n\r\n uint256 private _nextsubTokenID;\r\n mapping(uint256 => SubdivisionInfo) private subdivisionInfoMap;\r\n\r\n bytes32 public constant MINTER_ROLE = keccak256(\"MINTER_ROLE\");\r\n DeedNFT public deedNFT;\r\n\r\n event SubdivisionMinted(\r\n address subdivisionOwner,\r\n uint256 subdivisionId,\r\n uint256 deedId,\r\n bytes ipfsDetailsHash,\r\n address minter\r\n );\r\n event SubdivisionBurned(address account, uint256 subdivisionId, uint256 deedId, bytes ipfsDetailsHash);\r\n event SubdivisionInfoSet(uint256 tokenId, SubdivisionInfo info);\r\n\r\n constructor(address _deedNFT, address _accessManager) ERC1155(\"\") AccessManagerBase(_accessManager) {\r\n require(_deedNFT != address(0), \"[SubdivisionNFT] Invalid DeedNFT address\");\r\n\r\n _nextsubTokenID = 1;\r\n deedNFT = DeedNFT(_deedNFT);\r\n }\r\n\r\n function mintSubdivision(SubdivisionInfo memory _info) public {\r\n require(\r\n _msgSender() == deedNFT.ownerOf(_info.parentDeed),\r\n \"[SubdivisionNFT] Sender must be the owner of the parent deed\"\r\n );\r\n require(deedNFT.canSubdivide(_info.parentDeed), \"[SubdivisionNFT] Parent deed must be land or estate\");\r\n\r\n _mint(_info.owner, _nextsubTokenID, 1, _info.ipfsDetailsHash);\r\n SubdivisionInfo storage subInfo = subdivisionInfoMap[_nextsubTokenID];\r\n subInfo.ipfsDetailsHash = _info.ipfsDetailsHash;\r\n subInfo.owner = _info.owner;\r\n subInfo.parentDeed = _info.parentDeed;\r\n\r\n emit SubdivisionMinted(_info.owner, _nextsubTokenID, _info.parentDeed, _info.ipfsDetailsHash, _msgSender());\r\n _nextsubTokenID = _nextsubTokenID + 1;\r\n }\r\n\r\n function batchMint(SubdivisionInfo[] memory _infos) public {\r\n for (uint i = 0; i < _infos.length; i++) {\r\n mintSubdivision(_infos[i]);\r\n }\r\n }\r\n\r\n function setInfo(uint256 _subTokenId, SubdivisionInfo memory _newInfo) public virtual {\r\n require(\r\n isOwnerOfSubdivision(_msgSender(), _subTokenId) == true,\r\n \"[SubdivisionNFT] Sender Must be owner of subdivision to set info\"\r\n );\r\n\r\n subdivisionInfoMap[_subTokenId] = _newInfo;\r\n\r\n emit SubdivisionInfoSet(_subTokenId, _newInfo);\r\n }\r\n\r\n function burnSubdivision(uint256 _subTokenId) public {\r\n require(\r\n isOwnerOfSubdivision(_msgSender(), _subTokenId) == true,\r\n \"[SubdivisionNFT] Sender must be owner of the subdivision to burn it\"\r\n );\r\n\r\n _burn(_msgSender(), _subTokenId, 1);\r\n\r\n emit SubdivisionBurned(\r\n _msgSender(),\r\n _subTokenId,\r\n subdivisionInfoMap[_subTokenId].parentDeed,\r\n subdivisionInfoMap[_subTokenId].ipfsDetailsHash\r\n );\r\n }\r\n\r\n function getParentDeed(uint256 _subTokenId) public view returns (uint256) {\r\n SubdivisionInfo storage info = subdivisionInfoMap[_subTokenId];\r\n return info.parentDeed;\r\n }\r\n\r\n function isOwnerOfSubdivision(address _owner, uint256 _subTokenId) public view returns (bool) {\r\n return balanceOf(_owner, _subTokenId) > 0;\r\n }\r\n\r\n function supportsInterface(bytes4 _interfaceId) public view virtual override(ERC1155) returns (bool) {\r\n return super.supportsInterface(_interfaceId);\r\n }\r\n}\r\n" - } - }, - "settings": { - "optimizer": { - "enabled": true, - "runs": 200 - }, - "evmVersion": "paris", - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - } - } -} \ No newline at end of file diff --git a/packages/hardhat/deployments/sepolia/solcInputs/9a595a16aee481b19c9cc69826d97edc.json b/packages/hardhat/deployments/sepolia/solcInputs/9a595a16aee481b19c9cc69826d97edc.json deleted file mode 100644 index fad15d98..00000000 --- a/packages/hardhat/deployments/sepolia/solcInputs/9a595a16aee481b19c9cc69826d97edc.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "@openzeppelin/contracts/access/AccessControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAccessControl} from \"./IAccessControl.sol\";\nimport {Context} from \"../utils/Context.sol\";\nimport {ERC165} from \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address account => bool) hasRole;\n bytes32 adminRole;\n }\n\n mapping(bytes32 role => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with an {AccessControlUnauthorizedAccount} error including the required role.\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual returns (bool) {\n return _roles[role].hasRole[account];\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\n * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\n * is missing `role`.\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert AccessControlUnauthorizedAccount(account, role);\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address callerConfirmation) public virtual {\n if (callerConfirmation != _msgSender()) {\n revert AccessControlBadConfirmation();\n }\n\n _revokeRole(role, callerConfirmation);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\n if (!hasRole(role, account)) {\n _roles[role].hasRole[account] = true;\n emit RoleGranted(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\n if (hasRole(role, account)) {\n _roles[role].hasRole[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n}\n" - }, - "@openzeppelin/contracts/access/IAccessControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev The `account` is missing a role.\n */\n error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\n\n /**\n * @dev The caller of a function is not the expected one.\n *\n * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\n */\n error AccessControlBadConfirmation();\n\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n */\n function renounceRole(bytes32 role, address callerConfirmation) external;\n}\n" - }, - "@openzeppelin/contracts/interfaces/draft-IERC6093.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.\n */\ninterface IERC20Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC20InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC20InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC20InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.\n */\ninterface IERC721Errors {\n /**\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.\n * Used in balance queries.\n * @param owner Address of the current owner of a token.\n */\n error ERC721InvalidOwner(address owner);\n\n /**\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\n * @param tokenId Identifier number of a token.\n */\n error ERC721NonexistentToken(uint256 tokenId);\n\n /**\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param tokenId Identifier number of a token.\n * @param owner Address of the current owner of a token.\n */\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC721InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC721InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param tokenId Identifier number of a token.\n */\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC721InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.\n */\ninterface IERC1155Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n * @param tokenId Identifier number of a token.\n */\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC1155InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC1155InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param owner Address of the current owner of a token.\n */\n error ERC1155MissingApprovalForAll(address operator, address owner);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC1155InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC1155InvalidOperator(address operator);\n\n /**\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n * Used in batch transfers.\n * @param idsLength Length of the array of token identifiers\n * @param valuesLength Length of the array of token amounts\n */\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n" - }, - "@openzeppelin/contracts/interfaces/IERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n" - }, - "@openzeppelin/contracts/interfaces/IERC4906.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4906.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\nimport {IERC721} from \"./IERC721.sol\";\n\n/// @title EIP-721 Metadata Update Extension\ninterface IERC4906 is IERC165, IERC721 {\n /// @dev This event emits when the metadata of a token is changed.\n /// So that the third-party platforms such as NFT market could\n /// timely update the images and related attributes of the NFT.\n event MetadataUpdate(uint256 _tokenId);\n\n /// @dev This event emits when the metadata of a range of tokens is changed.\n /// So that the third-party platforms such as NFT market could\n /// timely update the images and related attributes of the NFTs.\n event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);\n}\n" - }, - "@openzeppelin/contracts/interfaces/IERC721.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC721} from \"../token/ERC721/IERC721.sol\";\n" - }, - "@openzeppelin/contracts/token/ERC1155/ERC1155.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/ERC1155.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC1155} from \"./IERC1155.sol\";\nimport {IERC1155Receiver} from \"./IERC1155Receiver.sol\";\nimport {IERC1155MetadataURI} from \"./extensions/IERC1155MetadataURI.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC165, ERC165} from \"../../utils/introspection/ERC165.sol\";\nimport {Arrays} from \"../../utils/Arrays.sol\";\nimport {IERC1155Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the basic standard multi-token.\n * See https://eips.ethereum.org/EIPS/eip-1155\n * Originally based on code by Enjin: https://github.com/enjin/erc-1155\n */\nabstract contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI, IERC1155Errors {\n using Arrays for uint256[];\n using Arrays for address[];\n\n mapping(uint256 id => mapping(address account => uint256)) private _balances;\n\n mapping(address account => mapping(address operator => bool)) private _operatorApprovals;\n\n // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json\n string private _uri;\n\n /**\n * @dev See {_setURI}.\n */\n constructor(string memory uri_) {\n _setURI(uri_);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC1155).interfaceId ||\n interfaceId == type(IERC1155MetadataURI).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC1155MetadataURI-uri}.\n *\n * This implementation returns the same URI for *all* token types. It relies\n * on the token type ID substitution mechanism\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\n *\n * Clients calling this function must replace the `\\{id\\}` substring with the\n * actual token type ID.\n */\n function uri(uint256 /* id */) public view virtual returns (string memory) {\n return _uri;\n }\n\n /**\n * @dev See {IERC1155-balanceOf}.\n */\n function balanceOf(address account, uint256 id) public view virtual returns (uint256) {\n return _balances[id][account];\n }\n\n /**\n * @dev See {IERC1155-balanceOfBatch}.\n *\n * Requirements:\n *\n * - `accounts` and `ids` must have the same length.\n */\n function balanceOfBatch(\n address[] memory accounts,\n uint256[] memory ids\n ) public view virtual returns (uint256[] memory) {\n if (accounts.length != ids.length) {\n revert ERC1155InvalidArrayLength(ids.length, accounts.length);\n }\n\n uint256[] memory batchBalances = new uint256[](accounts.length);\n\n for (uint256 i = 0; i < accounts.length; ++i) {\n batchBalances[i] = balanceOf(accounts.unsafeMemoryAccess(i), ids.unsafeMemoryAccess(i));\n }\n\n return batchBalances;\n }\n\n /**\n * @dev See {IERC1155-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC1155-isApprovedForAll}.\n */\n function isApprovedForAll(address account, address operator) public view virtual returns (bool) {\n return _operatorApprovals[account][operator];\n }\n\n /**\n * @dev See {IERC1155-safeTransferFrom}.\n */\n function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes memory data) public virtual {\n address sender = _msgSender();\n if (from != sender && !isApprovedForAll(from, sender)) {\n revert ERC1155MissingApprovalForAll(sender, from);\n }\n _safeTransferFrom(from, to, id, value, data);\n }\n\n /**\n * @dev See {IERC1155-safeBatchTransferFrom}.\n */\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory values,\n bytes memory data\n ) public virtual {\n address sender = _msgSender();\n if (from != sender && !isApprovedForAll(from, sender)) {\n revert ERC1155MissingApprovalForAll(sender, from);\n }\n _safeBatchTransferFrom(from, to, ids, values, data);\n }\n\n /**\n * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`. Will mint (or burn) if `from`\n * (or `to`) is the zero address.\n *\n * Emits a {TransferSingle} event if the arrays contain one element, and {TransferBatch} otherwise.\n *\n * Requirements:\n *\n * - If `to` refers to a smart contract, it must implement either {IERC1155Receiver-onERC1155Received}\n * or {IERC1155Receiver-onERC1155BatchReceived} and return the acceptance magic value.\n * - `ids` and `values` must have the same length.\n *\n * NOTE: The ERC-1155 acceptance check is not performed in this function. See {_updateWithAcceptanceCheck} instead.\n */\n function _update(address from, address to, uint256[] memory ids, uint256[] memory values) internal virtual {\n if (ids.length != values.length) {\n revert ERC1155InvalidArrayLength(ids.length, values.length);\n }\n\n address operator = _msgSender();\n\n for (uint256 i = 0; i < ids.length; ++i) {\n uint256 id = ids.unsafeMemoryAccess(i);\n uint256 value = values.unsafeMemoryAccess(i);\n\n if (from != address(0)) {\n uint256 fromBalance = _balances[id][from];\n if (fromBalance < value) {\n revert ERC1155InsufficientBalance(from, fromBalance, value, id);\n }\n unchecked {\n // Overflow not possible: value <= fromBalance\n _balances[id][from] = fromBalance - value;\n }\n }\n\n if (to != address(0)) {\n _balances[id][to] += value;\n }\n }\n\n if (ids.length == 1) {\n uint256 id = ids.unsafeMemoryAccess(0);\n uint256 value = values.unsafeMemoryAccess(0);\n emit TransferSingle(operator, from, to, id, value);\n } else {\n emit TransferBatch(operator, from, to, ids, values);\n }\n }\n\n /**\n * @dev Version of {_update} that performs the token acceptance check by calling\n * {IERC1155Receiver-onERC1155Received} or {IERC1155Receiver-onERC1155BatchReceived} on the receiver address if it\n * contains code (eg. is a smart contract at the moment of execution).\n *\n * IMPORTANT: Overriding this function is discouraged because it poses a reentrancy risk from the receiver. So any\n * update to the contract state after this function would break the check-effect-interaction pattern. Consider\n * overriding {_update} instead.\n */\n function _updateWithAcceptanceCheck(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory values,\n bytes memory data\n ) internal virtual {\n _update(from, to, ids, values);\n if (to != address(0)) {\n address operator = _msgSender();\n if (ids.length == 1) {\n uint256 id = ids.unsafeMemoryAccess(0);\n uint256 value = values.unsafeMemoryAccess(0);\n _doSafeTransferAcceptanceCheck(operator, from, to, id, value, data);\n } else {\n _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, values, data);\n }\n }\n }\n\n /**\n * @dev Transfers a `value` tokens of token type `id` from `from` to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `from` must have a balance of tokens of type `id` of at least `value` amount.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function _safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes memory data) internal {\n if (to == address(0)) {\n revert ERC1155InvalidReceiver(address(0));\n }\n if (from == address(0)) {\n revert ERC1155InvalidSender(address(0));\n }\n (uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);\n _updateWithAcceptanceCheck(from, to, ids, values, data);\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n * - `ids` and `values` must have the same length.\n */\n function _safeBatchTransferFrom(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory values,\n bytes memory data\n ) internal {\n if (to == address(0)) {\n revert ERC1155InvalidReceiver(address(0));\n }\n if (from == address(0)) {\n revert ERC1155InvalidSender(address(0));\n }\n _updateWithAcceptanceCheck(from, to, ids, values, data);\n }\n\n /**\n * @dev Sets a new URI for all token types, by relying on the token type ID\n * substitution mechanism\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\n *\n * By this mechanism, any occurrence of the `\\{id\\}` substring in either the\n * URI or any of the values in the JSON file at said URI will be replaced by\n * clients with the token type ID.\n *\n * For example, the `https://token-cdn-domain/\\{id\\}.json` URI would be\n * interpreted by clients as\n * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`\n * for token type ID 0x4cce0.\n *\n * See {uri}.\n *\n * Because these URIs cannot be meaningfully represented by the {URI} event,\n * this function emits no events.\n */\n function _setURI(string memory newuri) internal virtual {\n _uri = newuri;\n }\n\n /**\n * @dev Creates a `value` amount of tokens of type `id`, and assigns them to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function _mint(address to, uint256 id, uint256 value, bytes memory data) internal {\n if (to == address(0)) {\n revert ERC1155InvalidReceiver(address(0));\n }\n (uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);\n _updateWithAcceptanceCheck(address(0), to, ids, values, data);\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `values` must have the same length.\n * - `to` cannot be the zero address.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function _mintBatch(address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\n if (to == address(0)) {\n revert ERC1155InvalidReceiver(address(0));\n }\n _updateWithAcceptanceCheck(address(0), to, ids, values, data);\n }\n\n /**\n * @dev Destroys a `value` amount of tokens of type `id` from `from`\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `from` must have at least `value` amount of tokens of type `id`.\n */\n function _burn(address from, uint256 id, uint256 value) internal {\n if (from == address(0)) {\n revert ERC1155InvalidSender(address(0));\n }\n (uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);\n _updateWithAcceptanceCheck(from, address(0), ids, values, \"\");\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `from` must have at least `value` amount of tokens of type `id`.\n * - `ids` and `values` must have the same length.\n */\n function _burnBatch(address from, uint256[] memory ids, uint256[] memory values) internal {\n if (from == address(0)) {\n revert ERC1155InvalidSender(address(0));\n }\n _updateWithAcceptanceCheck(from, address(0), ids, values, \"\");\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n *\n * Requirements:\n *\n * - `operator` cannot be the zero address.\n */\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\n if (operator == address(0)) {\n revert ERC1155InvalidOperator(address(0));\n }\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Performs an acceptance check by calling {IERC1155-onERC1155Received} on the `to` address\n * if it contains code at the moment of execution.\n */\n function _doSafeTransferAcceptanceCheck(\n address operator,\n address from,\n address to,\n uint256 id,\n uint256 value,\n bytes memory data\n ) private {\n if (to.code.length > 0) {\n try IERC1155Receiver(to).onERC1155Received(operator, from, id, value, data) returns (bytes4 response) {\n if (response != IERC1155Receiver.onERC1155Received.selector) {\n // Tokens rejected\n revert ERC1155InvalidReceiver(to);\n }\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n // non-ERC1155Receiver implementer\n revert ERC1155InvalidReceiver(to);\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n }\n }\n\n /**\n * @dev Performs a batch acceptance check by calling {IERC1155-onERC1155BatchReceived} on the `to` address\n * if it contains code at the moment of execution.\n */\n function _doSafeBatchTransferAcceptanceCheck(\n address operator,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory values,\n bytes memory data\n ) private {\n if (to.code.length > 0) {\n try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, values, data) returns (\n bytes4 response\n ) {\n if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {\n // Tokens rejected\n revert ERC1155InvalidReceiver(to);\n }\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n // non-ERC1155Receiver implementer\n revert ERC1155InvalidReceiver(to);\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n }\n }\n\n /**\n * @dev Creates an array in memory with only one value for each of the elements provided.\n */\n function _asSingletonArrays(\n uint256 element1,\n uint256 element2\n ) private pure returns (uint256[] memory array1, uint256[] memory array2) {\n /// @solidity memory-safe-assembly\n assembly {\n // Load the free memory pointer\n array1 := mload(0x40)\n // Set array length to 1\n mstore(array1, 1)\n // Store the single element at the next word after the length (where content starts)\n mstore(add(array1, 0x20), element1)\n\n // Repeat for next array locating it right after the first array\n array2 := add(array1, 0x40)\n mstore(array2, 1)\n mstore(add(array2, 0x20), element2)\n\n // Update the free memory pointer by pointing after the second array\n mstore(0x40, add(array2, 0x40))\n }\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/extensions/IERC1155MetadataURI.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC1155} from \"../IERC1155.sol\";\n\n/**\n * @dev Interface of the optional ERC1155MetadataExtension interface, as defined\n * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].\n */\ninterface IERC1155MetadataURI is IERC1155 {\n /**\n * @dev Returns the URI for token type `id`.\n *\n * If the `\\{id\\}` substring is present in the URI, it must be replaced by\n * clients with the actual token type ID.\n */\n function uri(uint256 id) external view returns (string memory);\n}\n" - }, - "@openzeppelin/contracts/token/ERC1155/IERC1155.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\n */\ninterface IERC1155 is IERC165 {\n /**\n * @dev Emitted when `value` amount of tokens of type `id` are transferred from `from` to `to` by `operator`.\n */\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\n\n /**\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\n * transfers.\n */\n event TransferBatch(\n address indexed operator,\n address indexed from,\n address indexed to,\n uint256[] ids,\n uint256[] values\n );\n\n /**\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\n * `approved`.\n */\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\n\n /**\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\n *\n * If an {URI} event was emitted for `id`, the standard\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\n * returned by {IERC1155MetadataURI-uri}.\n */\n event URI(string value, uint256 indexed id);\n\n /**\n * @dev Returns the value of tokens of token type `id` owned by `account`.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function balanceOf(address account, uint256 id) external view returns (uint256);\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\n *\n * Requirements:\n *\n * - `accounts` and `ids` must have the same length.\n */\n function balanceOfBatch(\n address[] calldata accounts,\n uint256[] calldata ids\n ) external view returns (uint256[] memory);\n\n /**\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\n *\n * Emits an {ApprovalForAll} event.\n *\n * Requirements:\n *\n * - `operator` cannot be the caller.\n */\n function setApprovalForAll(address operator, bool approved) external;\n\n /**\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\n *\n * See {setApprovalForAll}.\n */\n function isApprovedForAll(address account, address operator) external view returns (bool);\n\n /**\n * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`.\n *\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\n * to an untrusted contract, when invoking {onERC1155Received} on the receiver.\n * Ensure to follow the checks-effects-interactions pattern and consider employing\n * reentrancy guards when interacting with untrusted contracts.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\n * - `from` must have a balance of tokens of type `id` of at least `value` amount.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\n *\n *\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\n * to an untrusted contract, when invoking {onERC1155BatchReceived} on the receiver.\n * Ensure to follow the checks-effects-interactions pattern and consider employing\n * reentrancy guards when interacting with untrusted contracts.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `values` must have the same length.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external;\n}\n" - }, - "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Interface that must be implemented by smart contracts in order to receive\n * ERC-1155 token transfers.\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/ERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n mapping(address account => uint256) private _balances;\n\n mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `value`.\n */\n function transfer(address to, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `value`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `value`.\n */\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, value);\n _transfer(from, to, value);\n return true;\n }\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _transfer(address from, address to, uint256 value) internal {\n if (from == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n if (to == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(from, to, value);\n }\n\n /**\n * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n * this function.\n *\n * Emits a {Transfer} event.\n */\n function _update(address from, address to, uint256 value) internal virtual {\n if (from == address(0)) {\n // Overflow check required: The rest of the code assumes that totalSupply never overflows\n _totalSupply += value;\n } else {\n uint256 fromBalance = _balances[from];\n if (fromBalance < value) {\n revert ERC20InsufficientBalance(from, fromBalance, value);\n }\n unchecked {\n // Overflow not possible: value <= fromBalance <= totalSupply.\n _balances[from] = fromBalance - value;\n }\n }\n\n if (to == address(0)) {\n unchecked {\n // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n _totalSupply -= value;\n }\n } else {\n unchecked {\n // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n _balances[to] += value;\n }\n }\n\n emit Transfer(from, to, value);\n }\n\n /**\n * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n * Relies on the `_update` mechanism\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _mint(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(address(0), account, value);\n }\n\n /**\n * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n * Relies on the `_update` mechanism.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead\n */\n function _burn(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n _update(account, address(0), value);\n }\n\n /**\n * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n *\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n */\n function _approve(address owner, address spender, uint256 value) internal {\n _approve(owner, spender, value, true);\n }\n\n /**\n * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n *\n * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any\n * `Approval` event during `transferFrom` operations.\n *\n * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to\n * true using the following override:\n * ```\n * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n * super._approve(owner, spender, value, true);\n * }\n * ```\n *\n * Requirements are the same as {_approve}.\n */\n function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n if (owner == address(0)) {\n revert ERC20InvalidApprover(address(0));\n }\n if (spender == address(0)) {\n revert ERC20InvalidSpender(address(0));\n }\n _allowances[owner][spender] = value;\n if (emitEvent) {\n emit Approval(owner, spender, value);\n }\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `value`.\n *\n * Does not update the allowance value in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Does not emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n if (currentAllowance < value) {\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n }\n unchecked {\n _approve(owner, spender, currentAllowance - value, false);\n }\n }\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * ==== Security Considerations\n *\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\n * generally recommended is:\n *\n * ```solidity\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\n * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\n * doThing(..., value);\n * }\n *\n * function doThing(..., uint256 value) public {\n * token.safeTransferFrom(msg.sender, address(this), value);\n * ...\n * }\n * ```\n *\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\n * {SafeERC20-safeTransferFrom}).\n *\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\n * contracts should have entry points that don't rely on permit.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n *\n * CAUTION: See Security Considerations above.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/IERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC20Permit} from \"../extensions/IERC20Permit.sol\";\nimport {Address} from \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n /**\n * @dev An operation with an ERC20 token failed.\n */\n error SafeERC20FailedOperation(address token);\n\n /**\n * @dev Indicates a failed `decreaseAllowance` request.\n */\n error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n forceApprove(token, spender, oldAllowance + value);\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n * value, non-reverting calls are assumed to be successful.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n unchecked {\n uint256 currentAllowance = token.allowance(address(this), spender);\n if (currentAllowance < requestedDecrease) {\n revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n }\n forceApprove(token, spender, currentAllowance - requestedDecrease);\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n * to be set to zero before setting it to a non-zero value, such as USDT.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data);\n if (returndata.length != 0 && !abi.decode(returndata, (bool))) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n // and not revert is the subcall reverts.\n\n (bool success, bytes memory returndata) = address(token).call(data);\n return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/ERC721.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC721} from \"./IERC721.sol\";\nimport {IERC721Receiver} from \"./IERC721Receiver.sol\";\nimport {IERC721Metadata} from \"./extensions/IERC721Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {Strings} from \"../../utils/Strings.sol\";\nimport {IERC165, ERC165} from \"../../utils/introspection/ERC165.sol\";\nimport {IERC721Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\nabstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors {\n using Strings for uint256;\n\n // Token name\n string private _name;\n\n // Token symbol\n string private _symbol;\n\n mapping(uint256 tokenId => address) private _owners;\n\n mapping(address owner => uint256) private _balances;\n\n mapping(uint256 tokenId => address) private _tokenApprovals;\n\n mapping(address owner => mapping(address operator => bool)) private _operatorApprovals;\n\n /**\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC721).interfaceId ||\n interfaceId == type(IERC721Metadata).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721-balanceOf}.\n */\n function balanceOf(address owner) public view virtual returns (uint256) {\n if (owner == address(0)) {\n revert ERC721InvalidOwner(address(0));\n }\n return _balances[owner];\n }\n\n /**\n * @dev See {IERC721-ownerOf}.\n */\n function ownerOf(uint256 tokenId) public view virtual returns (address) {\n return _requireOwned(tokenId);\n }\n\n /**\n * @dev See {IERC721Metadata-name}.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IERC721Metadata-symbol}.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId) public view virtual returns (string memory) {\n _requireOwned(tokenId);\n\n string memory baseURI = _baseURI();\n return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : \"\";\n }\n\n /**\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n * by default, can be overridden in child contracts.\n */\n function _baseURI() internal view virtual returns (string memory) {\n return \"\";\n }\n\n /**\n * @dev See {IERC721-approve}.\n */\n function approve(address to, uint256 tokenId) public virtual {\n _approve(to, tokenId, _msgSender());\n }\n\n /**\n * @dev See {IERC721-getApproved}.\n */\n function getApproved(uint256 tokenId) public view virtual returns (address) {\n _requireOwned(tokenId);\n\n return _getApproved(tokenId);\n }\n\n /**\n * @dev See {IERC721-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC721-isApprovedForAll}.\n */\n function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {\n return _operatorApprovals[owner][operator];\n }\n\n /**\n * @dev See {IERC721-transferFrom}.\n */\n function transferFrom(address from, address to, uint256 tokenId) public virtual {\n if (to == address(0)) {\n revert ERC721InvalidReceiver(address(0));\n }\n // Setting an \"auth\" arguments enables the `_isAuthorized` check which verifies that the token exists\n // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.\n address previousOwner = _update(to, tokenId, _msgSender());\n if (previousOwner != from) {\n revert ERC721IncorrectOwner(from, tokenId, previousOwner);\n }\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId) public {\n safeTransferFrom(from, to, tokenId, \"\");\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {\n transferFrom(from, to, tokenId);\n _checkOnERC721Received(from, to, tokenId, data);\n }\n\n /**\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n *\n * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the\n * core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances\n * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by\n * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.\n */\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n return _owners[tokenId];\n }\n\n /**\n * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.\n */\n function _getApproved(uint256 tokenId) internal view virtual returns (address) {\n return _tokenApprovals[tokenId];\n }\n\n /**\n * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in\n * particular (ignoring whether it is owned by `owner`).\n *\n * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\n * assumption.\n */\n function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {\n return\n spender != address(0) &&\n (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);\n }\n\n /**\n * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.\n * Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets\n * the `spender` for the specific `tokenId`.\n *\n * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\n * assumption.\n */\n function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {\n if (!_isAuthorized(owner, spender, tokenId)) {\n if (owner == address(0)) {\n revert ERC721NonexistentToken(tokenId);\n } else {\n revert ERC721InsufficientApproval(spender, tokenId);\n }\n }\n }\n\n /**\n * @dev Unsafe write access to the balances, used by extensions that \"mint\" tokens using an {ownerOf} override.\n *\n * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that\n * a uint256 would ever overflow from increments when these increments are bounded to uint128 values.\n *\n * WARNING: Increasing an account's balance using this function tends to be paired with an override of the\n * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership\n * remain consistent with one another.\n */\n function _increaseBalance(address account, uint128 value) internal virtual {\n unchecked {\n _balances[account] += value;\n }\n }\n\n /**\n * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner\n * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.\n *\n * The `auth` argument is optional. If the value passed is non 0, then this function will check that\n * `auth` is either the owner of the token, or approved to operate on the token (by the owner).\n *\n * Emits a {Transfer} event.\n *\n * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.\n */\n function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {\n address from = _ownerOf(tokenId);\n\n // Perform (optional) operator check\n if (auth != address(0)) {\n _checkAuthorized(from, auth, tokenId);\n }\n\n // Execute the update\n if (from != address(0)) {\n // Clear approval. No need to re-authorize or emit the Approval event\n _approve(address(0), tokenId, address(0), false);\n\n unchecked {\n _balances[from] -= 1;\n }\n }\n\n if (to != address(0)) {\n unchecked {\n _balances[to] += 1;\n }\n }\n\n _owners[tokenId] = to;\n\n emit Transfer(from, to, tokenId);\n\n return from;\n }\n\n /**\n * @dev Mints `tokenId` and transfers it to `to`.\n *\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - `to` cannot be the zero address.\n *\n * Emits a {Transfer} event.\n */\n function _mint(address to, uint256 tokenId) internal {\n if (to == address(0)) {\n revert ERC721InvalidReceiver(address(0));\n }\n address previousOwner = _update(to, tokenId, address(0));\n if (previousOwner != address(0)) {\n revert ERC721InvalidSender(address(0));\n }\n }\n\n /**\n * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeMint(address to, uint256 tokenId) internal {\n _safeMint(to, tokenId, \"\");\n }\n\n /**\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n */\n function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\n _mint(to, tokenId);\n _checkOnERC721Received(address(0), to, tokenId, data);\n }\n\n /**\n * @dev Destroys `tokenId`.\n * The approval is cleared when the token is burned.\n * This is an internal function that does not check if the sender is authorized to operate on the token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n *\n * Emits a {Transfer} event.\n */\n function _burn(uint256 tokenId) internal {\n address previousOwner = _update(address(0), tokenId, address(0));\n if (previousOwner == address(0)) {\n revert ERC721NonexistentToken(tokenId);\n }\n }\n\n /**\n * @dev Transfers `tokenId` from `from` to `to`.\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n *\n * Emits a {Transfer} event.\n */\n function _transfer(address from, address to, uint256 tokenId) internal {\n if (to == address(0)) {\n revert ERC721InvalidReceiver(address(0));\n }\n address previousOwner = _update(to, tokenId, address(0));\n if (previousOwner == address(0)) {\n revert ERC721NonexistentToken(tokenId);\n } else if (previousOwner != from) {\n revert ERC721IncorrectOwner(from, tokenId, previousOwner);\n }\n }\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients\n * are aware of the ERC721 standard to prevent tokens from being forever locked.\n *\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\n *\n * This internal function is like {safeTransferFrom} in the sense that it invokes\n * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.\n * implement alternative mechanisms to perform token transfer, such as signature-based.\n *\n * Requirements:\n *\n * - `tokenId` token must exist and be owned by `from`.\n * - `to` cannot be the zero address.\n * - `from` cannot be the zero address.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeTransfer(address from, address to, uint256 tokenId) internal {\n _safeTransfer(from, to, tokenId, \"\");\n }\n\n /**\n * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n */\n function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\n _transfer(from, to, tokenId);\n _checkOnERC721Received(from, to, tokenId, data);\n }\n\n /**\n * @dev Approve `to` to operate on `tokenId`\n *\n * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is\n * either the owner of the token, or approved to operate on all tokens held by this owner.\n *\n * Emits an {Approval} event.\n *\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n */\n function _approve(address to, uint256 tokenId, address auth) internal {\n _approve(to, tokenId, auth, true);\n }\n\n /**\n * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not\n * emitted in the context of transfers.\n */\n function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {\n // Avoid reading the owner unless necessary\n if (emitEvent || auth != address(0)) {\n address owner = _requireOwned(tokenId);\n\n // We do not use _isAuthorized because single-token approvals should not be able to call approve\n if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {\n revert ERC721InvalidApprover(auth);\n }\n\n if (emitEvent) {\n emit Approval(owner, to, tokenId);\n }\n }\n\n _tokenApprovals[tokenId] = to;\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Requirements:\n * - operator can't be the address zero.\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\n if (operator == address(0)) {\n revert ERC721InvalidOperator(operator);\n }\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).\n * Returns the owner.\n *\n * Overrides to ownership logic should be done to {_ownerOf}.\n */\n function _requireOwned(uint256 tokenId) internal view returns (address) {\n address owner = _ownerOf(tokenId);\n if (owner == address(0)) {\n revert ERC721NonexistentToken(tokenId);\n }\n return owner;\n }\n\n /**\n * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the\n * recipient doesn't accept the token transfer. The call is not executed if the target address is not a contract.\n *\n * @param from address representing the previous owner of the given token ID\n * @param to target address that will receive the tokens\n * @param tokenId uint256 ID of the token to be transferred\n * @param data bytes optional data to send along with the call\n */\n function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private {\n if (to.code.length > 0) {\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\n if (retval != IERC721Receiver.onERC721Received.selector) {\n revert ERC721InvalidReceiver(to);\n }\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n revert ERC721InvalidReceiver(to);\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n }\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721URIStorage.sol)\n\npragma solidity ^0.8.20;\n\nimport {ERC721} from \"../ERC721.sol\";\nimport {Strings} from \"../../../utils/Strings.sol\";\nimport {IERC4906} from \"../../../interfaces/IERC4906.sol\";\nimport {IERC165} from \"../../../interfaces/IERC165.sol\";\n\n/**\n * @dev ERC721 token with storage based token URI management.\n */\nabstract contract ERC721URIStorage is IERC4906, ERC721 {\n using Strings for uint256;\n\n // Interface ID as defined in ERC-4906. This does not correspond to a traditional interface ID as ERC-4906 only\n // defines events and does not include any external function.\n bytes4 private constant ERC4906_INTERFACE_ID = bytes4(0x49064906);\n\n // Optional mapping for token URIs\n mapping(uint256 tokenId => string) private _tokenURIs;\n\n /**\n * @dev See {IERC165-supportsInterface}\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) {\n return interfaceId == ERC4906_INTERFACE_ID || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n _requireOwned(tokenId);\n\n string memory _tokenURI = _tokenURIs[tokenId];\n string memory base = _baseURI();\n\n // If there is no base URI, return the token URI.\n if (bytes(base).length == 0) {\n return _tokenURI;\n }\n // If both are set, concatenate the baseURI and tokenURI (via string.concat).\n if (bytes(_tokenURI).length > 0) {\n return string.concat(base, _tokenURI);\n }\n\n return super.tokenURI(tokenId);\n }\n\n /**\n * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.\n *\n * Emits {MetadataUpdate}.\n */\n function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {\n _tokenURIs[tokenId] = _tokenURI;\n emit MetadataUpdate(tokenId);\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC721} from \"../IERC721.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721Metadata is IERC721 {\n /**\n * @dev Returns the token collection name.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the token collection symbol.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n */\n function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/IERC721.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n /**\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n */\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n */\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n */\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n /**\n * @dev Returns the number of tokens in ``owner``'s account.\n */\n function balanceOf(address owner) external view returns (uint256 balance);\n\n /**\n * @dev Returns the owner of the `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function ownerOf(uint256 tokenId) external view returns (address owner);\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\n * a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or\n * {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\n * a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n /**\n * @dev Transfers `tokenId` token from `from` to `to`.\n *\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 tokenId) external;\n\n /**\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n * The approval is cleared when the token is transferred.\n *\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n *\n * Requirements:\n *\n * - The caller must own the token or be an approved operator.\n * - `tokenId` must exist.\n *\n * Emits an {Approval} event.\n */\n function approve(address to, uint256 tokenId) external;\n\n /**\n * @dev Approve or remove `operator` as an operator for the caller.\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n *\n * Requirements:\n *\n * - The `operator` cannot be the address zero.\n *\n * Emits an {ApprovalForAll} event.\n */\n function setApprovalForAll(address operator, bool approved) external;\n\n /**\n * @dev Returns the account approved for `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function getApproved(uint256 tokenId) external view returns (address operator);\n\n /**\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n *\n * See {setApprovalForAll}\n */\n function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be\n * reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" - }, - "@openzeppelin/contracts/utils/Address.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error AddressInsufficientBalance(address account);\n\n /**\n * @dev There's no code at `target` (it is not a contract).\n */\n error AddressEmptyCode(address target);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedInnerCall();\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n if (address(this).balance < amount) {\n revert AddressInsufficientBalance(address(this));\n }\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n if (!success) {\n revert FailedInnerCall();\n }\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason or custom error, it is bubbled\n * up by this function (like regular Solidity function calls). However, if\n * the call reverted with no returned reason, this function reverts with a\n * {FailedInnerCall} error.\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n if (address(this).balance < value) {\n revert AddressInsufficientBalance(address(this));\n }\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an\n * unsuccessful call.\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata\n ) internal view returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n // only check if target is a contract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n if (returndata.length == 0 && target.code.length == 0) {\n revert AddressEmptyCode(target);\n }\n return returndata;\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n * revert reason or with a default {FailedInnerCall} error.\n */\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n return returndata;\n }\n }\n\n /**\n * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.\n */\n function _revert(bytes memory returndata) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert FailedInnerCall();\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Arrays.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Arrays.sol)\n\npragma solidity ^0.8.20;\n\nimport {StorageSlot} from \"./StorageSlot.sol\";\nimport {Math} from \"./math/Math.sol\";\n\n/**\n * @dev Collection of functions related to array types.\n */\nlibrary Arrays {\n using StorageSlot for bytes32;\n\n /**\n * @dev Searches a sorted `array` and returns the first index that contains\n * a value greater or equal to `element`. If no such index exists (i.e. all\n * values in the array are strictly less than `element`), the array length is\n * returned. Time complexity O(log n).\n *\n * `array` is expected to be sorted in ascending order, and to contain no\n * repeated elements.\n */\n function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {\n uint256 low = 0;\n uint256 high = array.length;\n\n if (high == 0) {\n return 0;\n }\n\n while (low < high) {\n uint256 mid = Math.average(low, high);\n\n // Note that mid will always be strictly less than high (i.e. it will be a valid array index)\n // because Math.average rounds towards zero (it does integer division with truncation).\n if (unsafeAccess(array, mid).value > element) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.\n if (low > 0 && unsafeAccess(array, low - 1).value == element) {\n return low - 1;\n } else {\n return low;\n }\n }\n\n /**\n * @dev Access an array in an \"unsafe\" way. Skips solidity \"index-out-of-range\" check.\n *\n * WARNING: Only use if you are certain `pos` is lower than the array length.\n */\n function unsafeAccess(address[] storage arr, uint256 pos) internal pure returns (StorageSlot.AddressSlot storage) {\n bytes32 slot;\n // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr`\n // following https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays.\n\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0, arr.slot)\n slot := add(keccak256(0, 0x20), pos)\n }\n return slot.getAddressSlot();\n }\n\n /**\n * @dev Access an array in an \"unsafe\" way. Skips solidity \"index-out-of-range\" check.\n *\n * WARNING: Only use if you are certain `pos` is lower than the array length.\n */\n function unsafeAccess(bytes32[] storage arr, uint256 pos) internal pure returns (StorageSlot.Bytes32Slot storage) {\n bytes32 slot;\n // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr`\n // following https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays.\n\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0, arr.slot)\n slot := add(keccak256(0, 0x20), pos)\n }\n return slot.getBytes32Slot();\n }\n\n /**\n * @dev Access an array in an \"unsafe\" way. Skips solidity \"index-out-of-range\" check.\n *\n * WARNING: Only use if you are certain `pos` is lower than the array length.\n */\n function unsafeAccess(uint256[] storage arr, uint256 pos) internal pure returns (StorageSlot.Uint256Slot storage) {\n bytes32 slot;\n // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr`\n // following https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays.\n\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0, arr.slot)\n slot := add(keccak256(0, 0x20), pos)\n }\n return slot.getUint256Slot();\n }\n\n /**\n * @dev Access an array in an \"unsafe\" way. Skips solidity \"index-out-of-range\" check.\n *\n * WARNING: Only use if you are certain `pos` is lower than the array length.\n */\n function unsafeMemoryAccess(uint256[] memory arr, uint256 pos) internal pure returns (uint256 res) {\n assembly {\n res := mload(add(add(arr, 0x20), mul(pos, 0x20)))\n }\n }\n\n /**\n * @dev Access an array in an \"unsafe\" way. Skips solidity \"index-out-of-range\" check.\n *\n * WARNING: Only use if you are certain `pos` is lower than the array length.\n */\n function unsafeMemoryAccess(address[] memory arr, uint256 pos) internal pure returns (address res) {\n assembly {\n res := mload(add(add(arr, 0x20), mul(pos, 0x20)))\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Context.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/introspection/ERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/introspection/IERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" - }, - "@openzeppelin/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Muldiv operation overflow.\n */\n error MathOverflowedMulDiv();\n\n enum Rounding {\n Floor, // Toward negative infinity\n Ceil, // Toward positive infinity\n Trunc, // Toward zero\n Expand // Away from zero\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with an overflow flag.\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds towards infinity instead\n * of rounding towards zero.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n if (b == 0) {\n // Guarantee the same behavior as in a regular Solidity division.\n return a / b;\n }\n\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n * denominator == 0.\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n * Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0 = x * y; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n if (denominator <= prod1) {\n revert MathOverflowedMulDiv();\n }\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n uint256 twos = denominator & (0 - denominator);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n // works in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n * towards zero.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n */\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n return uint8(rounding) % 2 == 1;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/math/SignedMath.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // must be unchecked in order to support `n = type(int256).min`\n return uint256(n >= 0 ? n : -n);\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n uint256 private _status;\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n constructor() {\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n _status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/StorageSlot.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(newImplementation.code.length > 0);\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Strings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n uint8 private constant ADDRESS_LENGTH = 20;\n\n /**\n * @dev The `value` string doesn't fit in the specified `length`.\n */\n error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toStringSigned(int256 value) internal pure returns (string memory) {\n return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n uint256 localValue = value;\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = HEX_DIGITS[localValue & 0xf];\n localValue >>= 4;\n }\n if (localValue != 0) {\n revert StringsInsufficientHexLength(value, length);\n }\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n * representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n" - }, - "contracts/AccessManager.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\nimport \"@openzeppelin/contracts/access/AccessControl.sol\";\r\n\r\ncontract AccessManager is AccessControl {\r\n bytes32 public constant VALIDATOR_ROLE = keccak256(\"VALIDATOR_ROLE\");\r\n bytes32 public constant AGENT_ROLE = keccak256(\"AGENT_ROLE\");\r\n\r\n constructor(address admin) {\r\n _grantRole(DEFAULT_ADMIN_ROLE, admin);\r\n }\r\n\r\n /**\r\n * Use this modifier to manage the fonction access more granularly\r\n * @param _functionSig The signature of the function to be called\r\n */\r\n modifier functionRoleOrAdmin(bytes32 _functionSig) {\r\n require(\r\n hasRole(DEFAULT_ADMIN_ROLE, _msgSender()) || hasRole(_functionSig, _msgSender()),\r\n \"[AccessManagement] Only the Admin or function granted user can interact\"\r\n );\r\n _;\r\n }\r\n\r\n /**\r\n * @dev Add a validator to the contract\r\n */\r\n function addValidator(address _validator) public functionRoleOrAdmin(this.addValidator.selector) {\r\n _grantRole(VALIDATOR_ROLE, _validator);\r\n }\r\n\r\n /**\r\n * @dev Remove a validator from the contract\r\n */\r\n function removeValidator(address _validator) public functionRoleOrAdmin(this.removeValidator.selector) {\r\n _revokeRole(VALIDATOR_ROLE, _validator);\r\n }\r\n\r\n /**\r\n * @dev Check if an address has the admin role\r\n */\r\n function hasAdminRole(address _address) public view returns (bool) {\r\n return hasRole(DEFAULT_ADMIN_ROLE, _address);\r\n }\r\n\r\n /**\r\n * @dev Check if an address has the validator role\r\n * @param _address The address to check\r\n */\r\n function hasValidatorRole(address _address) public view returns (bool) {\r\n return hasRole(VALIDATOR_ROLE, _address);\r\n }\r\n\r\n /**\r\n * @dev See {IERC165-supportsInterface}.\r\n */\r\n function supportsInterface(bytes4 _interfaceId) public view virtual override(AccessControl) returns (bool) {\r\n return super.supportsInterface(_interfaceId);\r\n }\r\n}\r\n\r\ncontract AccessManagerBase is Context {\r\n AccessManager accessManager;\r\n\r\n constructor(address _accessManager) {\r\n accessManager = AccessManager(_accessManager);\r\n }\r\n\r\n /**\r\n * Use this modifier to restrict to admin only\r\n */\r\n modifier onlyAdmin() {\r\n require(\r\n accessManager.hasRole(accessManager.DEFAULT_ADMIN_ROLE(), _msgSender()),\r\n \"[AccessManagement] Only the admin can interact\"\r\n );\r\n _;\r\n }\r\n\r\n /**\r\n * Use this modifier to restrict to validator only\r\n */\r\n modifier onlyValidator() {\r\n require(\r\n accessManager.hasRole(accessManager.VALIDATOR_ROLE(), _msgSender()),\r\n \"[AccessManagement] Only the validator can interact\"\r\n );\r\n _;\r\n }\r\n\r\n /**\r\n * Use this modifier to restrict to validator only\r\n */\r\n modifier onlyAgent() {\r\n require(\r\n accessManager.hasRole(accessManager.AGENT_ROLE(), _msgSender()),\r\n \"[AccessManagement] Only the agent can interact\"\r\n );\r\n _;\r\n }\r\n\r\n /**\r\n * Use this modifier to manage the fonction access more granularly\r\n */\r\n modifier onlyRole(bytes32 _role) {\r\n require(accessManager.hasRole(_role, _msgSender()), \"[AccessManager] Only the validator can interact\");\r\n _;\r\n }\r\n\r\n /**\r\n * Use this modifier to manage the fonction access more granularly\r\n * @param _functionSig The signature of the function to be called\r\n */\r\n modifier functionRoleOrAdmin(bytes32 _functionSig) {\r\n require(\r\n hasRole(accessManager.DEFAULT_ADMIN_ROLE(), _msgSender()) || hasRole(_functionSig, _msgSender()),\r\n \"[AccessManagement] Only the Admin or function granted user can interact\"\r\n );\r\n _;\r\n }\r\n\r\n function hasAdminRole() public view returns (bool) {\r\n return accessManager.hasAdminRole(_msgSender());\r\n }\r\n\r\n function hasValidatorRole() public view returns (bool) {\r\n return accessManager.hasValidatorRole(_msgSender());\r\n }\r\n\r\n function hasRole(bytes32 _role, address _address) public view returns (bool) {\r\n return accessManager.hasRole(_role, _address);\r\n }\r\n}\r\n" - }, - "contracts/DeedNFT.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\r\nimport \"@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol\";\r\nimport \"./AccessManager.sol\";\r\n\r\ncontract DeedNFT is ERC721, ERC721URIStorage, AccessManagerBase {\r\n struct DeedInfo {\r\n AssetType assetType;\r\n bool isValidated;\r\n }\r\n\r\n uint256 public nextDeedId;\r\n mapping(uint256 => DeedInfo) private deedInfoMap;\r\n\r\n enum AssetType {\r\n Land,\r\n Vehicle,\r\n Estate,\r\n CommercialEquipment\r\n }\r\n\r\n event DeedNFTMinted(uint256 deedId, DeedInfo deedInfo, address minter);\r\n event DeedNFTBurned(uint256 deedId);\r\n event DeedNFTAssetValidationSet(uint256 deedId, bool isValid);\r\n event DeedNFTIpfsDetailsSet(uint256 deedId, string newIpfsDetailsHash);\r\n event DeedNFTAssetTypeSet(uint256 deedId, AssetType newAssetType);\r\n\r\n constructor(address _accessManager) ERC721(\"DeedNFT\", \"DEED\") ERC721URIStorage() AccessManagerBase(_accessManager) {\r\n nextDeedId = 1;\r\n }\r\n\r\n modifier deedExists(uint256 _deedId) {\r\n require(\r\n _ownerOf(_deedId) != address(0),\r\n string.concat(\"[DeedNFT] Deed does not exist with id \", Strings.toString(_deedId))\r\n );\r\n _;\r\n }\r\n\r\n modifier onlyOwner(uint256 _deedId) {\r\n require(\r\n _msgSender() == _ownerOf(_deedId),\r\n string.concat(\"[DeedNFT] Must be owner of the Deed with id \", Strings.toString(_deedId))\r\n );\r\n _;\r\n }\r\n\r\n function mintAsset(address _owner, string memory _ipfsDetailsHash, AssetType _assetType) public returns (uint256) {\r\n _mint(_owner, nextDeedId);\r\n\r\n DeedInfo storage deedInfo = deedInfoMap[nextDeedId];\r\n deedInfo.assetType = _assetType;\r\n deedInfo.isValidated = false;\r\n _setTokenURI(nextDeedId, _ipfsDetailsHash);\r\n emit DeedNFTMinted(nextDeedId, deedInfo, _msgSender());\r\n nextDeedId = nextDeedId + 1;\r\n return nextDeedId;\r\n }\r\n\r\n function burn(uint256 _deedId) public onlyOwner(_deedId) {\r\n _burn(_deedId);\r\n emit DeedNFTBurned(_deedId);\r\n }\r\n\r\n function setAssetValidation(uint256 _deedId, bool _isValid) public onlyValidator {\r\n require(_ownerOf(_deedId) != _msgSender(), \"[DeedNFT] Owner cannot validate their own asset\");\r\n _setAssetValidation(_deedId, _isValid);\r\n }\r\n\r\n function setIpfsDetailsHash(\r\n uint256 _deedId,\r\n string memory _ipfsDetailsHash\r\n ) public virtual deedExists(_deedId) onlyOwner(_deedId) {\r\n _setTokenURI(_deedId, _ipfsDetailsHash);\r\n _setAssetValidation(_deedId, false);\r\n emit DeedNFTIpfsDetailsSet(_deedId, _ipfsDetailsHash);\r\n }\r\n\r\n function setAssetType(uint256 _deedId, AssetType _assetType) public deedExists(_deedId) onlyOwner(_deedId) {\r\n DeedInfo storage deedInfo = deedInfoMap[_deedId];\r\n deedInfo.assetType = _assetType;\r\n _setAssetValidation(_deedId, false);\r\n emit DeedNFTAssetTypeSet(_deedId, _assetType);\r\n }\r\n\r\n function getDeedInfo(uint256 _deedId) public view deedExists(_deedId) returns (DeedInfo memory) {\r\n return deedInfoMap[_deedId];\r\n }\r\n\r\n function canSubdivide(uint256 _deedId) external view returns (bool) {\r\n AssetType assetType = getDeedInfo(_deedId).assetType;\r\n return assetType == AssetType.Land || assetType == AssetType.Estate;\r\n }\r\n\r\n function supportsInterface(\r\n bytes4 _interfaceId\r\n ) public view virtual override(ERC721, ERC721URIStorage) returns (bool) {\r\n return super.supportsInterface(_interfaceId);\r\n }\r\n\r\n function tokenURI(uint256 _deedId) public view override(ERC721, ERC721URIStorage) returns (string memory) {\r\n return super.tokenURI(_deedId);\r\n }\r\n\r\n function _setAssetValidation(uint256 _deedId, bool _isValid) internal {\r\n DeedInfo storage deedInfo = deedInfoMap[_deedId];\r\n deedInfo.isValidated = _isValid;\r\n emit DeedNFTAssetValidationSet(_deedId, _isValid);\r\n }\r\n}\r\n" - }, - "contracts/FundsManager.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\r\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\r\nimport \"@openzeppelin/contracts/access/AccessControl.sol\";\r\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\r\nimport \"./AccessManager.sol\";\r\n\r\ncontract FundsManager is Context, AccessManagerBase {\r\n event FundsStored(uint256 id, IERC20 token, uint256 amount, address sender, address caller, uint256 newBalance);\r\n event FundsWithdrawn(\r\n uint256 id,\r\n IERC20 token,\r\n uint256 amount,\r\n address destination,\r\n address caller,\r\n uint256 newBalance\r\n );\r\n\r\n // AccountOwner -> AccountId -> TokenAddress -> Amount\r\n mapping(address => mapping(uint256 => mapping(address => uint256))) public accountsMapping;\r\n\r\n constructor(address _accessManager) AccessManagerBase(_accessManager) {}\r\n\r\n /**\r\n * Get the balance of an account\r\n * @param _id AccountId\r\n * @param _token TokenAddress\r\n * @return Balance\r\n */\r\n function balanceOf(uint256 _id, IERC20 _token) external view returns (uint256) {\r\n return accountsMapping[_msgSender()][_id][address(_token)];\r\n }\r\n\r\n /**\r\n * Pull tokens from sender and store them in the contract\r\n * @param _id AccountId\r\n * @param _token TokenAddress\r\n * @param _amount Amount\r\n * @param _sender Witch address to pull tokens from\r\n */\r\n function store(uint256 _id, IERC20 _token, uint256 _amount, address _sender) external {\r\n require(\r\n _token.allowance(_sender, address(this)) >= _amount,\r\n string.concat(\r\n \"[Funds Manager] Not enough allowance for account \",\r\n Strings.toString(_id),\r\n \" and amount \",\r\n Strings.toString(_amount)\r\n )\r\n );\r\n\r\n _token.transferFrom(_sender, address(this), _amount);\r\n accountsMapping[_msgSender()][_id][address(_token)] += _amount;\r\n\r\n emit FundsStored(\r\n _id,\r\n _token,\r\n _amount,\r\n _sender,\r\n _msgSender(),\r\n accountsMapping[_msgSender()][_id][address(_token)]\r\n );\r\n }\r\n\r\n /**\r\n * Withdraw tokens from the contract and send them to the recipient\r\n * @param _id AccountId\r\n * @param _token TokenAddress\r\n * @param _amount Amount\r\n * @param _recipient Witch address to send tokens to\r\n */\r\n function withdraw(uint256 _id, IERC20 _token, uint256 _amount, address _recipient) external {\r\n require(\r\n accountsMapping[_msgSender()][_id][address(_token)] >= _amount,\r\n string.concat(\r\n \"[Funds Manager] Not enough funds for account \",\r\n Strings.toString(_id),\r\n \" and amount \",\r\n Strings.toString(_amount)\r\n )\r\n );\r\n\r\n accountsMapping[_msgSender()][_id][address(_token)] -= _amount;\r\n _token.transfer(_recipient, _amount);\r\n\r\n emit FundsWithdrawn(\r\n _id,\r\n _token,\r\n _amount,\r\n _recipient,\r\n _msgSender(),\r\n accountsMapping[_msgSender()][_id][address(_token)]\r\n );\r\n }\r\n}\r\n" - }, - "contracts/LeaseAgreement.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\n\r\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\r\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\r\nimport \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\r\nimport \"./DeedNFT.sol\"; // Import the IDeedNFT interface\r\nimport \"./LeaseNFT.sol\";\r\nimport \"./SubdivisionNFT.sol\"; // Import the ISubdivisionNFT interface\r\nimport \"./FundsManager.sol\";\r\nimport \"./AccessManager.sol\";\r\n\r\ninterface ILeaseNFT {\r\n function mint(address leaseOwner, uint256 leaseId) external;\r\n\r\n function burn(uint256 leaseId) external;\r\n}\r\n\r\ncontract LeaseAgreement is ReentrancyGuard, AccessManagerBase {\r\n // CONSTANTS\r\n uint256 private constant MONTH = 30.5 days;\r\n uint256 private constant MAX_NB_MONTH_FOR_DEPOSIT = 3;\r\n\r\n struct LeaseDates {\r\n uint256 startDate;\r\n uint256 endDate;\r\n uint256 rentDueDate;\r\n uint256 distributableDate;\r\n }\r\n\r\n struct Deposit {\r\n uint256 amount;\r\n bool paid;\r\n }\r\n\r\n struct Lease {\r\n address[] lesseeList;\r\n uint256 rentAmount;\r\n Deposit securityDeposit;\r\n uint256 latePaymentFee;\r\n uint32 gracePeriod;\r\n LeaseDates dates;\r\n uint256 extensionCount;\r\n uint256 deedId;\r\n address manager;\r\n uint8 managerPercentage;\r\n uint256 unclaimedRentAmount;\r\n bool isArchived;\r\n }\r\n\r\n struct RentPaymentInfo {\r\n uint256 rentAmount;\r\n uint256 totalBalance;\r\n uint32 unpaidMonths;\r\n uint256 rentDueDate;\r\n }\r\n\r\n modifier onlyLessor(uint256 _leaseId) {\r\n require(_msgSender() == leaseNFT.ownerOf(_leaseId), \"[Lease Agreement] Sender must be Lessor\");\r\n _;\r\n }\r\n modifier onlyActive(uint256 _leaseId) {\r\n require(\r\n block.timestamp < leases[_leaseId].dates.endDate && block.timestamp > leases[_leaseId].dates.startDate,\r\n \"[Lease Agreement] The contract has been archived.\"\r\n );\r\n _;\r\n }\r\n mapping(uint256 => Lease) public leases;\r\n uint256 public leaseCounter;\r\n LeaseNFT public leaseNFT;\r\n IERC20 public paymentToken;\r\n DeedNFT public deedNFT;\r\n SubdivisionNFT public subdivisionNFT;\r\n FundsManager public fundsManager;\r\n\r\n event LeaseFundsManagerSet(address fundsManager);\r\n event LeasePaymentTokenSet(address paymentToken);\r\n event LeaseCreated(uint256 leaseId, Lease lease);\r\n event LeaseTerminated(uint256 leaseId);\r\n event LeasePaymentMade(uint256 leaseId, uint256 amount, uint256 unclaimedRentAmount);\r\n event LeaseRentDistributed(uint256 leaseId, uint256 lessorAmount, uint256 managerAmount, uint256 distributableDate);\r\n event LeaseManagerSet(uint256 leaseId, address manager, uint256 percentage);\r\n event LeaseManagerUnset(uint256 leaseId);\r\n event LeaseDueDateChanged(uint256 leaseId, uint256 newDueDate);\r\n event LeaseDepositSubmited(uint256 leaseId, uint256 amount);\r\n event LeaseExtended(uint256 leaseId, uint256 endDate, uint256 rentAmount, uint256 extensionCount);\r\n\r\n constructor(\r\n address _leaseNFT,\r\n address _paymentToken,\r\n address _deedNFT,\r\n address _subdivisionNFT,\r\n address _fundsManager,\r\n address _accessManager\r\n ) AccessManagerBase(_accessManager) {\r\n require(_leaseNFT != address(0), \"[Lease Agreement] Invalid LeaseNFT address\");\r\n require(_paymentToken != address(0), \"[Lease Agreement] Invalid token address\");\r\n require(_deedNFT != address(0), \"[Lease Agreement] Invalid DeedNFT address\");\r\n require(_subdivisionNFT != address(0), \"[Lease Agreement] Invalid SubdivisionNFT address\");\r\n\r\n leaseNFT = LeaseNFT(_leaseNFT);\r\n deedNFT = DeedNFT(_deedNFT);\r\n subdivisionNFT = SubdivisionNFT(_subdivisionNFT);\r\n\r\n paymentToken = IERC20(_paymentToken);\r\n emit LeasePaymentTokenSet(_paymentToken);\r\n\r\n fundsManager = FundsManager(_fundsManager);\r\n emit LeaseFundsManagerSet(_fundsManager);\r\n\r\n leaseCounter = 0;\r\n }\r\n\r\n function setFundsManager(address _fundsManager) public functionRoleOrAdmin(this.setFundsManager.selector) {\r\n fundsManager = FundsManager(_fundsManager);\r\n emit LeaseFundsManagerSet(_fundsManager);\r\n }\r\n\r\n function getLesseeList(uint256 _leaseId) public view returns (address[] memory) {\r\n Lease storage lease = leases[_leaseId];\r\n return lease.lesseeList;\r\n }\r\n\r\n function setPaymentToken(address _paymentToken) public functionRoleOrAdmin(this.setPaymentToken.selector) {\r\n paymentToken = IERC20(_paymentToken);\r\n emit LeasePaymentTokenSet(_paymentToken);\r\n }\r\n\r\n function createLease(\r\n address[] memory _lesseeList,\r\n uint256 _startDate,\r\n uint256 _endDate,\r\n uint256 _rentAmount,\r\n uint256 _securityDepositAmount,\r\n uint256 _deedId,\r\n uint256 _latePaymentFee,\r\n uint32 _gracePeriod\r\n ) external {\r\n require(_startDate < _endDate, \"[Lease Agreement] Invalid start and end dates\");\r\n require(\r\n _endDate - _startDate > 1 * MONTH,\r\n \"[Lease Agreement] End date and start date should be 1 month appart\"\r\n );\r\n require(_gracePeriod >= 3);\r\n require(_latePaymentFee >= 0 && _latePaymentFee <= 15);\r\n bool isDeedOwner = _verifyDeedOwnership(_msgSender(), _deedId);\r\n bool isSubdivisionOwner = _verifySubdivisionOwnership(_msgSender(), _deedId);\r\n require(isDeedOwner || isSubdivisionOwner, \"[Lease Agreement] Lessor must own the property NFT\");\r\n\r\n uint256 leaseId = leaseCounter;\r\n leaseCounter++;\r\n Lease storage lease = leases[leaseId];\r\n lease.lesseeList = _lesseeList;\r\n lease.dates.startDate = _startDate;\r\n lease.dates.endDate = _endDate;\r\n lease.rentAmount = _rentAmount;\r\n lease.securityDeposit.amount = _securityDepositAmount;\r\n lease.dates.rentDueDate = _startDate + 1 * MONTH;\r\n lease.extensionCount = 0;\r\n lease.deedId = _deedId;\r\n lease.securityDeposit.paid = _securityDepositAmount == 0;\r\n lease.latePaymentFee = _latePaymentFee;\r\n lease.gracePeriod = _gracePeriod;\r\n lease.isArchived = false;\r\n leaseNFT.mint(_msgSender(), leaseId);\r\n lease.dates.distributableDate = lease.dates.rentDueDate;\r\n\r\n emit LeaseCreated(leaseId, lease);\r\n }\r\n\r\n function containsAddress(address[] memory _addresses, address _address) internal pure returns (bool) {\r\n bool contains = false;\r\n for (uint i = 0; i < _addresses.length; i++) {\r\n if (_addresses[i] == _address) {\r\n contains = true;\r\n break;\r\n }\r\n }\r\n return contains;\r\n }\r\n\r\n function transferLease(uint256 _leaseId, address[] memory _newLesseeList) public onlyLessor(_leaseId) {\r\n Lease storage lease = leases[_leaseId];\r\n lease.lesseeList = _newLesseeList;\r\n }\r\n\r\n function setManager(uint256 _leaseId, address _manager, uint8 _percentage) public onlyLessor(_leaseId) {\r\n Lease storage lease = leases[_leaseId];\r\n require(_percentage >= 0 && _percentage <= 100, \"[Lease Agreement] Invalid Manager percentage\");\r\n\r\n lease.manager = _manager;\r\n lease.managerPercentage = _percentage;\r\n\r\n emit LeaseManagerSet(_leaseId, _manager, _percentage);\r\n }\r\n\r\n function unsetManager(uint256 _leaseId) external {\r\n Lease storage lease = leases[_leaseId];\r\n require(\r\n _msgSender() == leaseNFT.ownerOf(_leaseId) || _msgSender() == lease.manager,\r\n \"[Lease Agreement] Only the Lessor or the Manager can remove the Manager\"\r\n );\r\n\r\n lease.manager = address(0);\r\n lease.managerPercentage = 0;\r\n\r\n emit LeaseManagerUnset(_leaseId);\r\n }\r\n\r\n function submitDeposit(uint256 _leaseId) external nonReentrant {\r\n Lease storage lease = leases[_leaseId];\r\n require(\r\n containsAddress(lease.lesseeList, _msgSender()),\r\n \"[Lease Agreement] Only the Lessee can submit the deposit\"\r\n );\r\n require(!lease.securityDeposit.paid, \"[Lease Agreement] Security deposit already paid\");\r\n\r\n fundsManager.store(_leaseId, paymentToken, lease.securityDeposit.amount, _msgSender());\r\n lease.securityDeposit.paid = true;\r\n\r\n emit LeaseDepositSubmited(_leaseId, lease.securityDeposit.amount);\r\n }\r\n\r\n function setDueDate(uint256 _leaseId, uint256 _newDueDate) public onlyLessor(_leaseId) {\r\n Lease storage lease = leases[_leaseId];\r\n require(\r\n _newDueDate >= (lease.dates.rentDueDate + 1 * MONTH),\r\n \"[Lease Agreement] New rent due date must be at least a month after current one\"\r\n );\r\n\r\n lease.dates.rentDueDate = _newDueDate;\r\n\r\n emit LeaseDueDateChanged(_leaseId, _newDueDate);\r\n }\r\n\r\n function payRent(uint256 _leaseId) external nonReentrant {\r\n Lease storage lease = leases[_leaseId];\r\n require(containsAddress(lease.lesseeList, _msgSender()), \"[Lease Agreement] Only the Lessee can pay rent\");\r\n require(lease.securityDeposit.paid, \"[Lease Agreement] Security deposit must be paid first\");\r\n require(\r\n block.timestamp >= lease.dates.startDate && block.timestamp <= lease.dates.endDate,\r\n \"[Lease Agreement] Outside of lease duration\"\r\n );\r\n\r\n RentPaymentInfo memory rentInfo = calculateRentPaymentInfo(_leaseId);\r\n lease.unclaimedRentAmount += rentInfo.totalBalance;\r\n lease.dates.rentDueDate += (rentInfo.unpaidMonths) * (1 * MONTH);\r\n fundsManager.store(_leaseId, paymentToken, rentInfo.totalBalance, _msgSender());\r\n\r\n emit LeaseDueDateChanged(_leaseId, lease.dates.rentDueDate);\r\n emit LeasePaymentMade(_leaseId, rentInfo.totalBalance, lease.unclaimedRentAmount);\r\n }\r\n\r\n function distributeRent(uint256 _leaseId) external nonReentrant {\r\n Lease storage lease = leases[_leaseId];\r\n require(\r\n _msgSender() == leaseNFT.ownerOf(_leaseId) || _msgSender() == lease.manager,\r\n \"[Lease Agreement] Caller must be the Lessor or the Manager\"\r\n );\r\n require(lease.unclaimedRentAmount > 0, \"[Lease Agreement] No rent to distribute\");\r\n uint256 nbMonthSinceLastDistribute = 0;\r\n require(\r\n block.timestamp > lease.dates.distributableDate,\r\n \"[Lease Agreement] Rent can only be distributed past the distributable date\"\r\n );\r\n\r\n nbMonthSinceLastDistribute = (block.timestamp - lease.dates.distributableDate) / (1 * MONTH) + 1;\r\n uint256 totalToClaim = lease.unclaimedRentAmount;\r\n uint256 managerAmount = 0;\r\n\r\n if (lease.manager != address(0)) {\r\n managerAmount = (totalToClaim * lease.managerPercentage) / 100;\r\n fundsManager.withdraw(_leaseId, paymentToken, uint32(managerAmount), lease.manager);\r\n }\r\n\r\n uint256 lessorAmount = totalToClaim - managerAmount;\r\n fundsManager.withdraw(_leaseId, paymentToken, uint32(lessorAmount), leaseNFT.ownerOf(_leaseId));\r\n lease.unclaimedRentAmount = 0;\r\n lease.dates.distributableDate += nbMonthSinceLastDistribute * (1 * MONTH);\r\n\r\n emit LeaseRentDistributed(_leaseId, uint32(lessorAmount), uint32(managerAmount), lease.dates.distributableDate);\r\n }\r\n\r\n function extendLease(uint256 _leaseId, uint256 _extensionPeriod) external onlyLessor(_leaseId) {\r\n Lease storage lease = leases[_leaseId];\r\n require(!lease.isArchived, \"[Lease Agreement] Lease has been archived\");\r\n require(\r\n block.timestamp >= lease.dates.endDate - 45 days, // TODO: Configurable\r\n \"[Lease Agreement] Extension can only be requested in the last 45 days\"\r\n );\r\n require(lease.extensionCount < 2, \"[Lease Agreement] Maximum extensions reached\");\r\n lease.dates.endDate += _extensionPeriod;\r\n lease.rentAmount += (lease.rentAmount * 3) / 100;\r\n lease.extensionCount++;\r\n\r\n emit LeaseExtended(_leaseId, lease.dates.endDate, lease.rentAmount, lease.extensionCount);\r\n }\r\n\r\n function withdrawDeposit(uint256 _leaseId) external nonReentrant {\r\n Lease storage lease = leases[_leaseId];\r\n require(\r\n lease.isArchived || block.timestamp > lease.dates.endDate,\r\n \"[Lease Agreement] Cannot withdraw deposit if Lease still active\"\r\n );\r\n require(containsAddress(lease.lesseeList, _msgSender()), \"[Lease Agreement] Caller must be one of the lessees\");\r\n RentPaymentInfo memory rentInfo = calculateRentPaymentInfo(_leaseId);\r\n bool shouldSendDepositToLessor = (rentInfo.unpaidMonths >= MAX_NB_MONTH_FOR_DEPOSIT);\r\n // Send security deposit to the sender of the lessee list\r\n if (!shouldSendDepositToLessor) {\r\n fundsManager.withdraw(_leaseId, paymentToken, lease.securityDeposit.amount, _msgSender());\r\n }\r\n lease.isArchived = true;\r\n }\r\n\r\n function burnLease(uint256 _leaseId) public {\r\n Lease storage lease = leases[_leaseId];\r\n require(\r\n _msgSender() == leaseNFT.ownerOf(_leaseId) || _msgSender() == lease.manager,\r\n \"[Lease Agreement] Sender must be manager or lessor\"\r\n );\r\n require(lease.isArchived, \"[Lease Agreement] Lease has been archived\");\r\n leaseNFT.burn(_leaseId);\r\n }\r\n\r\n function terminateLease(uint256 _leaseId) external nonReentrant onlyLessor(_leaseId) {\r\n Lease storage lease = leases[_leaseId];\r\n require(block.timestamp >= lease.dates.startDate, \"[Lease Agreement] Lease has not started yet\");\r\n RentPaymentInfo memory rentInfo = calculateRentPaymentInfo(_leaseId);\r\n bool shouldSendDepositToLessor = (rentInfo.unpaidMonths >= MAX_NB_MONTH_FOR_DEPOSIT);\r\n\r\n // Send security deposit to the lessor if needed\r\n if (shouldSendDepositToLessor) {\r\n fundsManager.withdraw(_leaseId, paymentToken, lease.securityDeposit.amount, leaseNFT.ownerOf(_leaseId));\r\n }\r\n lease.isArchived = true;\r\n emit LeaseTerminated(_leaseId);\r\n }\r\n\r\n function calculateRentPaymentInfo(uint256 _leaseId) public view returns (RentPaymentInfo memory rentInfo) {\r\n Lease storage lease = leases[_leaseId];\r\n rentInfo.rentAmount = lease.rentAmount;\r\n // sidenote: rent due date is incremented by 1 month each time the rent is paid.(function payRent)\r\n if (block.timestamp > lease.dates.rentDueDate + (lease.gracePeriod * 1 days)) {\r\n // Function to calculate rentAmountIncrease increase\r\n rentInfo.rentAmount += (lease.rentAmount * lease.latePaymentFee) / 100;\r\n rentInfo.unpaidMonths = uint32((block.timestamp - lease.dates.rentDueDate) / (1 * MONTH) + 1);\r\n rentInfo.totalBalance = (rentInfo.unpaidMonths) * rentInfo.rentAmount;\r\n } else {\r\n rentInfo.unpaidMonths = 1;\r\n rentInfo.totalBalance = rentInfo.rentAmount;\r\n }\r\n return rentInfo;\r\n }\r\n\r\n function _verifySubdivisionOwnership(address _owner, uint256 _subdivisionId) internal view returns (bool) {\r\n return subdivisionNFT.isOwnerOfSubdivision(_owner, _subdivisionId);\r\n }\r\n\r\n function _verifyDeedOwnership(address _owner, uint256 _deedId) internal view returns (bool) {\r\n try deedNFT.ownerOf(_deedId) returns (address owner) {\r\n return owner == _owner;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n" - }, - "contracts/LeaseNFT.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\n\r\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\r\nimport \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\r\nimport \"@openzeppelin/contracts/utils/Address.sol\";\r\nimport \"@openzeppelin/contracts/utils/math/Math.sol\";\r\nimport \"@openzeppelin/contracts/utils/introspection/ERC165.sol\";\r\nimport \"./AccessManager.sol\";\r\n\r\ncontract LeaseNFT is ERC721, AccessManagerBase {\r\n address private leaseAgreementAddress;\r\n\r\n event LeaseNFTMinted(address leaseOwner, uint256 leaseId, address minter);\r\n event LeaseNFTBurned(uint256 leaseId, address burner);\r\n event LeaseNFTAgreementSet(uint256 leaseId, address burner);\r\n\r\n constructor(address _accessManager) ERC721(\"LeaseNFT\", \"LEASE\") AccessManagerBase(_accessManager) {}\r\n\r\n function setLeaseAgreementAddress(address _leaseAgreementAddress) external onlyAdmin {\r\n leaseAgreementAddress = _leaseAgreementAddress;\r\n }\r\n\r\n function mint(address _to, uint256 _leaseId) external {\r\n require(\r\n hasAdminRole() || _msgSender() == leaseAgreementAddress,\r\n \"[LeaseNFT] Only LeaseAgreement contract can mint the lease\"\r\n );\r\n _mint(_to, _leaseId);\r\n emit LeaseNFTMinted(_to, _leaseId, _msgSender());\r\n }\r\n\r\n function exists(uint256 _leaseId) public view returns (bool) {\r\n return _ownerOf(_leaseId) != address(0);\r\n }\r\n\r\n function burn(uint256 _leaseId) external {\r\n require(\r\n hasAdminRole() || _msgSender() == leaseAgreementAddress,\r\n \"[LeaseNFT] Only LeaseAgreement can burn the lease\"\r\n );\r\n _burn(_leaseId);\r\n emit LeaseNFTBurned(_leaseId, _msgSender());\r\n }\r\n}\r\n" - }, - "contracts/Mocks/TokenMock.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\n\r\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\r\n\r\n// Example class - a mock class using delivering from ERC20\r\ncontract TokenMock is ERC20 {\r\n constructor(string memory name, string memory symbol) payable ERC20(name, symbol) {}\r\n\r\n function mint(address owner, uint256 initialBalance) external {\r\n _mint(owner, initialBalance);\r\n }\r\n}\r\n" - }, - "contracts/SubdivisionNFT.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\nimport \"@openzeppelin/contracts/token/ERC1155/ERC1155.sol\";\r\nimport \"@openzeppelin/contracts/access/AccessControl.sol\";\r\nimport \"./DeedNFT.sol\";\r\nimport \"./AccessManager.sol\";\r\n\r\ncontract SubdivisionNFT is ERC1155, AccessManagerBase {\r\n struct SubdivisionInfo {\r\n bytes ipfsDetailsHash;\r\n address owner;\r\n uint256 parentDeed;\r\n }\r\n\r\n uint256 private _nextsubTokenID;\r\n mapping(uint256 => SubdivisionInfo) private subdivisionInfoMap;\r\n\r\n bytes32 public constant MINTER_ROLE = keccak256(\"MINTER_ROLE\");\r\n DeedNFT public deedNFT;\r\n\r\n event SubdivisionMinted(\r\n address subdivisionOwner,\r\n uint256 subdivisionId,\r\n uint256 deedId,\r\n bytes ipfsDetailsHash,\r\n address minter\r\n );\r\n event SubdivisionBurned(address account, uint256 subdivisionId, uint256 deedId, bytes ipfsDetailsHash);\r\n event SubdivisionInfoSet(uint256 tokenId, SubdivisionInfo info);\r\n\r\n constructor(address _deedNFT, address _accessManager) ERC1155(\"\") AccessManagerBase(_accessManager) {\r\n require(_deedNFT != address(0), \"[SubdivisionNFT] Invalid DeedNFT address\");\r\n\r\n _nextsubTokenID = 1;\r\n deedNFT = DeedNFT(_deedNFT);\r\n }\r\n\r\n function mintSubdivision(SubdivisionInfo memory _info) public {\r\n require(\r\n _msgSender() == deedNFT.ownerOf(_info.parentDeed),\r\n \"[SubdivisionNFT] Sender must be the owner of the parent deed\"\r\n );\r\n require(deedNFT.canSubdivide(_info.parentDeed), \"[SubdivisionNFT] Parent deed must be land or estate\");\r\n\r\n _mint(_info.owner, _nextsubTokenID, 1, _info.ipfsDetailsHash);\r\n SubdivisionInfo storage subInfo = subdivisionInfoMap[_nextsubTokenID];\r\n subInfo.ipfsDetailsHash = _info.ipfsDetailsHash;\r\n subInfo.owner = _info.owner;\r\n subInfo.parentDeed = _info.parentDeed;\r\n\r\n emit SubdivisionMinted(_info.owner, _nextsubTokenID, _info.parentDeed, _info.ipfsDetailsHash, _msgSender());\r\n _nextsubTokenID = _nextsubTokenID + 1;\r\n }\r\n\r\n function batchMint(SubdivisionInfo[] memory _infos) public {\r\n for (uint i = 0; i < _infos.length; i++) {\r\n mintSubdivision(_infos[i]);\r\n }\r\n }\r\n\r\n function setInfo(uint256 _subTokenId, SubdivisionInfo memory _newInfo) public virtual {\r\n require(\r\n isOwnerOfSubdivision(_msgSender(), _subTokenId) == true,\r\n \"[SubdivisionNFT] Sender Must be owner of subdivision to set info\"\r\n );\r\n\r\n subdivisionInfoMap[_subTokenId] = _newInfo;\r\n\r\n emit SubdivisionInfoSet(_subTokenId, _newInfo);\r\n }\r\n\r\n function burnSubdivision(uint256 _subTokenId) public {\r\n require(\r\n isOwnerOfSubdivision(_msgSender(), _subTokenId) == true,\r\n \"[SubdivisionNFT] Sender must be owner of the subdivision to burn it\"\r\n );\r\n\r\n _burn(_msgSender(), _subTokenId, 1);\r\n\r\n emit SubdivisionBurned(\r\n _msgSender(),\r\n _subTokenId,\r\n subdivisionInfoMap[_subTokenId].parentDeed,\r\n subdivisionInfoMap[_subTokenId].ipfsDetailsHash\r\n );\r\n }\r\n\r\n function getParentDeed(uint256 _subTokenId) public view returns (uint256) {\r\n SubdivisionInfo storage info = subdivisionInfoMap[_subTokenId];\r\n return info.parentDeed;\r\n }\r\n\r\n function isOwnerOfSubdivision(address _owner, uint256 _subTokenId) public view returns (bool) {\r\n return balanceOf(_owner, _subTokenId) > 0;\r\n }\r\n\r\n function supportsInterface(bytes4 _interfaceId) public view virtual override(ERC1155) returns (bool) {\r\n return super.supportsInterface(_interfaceId);\r\n }\r\n}\r\n" - } - }, - "settings": { - "optimizer": { - "enabled": true, - "runs": 200 - }, - "evmVersion": "paris", - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - } - } -} \ No newline at end of file diff --git a/packages/hardhat/deployments/sepolia/solcInputs/c539a49b1aefee233566f7faf33b52cb.json b/packages/hardhat/deployments/sepolia/solcInputs/c539a49b1aefee233566f7faf33b52cb.json deleted file mode 100644 index adbd09aa..00000000 --- a/packages/hardhat/deployments/sepolia/solcInputs/c539a49b1aefee233566f7faf33b52cb.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "@openzeppelin/contracts/access/AccessControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAccessControl} from \"./IAccessControl.sol\";\nimport {Context} from \"../utils/Context.sol\";\nimport {ERC165} from \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address account => bool) hasRole;\n bytes32 adminRole;\n }\n\n mapping(bytes32 role => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with an {AccessControlUnauthorizedAccount} error including the required role.\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual returns (bool) {\n return _roles[role].hasRole[account];\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\n * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\n * is missing `role`.\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert AccessControlUnauthorizedAccount(account, role);\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address callerConfirmation) public virtual {\n if (callerConfirmation != _msgSender()) {\n revert AccessControlBadConfirmation();\n }\n\n _revokeRole(role, callerConfirmation);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\n if (!hasRole(role, account)) {\n _roles[role].hasRole[account] = true;\n emit RoleGranted(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\n if (hasRole(role, account)) {\n _roles[role].hasRole[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n return true;\n } else {\n return false;\n }\n }\n}\n" - }, - "@openzeppelin/contracts/access/IAccessControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev The `account` is missing a role.\n */\n error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\n\n /**\n * @dev The caller of a function is not the expected one.\n *\n * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\n */\n error AccessControlBadConfirmation();\n\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `callerConfirmation`.\n */\n function renounceRole(bytes32 role, address callerConfirmation) external;\n}\n" - }, - "@openzeppelin/contracts/interfaces/draft-IERC6093.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.\n */\ninterface IERC20Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC20InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC20InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC20InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.\n */\ninterface IERC721Errors {\n /**\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.\n * Used in balance queries.\n * @param owner Address of the current owner of a token.\n */\n error ERC721InvalidOwner(address owner);\n\n /**\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\n * @param tokenId Identifier number of a token.\n */\n error ERC721NonexistentToken(uint256 tokenId);\n\n /**\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param tokenId Identifier number of a token.\n * @param owner Address of the current owner of a token.\n */\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC721InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC721InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param tokenId Identifier number of a token.\n */\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC721InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.\n */\ninterface IERC1155Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n * @param tokenId Identifier number of a token.\n */\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC1155InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC1155InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param owner Address of the current owner of a token.\n */\n error ERC1155MissingApprovalForAll(address operator, address owner);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC1155InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC1155InvalidOperator(address operator);\n\n /**\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n * Used in batch transfers.\n * @param idsLength Length of the array of token identifiers\n * @param valuesLength Length of the array of token amounts\n */\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n" - }, - "@openzeppelin/contracts/interfaces/IERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n" - }, - "@openzeppelin/contracts/interfaces/IERC4906.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4906.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\nimport {IERC721} from \"./IERC721.sol\";\n\n/// @title EIP-721 Metadata Update Extension\ninterface IERC4906 is IERC165, IERC721 {\n /// @dev This event emits when the metadata of a token is changed.\n /// So that the third-party platforms such as NFT market could\n /// timely update the images and related attributes of the NFT.\n event MetadataUpdate(uint256 _tokenId);\n\n /// @dev This event emits when the metadata of a range of tokens is changed.\n /// So that the third-party platforms such as NFT market could\n /// timely update the images and related attributes of the NFTs.\n event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);\n}\n" - }, - "@openzeppelin/contracts/interfaces/IERC721.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC721} from \"../token/ERC721/IERC721.sol\";\n" - }, - "@openzeppelin/contracts/token/ERC1155/ERC1155.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/ERC1155.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC1155} from \"./IERC1155.sol\";\nimport {IERC1155Receiver} from \"./IERC1155Receiver.sol\";\nimport {IERC1155MetadataURI} from \"./extensions/IERC1155MetadataURI.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC165, ERC165} from \"../../utils/introspection/ERC165.sol\";\nimport {Arrays} from \"../../utils/Arrays.sol\";\nimport {IERC1155Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the basic standard multi-token.\n * See https://eips.ethereum.org/EIPS/eip-1155\n * Originally based on code by Enjin: https://github.com/enjin/erc-1155\n */\nabstract contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI, IERC1155Errors {\n using Arrays for uint256[];\n using Arrays for address[];\n\n mapping(uint256 id => mapping(address account => uint256)) private _balances;\n\n mapping(address account => mapping(address operator => bool)) private _operatorApprovals;\n\n // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json\n string private _uri;\n\n /**\n * @dev See {_setURI}.\n */\n constructor(string memory uri_) {\n _setURI(uri_);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC1155).interfaceId ||\n interfaceId == type(IERC1155MetadataURI).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC1155MetadataURI-uri}.\n *\n * This implementation returns the same URI for *all* token types. It relies\n * on the token type ID substitution mechanism\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\n *\n * Clients calling this function must replace the `\\{id\\}` substring with the\n * actual token type ID.\n */\n function uri(uint256 /* id */) public view virtual returns (string memory) {\n return _uri;\n }\n\n /**\n * @dev See {IERC1155-balanceOf}.\n */\n function balanceOf(address account, uint256 id) public view virtual returns (uint256) {\n return _balances[id][account];\n }\n\n /**\n * @dev See {IERC1155-balanceOfBatch}.\n *\n * Requirements:\n *\n * - `accounts` and `ids` must have the same length.\n */\n function balanceOfBatch(\n address[] memory accounts,\n uint256[] memory ids\n ) public view virtual returns (uint256[] memory) {\n if (accounts.length != ids.length) {\n revert ERC1155InvalidArrayLength(ids.length, accounts.length);\n }\n\n uint256[] memory batchBalances = new uint256[](accounts.length);\n\n for (uint256 i = 0; i < accounts.length; ++i) {\n batchBalances[i] = balanceOf(accounts.unsafeMemoryAccess(i), ids.unsafeMemoryAccess(i));\n }\n\n return batchBalances;\n }\n\n /**\n * @dev See {IERC1155-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC1155-isApprovedForAll}.\n */\n function isApprovedForAll(address account, address operator) public view virtual returns (bool) {\n return _operatorApprovals[account][operator];\n }\n\n /**\n * @dev See {IERC1155-safeTransferFrom}.\n */\n function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes memory data) public virtual {\n address sender = _msgSender();\n if (from != sender && !isApprovedForAll(from, sender)) {\n revert ERC1155MissingApprovalForAll(sender, from);\n }\n _safeTransferFrom(from, to, id, value, data);\n }\n\n /**\n * @dev See {IERC1155-safeBatchTransferFrom}.\n */\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory values,\n bytes memory data\n ) public virtual {\n address sender = _msgSender();\n if (from != sender && !isApprovedForAll(from, sender)) {\n revert ERC1155MissingApprovalForAll(sender, from);\n }\n _safeBatchTransferFrom(from, to, ids, values, data);\n }\n\n /**\n * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`. Will mint (or burn) if `from`\n * (or `to`) is the zero address.\n *\n * Emits a {TransferSingle} event if the arrays contain one element, and {TransferBatch} otherwise.\n *\n * Requirements:\n *\n * - If `to` refers to a smart contract, it must implement either {IERC1155Receiver-onERC1155Received}\n * or {IERC1155Receiver-onERC1155BatchReceived} and return the acceptance magic value.\n * - `ids` and `values` must have the same length.\n *\n * NOTE: The ERC-1155 acceptance check is not performed in this function. See {_updateWithAcceptanceCheck} instead.\n */\n function _update(address from, address to, uint256[] memory ids, uint256[] memory values) internal virtual {\n if (ids.length != values.length) {\n revert ERC1155InvalidArrayLength(ids.length, values.length);\n }\n\n address operator = _msgSender();\n\n for (uint256 i = 0; i < ids.length; ++i) {\n uint256 id = ids.unsafeMemoryAccess(i);\n uint256 value = values.unsafeMemoryAccess(i);\n\n if (from != address(0)) {\n uint256 fromBalance = _balances[id][from];\n if (fromBalance < value) {\n revert ERC1155InsufficientBalance(from, fromBalance, value, id);\n }\n unchecked {\n // Overflow not possible: value <= fromBalance\n _balances[id][from] = fromBalance - value;\n }\n }\n\n if (to != address(0)) {\n _balances[id][to] += value;\n }\n }\n\n if (ids.length == 1) {\n uint256 id = ids.unsafeMemoryAccess(0);\n uint256 value = values.unsafeMemoryAccess(0);\n emit TransferSingle(operator, from, to, id, value);\n } else {\n emit TransferBatch(operator, from, to, ids, values);\n }\n }\n\n /**\n * @dev Version of {_update} that performs the token acceptance check by calling\n * {IERC1155Receiver-onERC1155Received} or {IERC1155Receiver-onERC1155BatchReceived} on the receiver address if it\n * contains code (eg. is a smart contract at the moment of execution).\n *\n * IMPORTANT: Overriding this function is discouraged because it poses a reentrancy risk from the receiver. So any\n * update to the contract state after this function would break the check-effect-interaction pattern. Consider\n * overriding {_update} instead.\n */\n function _updateWithAcceptanceCheck(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory values,\n bytes memory data\n ) internal virtual {\n _update(from, to, ids, values);\n if (to != address(0)) {\n address operator = _msgSender();\n if (ids.length == 1) {\n uint256 id = ids.unsafeMemoryAccess(0);\n uint256 value = values.unsafeMemoryAccess(0);\n _doSafeTransferAcceptanceCheck(operator, from, to, id, value, data);\n } else {\n _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, values, data);\n }\n }\n }\n\n /**\n * @dev Transfers a `value` tokens of token type `id` from `from` to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `from` must have a balance of tokens of type `id` of at least `value` amount.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function _safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes memory data) internal {\n if (to == address(0)) {\n revert ERC1155InvalidReceiver(address(0));\n }\n if (from == address(0)) {\n revert ERC1155InvalidSender(address(0));\n }\n (uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);\n _updateWithAcceptanceCheck(from, to, ids, values, data);\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n * - `ids` and `values` must have the same length.\n */\n function _safeBatchTransferFrom(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory values,\n bytes memory data\n ) internal {\n if (to == address(0)) {\n revert ERC1155InvalidReceiver(address(0));\n }\n if (from == address(0)) {\n revert ERC1155InvalidSender(address(0));\n }\n _updateWithAcceptanceCheck(from, to, ids, values, data);\n }\n\n /**\n * @dev Sets a new URI for all token types, by relying on the token type ID\n * substitution mechanism\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\n *\n * By this mechanism, any occurrence of the `\\{id\\}` substring in either the\n * URI or any of the values in the JSON file at said URI will be replaced by\n * clients with the token type ID.\n *\n * For example, the `https://token-cdn-domain/\\{id\\}.json` URI would be\n * interpreted by clients as\n * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`\n * for token type ID 0x4cce0.\n *\n * See {uri}.\n *\n * Because these URIs cannot be meaningfully represented by the {URI} event,\n * this function emits no events.\n */\n function _setURI(string memory newuri) internal virtual {\n _uri = newuri;\n }\n\n /**\n * @dev Creates a `value` amount of tokens of type `id`, and assigns them to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function _mint(address to, uint256 id, uint256 value, bytes memory data) internal {\n if (to == address(0)) {\n revert ERC1155InvalidReceiver(address(0));\n }\n (uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);\n _updateWithAcceptanceCheck(address(0), to, ids, values, data);\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `values` must have the same length.\n * - `to` cannot be the zero address.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function _mintBatch(address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\n if (to == address(0)) {\n revert ERC1155InvalidReceiver(address(0));\n }\n _updateWithAcceptanceCheck(address(0), to, ids, values, data);\n }\n\n /**\n * @dev Destroys a `value` amount of tokens of type `id` from `from`\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `from` must have at least `value` amount of tokens of type `id`.\n */\n function _burn(address from, uint256 id, uint256 value) internal {\n if (from == address(0)) {\n revert ERC1155InvalidSender(address(0));\n }\n (uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);\n _updateWithAcceptanceCheck(from, address(0), ids, values, \"\");\n }\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `from` must have at least `value` amount of tokens of type `id`.\n * - `ids` and `values` must have the same length.\n */\n function _burnBatch(address from, uint256[] memory ids, uint256[] memory values) internal {\n if (from == address(0)) {\n revert ERC1155InvalidSender(address(0));\n }\n _updateWithAcceptanceCheck(from, address(0), ids, values, \"\");\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n *\n * Requirements:\n *\n * - `operator` cannot be the zero address.\n */\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\n if (operator == address(0)) {\n revert ERC1155InvalidOperator(address(0));\n }\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Performs an acceptance check by calling {IERC1155-onERC1155Received} on the `to` address\n * if it contains code at the moment of execution.\n */\n function _doSafeTransferAcceptanceCheck(\n address operator,\n address from,\n address to,\n uint256 id,\n uint256 value,\n bytes memory data\n ) private {\n if (to.code.length > 0) {\n try IERC1155Receiver(to).onERC1155Received(operator, from, id, value, data) returns (bytes4 response) {\n if (response != IERC1155Receiver.onERC1155Received.selector) {\n // Tokens rejected\n revert ERC1155InvalidReceiver(to);\n }\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n // non-ERC1155Receiver implementer\n revert ERC1155InvalidReceiver(to);\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n }\n }\n\n /**\n * @dev Performs a batch acceptance check by calling {IERC1155-onERC1155BatchReceived} on the `to` address\n * if it contains code at the moment of execution.\n */\n function _doSafeBatchTransferAcceptanceCheck(\n address operator,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory values,\n bytes memory data\n ) private {\n if (to.code.length > 0) {\n try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, values, data) returns (\n bytes4 response\n ) {\n if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {\n // Tokens rejected\n revert ERC1155InvalidReceiver(to);\n }\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n // non-ERC1155Receiver implementer\n revert ERC1155InvalidReceiver(to);\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n }\n }\n\n /**\n * @dev Creates an array in memory with only one value for each of the elements provided.\n */\n function _asSingletonArrays(\n uint256 element1,\n uint256 element2\n ) private pure returns (uint256[] memory array1, uint256[] memory array2) {\n /// @solidity memory-safe-assembly\n assembly {\n // Load the free memory pointer\n array1 := mload(0x40)\n // Set array length to 1\n mstore(array1, 1)\n // Store the single element at the next word after the length (where content starts)\n mstore(add(array1, 0x20), element1)\n\n // Repeat for next array locating it right after the first array\n array2 := add(array1, 0x40)\n mstore(array2, 1)\n mstore(add(array2, 0x20), element2)\n\n // Update the free memory pointer by pointing after the second array\n mstore(0x40, add(array2, 0x40))\n }\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/extensions/IERC1155MetadataURI.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC1155} from \"../IERC1155.sol\";\n\n/**\n * @dev Interface of the optional ERC1155MetadataExtension interface, as defined\n * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].\n */\ninterface IERC1155MetadataURI is IERC1155 {\n /**\n * @dev Returns the URI for token type `id`.\n *\n * If the `\\{id\\}` substring is present in the URI, it must be replaced by\n * clients with the actual token type ID.\n */\n function uri(uint256 id) external view returns (string memory);\n}\n" - }, - "@openzeppelin/contracts/token/ERC1155/IERC1155.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\n */\ninterface IERC1155 is IERC165 {\n /**\n * @dev Emitted when `value` amount of tokens of type `id` are transferred from `from` to `to` by `operator`.\n */\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\n\n /**\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\n * transfers.\n */\n event TransferBatch(\n address indexed operator,\n address indexed from,\n address indexed to,\n uint256[] ids,\n uint256[] values\n );\n\n /**\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\n * `approved`.\n */\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\n\n /**\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\n *\n * If an {URI} event was emitted for `id`, the standard\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\n * returned by {IERC1155MetadataURI-uri}.\n */\n event URI(string value, uint256 indexed id);\n\n /**\n * @dev Returns the value of tokens of token type `id` owned by `account`.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function balanceOf(address account, uint256 id) external view returns (uint256);\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\n *\n * Requirements:\n *\n * - `accounts` and `ids` must have the same length.\n */\n function balanceOfBatch(\n address[] calldata accounts,\n uint256[] calldata ids\n ) external view returns (uint256[] memory);\n\n /**\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\n *\n * Emits an {ApprovalForAll} event.\n *\n * Requirements:\n *\n * - `operator` cannot be the caller.\n */\n function setApprovalForAll(address operator, bool approved) external;\n\n /**\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\n *\n * See {setApprovalForAll}.\n */\n function isApprovedForAll(address account, address operator) external view returns (bool);\n\n /**\n * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`.\n *\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\n * to an untrusted contract, when invoking {onERC1155Received} on the receiver.\n * Ensure to follow the checks-effects-interactions pattern and consider employing\n * reentrancy guards when interacting with untrusted contracts.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\n * - `from` must have a balance of tokens of type `id` of at least `value` amount.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\n *\n *\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\n * to an untrusted contract, when invoking {onERC1155BatchReceived} on the receiver.\n * Ensure to follow the checks-effects-interactions pattern and consider employing\n * reentrancy guards when interacting with untrusted contracts.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `values` must have the same length.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external;\n}\n" - }, - "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Interface that must be implemented by smart contracts in order to receive\n * ERC-1155 token transfers.\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * ==== Security Considerations\n *\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\n * generally recommended is:\n *\n * ```solidity\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\n * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\n * doThing(..., value);\n * }\n *\n * function doThing(..., uint256 value) public {\n * token.safeTransferFrom(msg.sender, address(this), value);\n * ...\n * }\n * ```\n *\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\n * {SafeERC20-safeTransferFrom}).\n *\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\n * contracts should have entry points that don't rely on permit.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n *\n * CAUTION: See Security Considerations above.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/IERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC20Permit} from \"../extensions/IERC20Permit.sol\";\nimport {Address} from \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n /**\n * @dev An operation with an ERC20 token failed.\n */\n error SafeERC20FailedOperation(address token);\n\n /**\n * @dev Indicates a failed `decreaseAllowance` request.\n */\n error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n forceApprove(token, spender, oldAllowance + value);\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n * value, non-reverting calls are assumed to be successful.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n unchecked {\n uint256 currentAllowance = token.allowance(address(this), spender);\n if (currentAllowance < requestedDecrease) {\n revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n }\n forceApprove(token, spender, currentAllowance - requestedDecrease);\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n * to be set to zero before setting it to a non-zero value, such as USDT.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data);\n if (returndata.length != 0 && !abi.decode(returndata, (bool))) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n // and not revert is the subcall reverts.\n\n (bool success, bytes memory returndata) = address(token).call(data);\n return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/ERC721.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC721} from \"./IERC721.sol\";\nimport {IERC721Receiver} from \"./IERC721Receiver.sol\";\nimport {IERC721Metadata} from \"./extensions/IERC721Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {Strings} from \"../../utils/Strings.sol\";\nimport {IERC165, ERC165} from \"../../utils/introspection/ERC165.sol\";\nimport {IERC721Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\nabstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors {\n using Strings for uint256;\n\n // Token name\n string private _name;\n\n // Token symbol\n string private _symbol;\n\n mapping(uint256 tokenId => address) private _owners;\n\n mapping(address owner => uint256) private _balances;\n\n mapping(uint256 tokenId => address) private _tokenApprovals;\n\n mapping(address owner => mapping(address operator => bool)) private _operatorApprovals;\n\n /**\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC721).interfaceId ||\n interfaceId == type(IERC721Metadata).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721-balanceOf}.\n */\n function balanceOf(address owner) public view virtual returns (uint256) {\n if (owner == address(0)) {\n revert ERC721InvalidOwner(address(0));\n }\n return _balances[owner];\n }\n\n /**\n * @dev See {IERC721-ownerOf}.\n */\n function ownerOf(uint256 tokenId) public view virtual returns (address) {\n return _requireOwned(tokenId);\n }\n\n /**\n * @dev See {IERC721Metadata-name}.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IERC721Metadata-symbol}.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId) public view virtual returns (string memory) {\n _requireOwned(tokenId);\n\n string memory baseURI = _baseURI();\n return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : \"\";\n }\n\n /**\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n * by default, can be overridden in child contracts.\n */\n function _baseURI() internal view virtual returns (string memory) {\n return \"\";\n }\n\n /**\n * @dev See {IERC721-approve}.\n */\n function approve(address to, uint256 tokenId) public virtual {\n _approve(to, tokenId, _msgSender());\n }\n\n /**\n * @dev See {IERC721-getApproved}.\n */\n function getApproved(uint256 tokenId) public view virtual returns (address) {\n _requireOwned(tokenId);\n\n return _getApproved(tokenId);\n }\n\n /**\n * @dev See {IERC721-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC721-isApprovedForAll}.\n */\n function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {\n return _operatorApprovals[owner][operator];\n }\n\n /**\n * @dev See {IERC721-transferFrom}.\n */\n function transferFrom(address from, address to, uint256 tokenId) public virtual {\n if (to == address(0)) {\n revert ERC721InvalidReceiver(address(0));\n }\n // Setting an \"auth\" arguments enables the `_isAuthorized` check which verifies that the token exists\n // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.\n address previousOwner = _update(to, tokenId, _msgSender());\n if (previousOwner != from) {\n revert ERC721IncorrectOwner(from, tokenId, previousOwner);\n }\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId) public {\n safeTransferFrom(from, to, tokenId, \"\");\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {\n transferFrom(from, to, tokenId);\n _checkOnERC721Received(from, to, tokenId, data);\n }\n\n /**\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n *\n * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the\n * core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances\n * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by\n * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.\n */\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n return _owners[tokenId];\n }\n\n /**\n * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.\n */\n function _getApproved(uint256 tokenId) internal view virtual returns (address) {\n return _tokenApprovals[tokenId];\n }\n\n /**\n * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in\n * particular (ignoring whether it is owned by `owner`).\n *\n * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\n * assumption.\n */\n function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {\n return\n spender != address(0) &&\n (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);\n }\n\n /**\n * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.\n * Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets\n * the `spender` for the specific `tokenId`.\n *\n * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\n * assumption.\n */\n function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {\n if (!_isAuthorized(owner, spender, tokenId)) {\n if (owner == address(0)) {\n revert ERC721NonexistentToken(tokenId);\n } else {\n revert ERC721InsufficientApproval(spender, tokenId);\n }\n }\n }\n\n /**\n * @dev Unsafe write access to the balances, used by extensions that \"mint\" tokens using an {ownerOf} override.\n *\n * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that\n * a uint256 would ever overflow from increments when these increments are bounded to uint128 values.\n *\n * WARNING: Increasing an account's balance using this function tends to be paired with an override of the\n * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership\n * remain consistent with one another.\n */\n function _increaseBalance(address account, uint128 value) internal virtual {\n unchecked {\n _balances[account] += value;\n }\n }\n\n /**\n * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner\n * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.\n *\n * The `auth` argument is optional. If the value passed is non 0, then this function will check that\n * `auth` is either the owner of the token, or approved to operate on the token (by the owner).\n *\n * Emits a {Transfer} event.\n *\n * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.\n */\n function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {\n address from = _ownerOf(tokenId);\n\n // Perform (optional) operator check\n if (auth != address(0)) {\n _checkAuthorized(from, auth, tokenId);\n }\n\n // Execute the update\n if (from != address(0)) {\n // Clear approval. No need to re-authorize or emit the Approval event\n _approve(address(0), tokenId, address(0), false);\n\n unchecked {\n _balances[from] -= 1;\n }\n }\n\n if (to != address(0)) {\n unchecked {\n _balances[to] += 1;\n }\n }\n\n _owners[tokenId] = to;\n\n emit Transfer(from, to, tokenId);\n\n return from;\n }\n\n /**\n * @dev Mints `tokenId` and transfers it to `to`.\n *\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - `to` cannot be the zero address.\n *\n * Emits a {Transfer} event.\n */\n function _mint(address to, uint256 tokenId) internal {\n if (to == address(0)) {\n revert ERC721InvalidReceiver(address(0));\n }\n address previousOwner = _update(to, tokenId, address(0));\n if (previousOwner != address(0)) {\n revert ERC721InvalidSender(address(0));\n }\n }\n\n /**\n * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeMint(address to, uint256 tokenId) internal {\n _safeMint(to, tokenId, \"\");\n }\n\n /**\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n */\n function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\n _mint(to, tokenId);\n _checkOnERC721Received(address(0), to, tokenId, data);\n }\n\n /**\n * @dev Destroys `tokenId`.\n * The approval is cleared when the token is burned.\n * This is an internal function that does not check if the sender is authorized to operate on the token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n *\n * Emits a {Transfer} event.\n */\n function _burn(uint256 tokenId) internal {\n address previousOwner = _update(address(0), tokenId, address(0));\n if (previousOwner == address(0)) {\n revert ERC721NonexistentToken(tokenId);\n }\n }\n\n /**\n * @dev Transfers `tokenId` from `from` to `to`.\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n *\n * Emits a {Transfer} event.\n */\n function _transfer(address from, address to, uint256 tokenId) internal {\n if (to == address(0)) {\n revert ERC721InvalidReceiver(address(0));\n }\n address previousOwner = _update(to, tokenId, address(0));\n if (previousOwner == address(0)) {\n revert ERC721NonexistentToken(tokenId);\n } else if (previousOwner != from) {\n revert ERC721IncorrectOwner(from, tokenId, previousOwner);\n }\n }\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients\n * are aware of the ERC721 standard to prevent tokens from being forever locked.\n *\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\n *\n * This internal function is like {safeTransferFrom} in the sense that it invokes\n * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.\n * implement alternative mechanisms to perform token transfer, such as signature-based.\n *\n * Requirements:\n *\n * - `tokenId` token must exist and be owned by `from`.\n * - `to` cannot be the zero address.\n * - `from` cannot be the zero address.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeTransfer(address from, address to, uint256 tokenId) internal {\n _safeTransfer(from, to, tokenId, \"\");\n }\n\n /**\n * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n */\n function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\n _transfer(from, to, tokenId);\n _checkOnERC721Received(from, to, tokenId, data);\n }\n\n /**\n * @dev Approve `to` to operate on `tokenId`\n *\n * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is\n * either the owner of the token, or approved to operate on all tokens held by this owner.\n *\n * Emits an {Approval} event.\n *\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n */\n function _approve(address to, uint256 tokenId, address auth) internal {\n _approve(to, tokenId, auth, true);\n }\n\n /**\n * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not\n * emitted in the context of transfers.\n */\n function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {\n // Avoid reading the owner unless necessary\n if (emitEvent || auth != address(0)) {\n address owner = _requireOwned(tokenId);\n\n // We do not use _isAuthorized because single-token approvals should not be able to call approve\n if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {\n revert ERC721InvalidApprover(auth);\n }\n\n if (emitEvent) {\n emit Approval(owner, to, tokenId);\n }\n }\n\n _tokenApprovals[tokenId] = to;\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Requirements:\n * - operator can't be the address zero.\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\n if (operator == address(0)) {\n revert ERC721InvalidOperator(operator);\n }\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).\n * Returns the owner.\n *\n * Overrides to ownership logic should be done to {_ownerOf}.\n */\n function _requireOwned(uint256 tokenId) internal view returns (address) {\n address owner = _ownerOf(tokenId);\n if (owner == address(0)) {\n revert ERC721NonexistentToken(tokenId);\n }\n return owner;\n }\n\n /**\n * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the\n * recipient doesn't accept the token transfer. The call is not executed if the target address is not a contract.\n *\n * @param from address representing the previous owner of the given token ID\n * @param to target address that will receive the tokens\n * @param tokenId uint256 ID of the token to be transferred\n * @param data bytes optional data to send along with the call\n */\n function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private {\n if (to.code.length > 0) {\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\n if (retval != IERC721Receiver.onERC721Received.selector) {\n revert ERC721InvalidReceiver(to);\n }\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n revert ERC721InvalidReceiver(to);\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n }\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721URIStorage.sol)\n\npragma solidity ^0.8.20;\n\nimport {ERC721} from \"../ERC721.sol\";\nimport {Strings} from \"../../../utils/Strings.sol\";\nimport {IERC4906} from \"../../../interfaces/IERC4906.sol\";\nimport {IERC165} from \"../../../interfaces/IERC165.sol\";\n\n/**\n * @dev ERC721 token with storage based token URI management.\n */\nabstract contract ERC721URIStorage is IERC4906, ERC721 {\n using Strings for uint256;\n\n // Interface ID as defined in ERC-4906. This does not correspond to a traditional interface ID as ERC-4906 only\n // defines events and does not include any external function.\n bytes4 private constant ERC4906_INTERFACE_ID = bytes4(0x49064906);\n\n // Optional mapping for token URIs\n mapping(uint256 tokenId => string) private _tokenURIs;\n\n /**\n * @dev See {IERC165-supportsInterface}\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) {\n return interfaceId == ERC4906_INTERFACE_ID || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n _requireOwned(tokenId);\n\n string memory _tokenURI = _tokenURIs[tokenId];\n string memory base = _baseURI();\n\n // If there is no base URI, return the token URI.\n if (bytes(base).length == 0) {\n return _tokenURI;\n }\n // If both are set, concatenate the baseURI and tokenURI (via string.concat).\n if (bytes(_tokenURI).length > 0) {\n return string.concat(base, _tokenURI);\n }\n\n return super.tokenURI(tokenId);\n }\n\n /**\n * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.\n *\n * Emits {MetadataUpdate}.\n */\n function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {\n _tokenURIs[tokenId] = _tokenURI;\n emit MetadataUpdate(tokenId);\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC721} from \"../IERC721.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721Metadata is IERC721 {\n /**\n * @dev Returns the token collection name.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the token collection symbol.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n */\n function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/IERC721.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n /**\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n */\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n */\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n */\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n /**\n * @dev Returns the number of tokens in ``owner``'s account.\n */\n function balanceOf(address owner) external view returns (uint256 balance);\n\n /**\n * @dev Returns the owner of the `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function ownerOf(uint256 tokenId) external view returns (address owner);\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\n * a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or\n * {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\n * a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n /**\n * @dev Transfers `tokenId` token from `from` to `to`.\n *\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 tokenId) external;\n\n /**\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n * The approval is cleared when the token is transferred.\n *\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n *\n * Requirements:\n *\n * - The caller must own the token or be an approved operator.\n * - `tokenId` must exist.\n *\n * Emits an {Approval} event.\n */\n function approve(address to, uint256 tokenId) external;\n\n /**\n * @dev Approve or remove `operator` as an operator for the caller.\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n *\n * Requirements:\n *\n * - The `operator` cannot be the address zero.\n *\n * Emits an {ApprovalForAll} event.\n */\n function setApprovalForAll(address operator, bool approved) external;\n\n /**\n * @dev Returns the account approved for `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function getApproved(uint256 tokenId) external view returns (address operator);\n\n /**\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n *\n * See {setApprovalForAll}\n */\n function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be\n * reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" - }, - "@openzeppelin/contracts/utils/Address.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error AddressInsufficientBalance(address account);\n\n /**\n * @dev There's no code at `target` (it is not a contract).\n */\n error AddressEmptyCode(address target);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedInnerCall();\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n if (address(this).balance < amount) {\n revert AddressInsufficientBalance(address(this));\n }\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n if (!success) {\n revert FailedInnerCall();\n }\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason or custom error, it is bubbled\n * up by this function (like regular Solidity function calls). However, if\n * the call reverted with no returned reason, this function reverts with a\n * {FailedInnerCall} error.\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n if (address(this).balance < value) {\n revert AddressInsufficientBalance(address(this));\n }\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an\n * unsuccessful call.\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata\n ) internal view returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n // only check if target is a contract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n if (returndata.length == 0 && target.code.length == 0) {\n revert AddressEmptyCode(target);\n }\n return returndata;\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n * revert reason or with a default {FailedInnerCall} error.\n */\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n return returndata;\n }\n }\n\n /**\n * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.\n */\n function _revert(bytes memory returndata) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert FailedInnerCall();\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Arrays.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Arrays.sol)\n\npragma solidity ^0.8.20;\n\nimport {StorageSlot} from \"./StorageSlot.sol\";\nimport {Math} from \"./math/Math.sol\";\n\n/**\n * @dev Collection of functions related to array types.\n */\nlibrary Arrays {\n using StorageSlot for bytes32;\n\n /**\n * @dev Searches a sorted `array` and returns the first index that contains\n * a value greater or equal to `element`. If no such index exists (i.e. all\n * values in the array are strictly less than `element`), the array length is\n * returned. Time complexity O(log n).\n *\n * `array` is expected to be sorted in ascending order, and to contain no\n * repeated elements.\n */\n function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {\n uint256 low = 0;\n uint256 high = array.length;\n\n if (high == 0) {\n return 0;\n }\n\n while (low < high) {\n uint256 mid = Math.average(low, high);\n\n // Note that mid will always be strictly less than high (i.e. it will be a valid array index)\n // because Math.average rounds towards zero (it does integer division with truncation).\n if (unsafeAccess(array, mid).value > element) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.\n if (low > 0 && unsafeAccess(array, low - 1).value == element) {\n return low - 1;\n } else {\n return low;\n }\n }\n\n /**\n * @dev Access an array in an \"unsafe\" way. Skips solidity \"index-out-of-range\" check.\n *\n * WARNING: Only use if you are certain `pos` is lower than the array length.\n */\n function unsafeAccess(address[] storage arr, uint256 pos) internal pure returns (StorageSlot.AddressSlot storage) {\n bytes32 slot;\n // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr`\n // following https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays.\n\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0, arr.slot)\n slot := add(keccak256(0, 0x20), pos)\n }\n return slot.getAddressSlot();\n }\n\n /**\n * @dev Access an array in an \"unsafe\" way. Skips solidity \"index-out-of-range\" check.\n *\n * WARNING: Only use if you are certain `pos` is lower than the array length.\n */\n function unsafeAccess(bytes32[] storage arr, uint256 pos) internal pure returns (StorageSlot.Bytes32Slot storage) {\n bytes32 slot;\n // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr`\n // following https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays.\n\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0, arr.slot)\n slot := add(keccak256(0, 0x20), pos)\n }\n return slot.getBytes32Slot();\n }\n\n /**\n * @dev Access an array in an \"unsafe\" way. Skips solidity \"index-out-of-range\" check.\n *\n * WARNING: Only use if you are certain `pos` is lower than the array length.\n */\n function unsafeAccess(uint256[] storage arr, uint256 pos) internal pure returns (StorageSlot.Uint256Slot storage) {\n bytes32 slot;\n // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr`\n // following https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays.\n\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0, arr.slot)\n slot := add(keccak256(0, 0x20), pos)\n }\n return slot.getUint256Slot();\n }\n\n /**\n * @dev Access an array in an \"unsafe\" way. Skips solidity \"index-out-of-range\" check.\n *\n * WARNING: Only use if you are certain `pos` is lower than the array length.\n */\n function unsafeMemoryAccess(uint256[] memory arr, uint256 pos) internal pure returns (uint256 res) {\n assembly {\n res := mload(add(add(arr, 0x20), mul(pos, 0x20)))\n }\n }\n\n /**\n * @dev Access an array in an \"unsafe\" way. Skips solidity \"index-out-of-range\" check.\n *\n * WARNING: Only use if you are certain `pos` is lower than the array length.\n */\n function unsafeMemoryAccess(address[] memory arr, uint256 pos) internal pure returns (address res) {\n assembly {\n res := mload(add(add(arr, 0x20), mul(pos, 0x20)))\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Context.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/introspection/ERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/introspection/IERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" - }, - "@openzeppelin/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Muldiv operation overflow.\n */\n error MathOverflowedMulDiv();\n\n enum Rounding {\n Floor, // Toward negative infinity\n Ceil, // Toward positive infinity\n Trunc, // Toward zero\n Expand // Away from zero\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with an overflow flag.\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds towards infinity instead\n * of rounding towards zero.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n if (b == 0) {\n // Guarantee the same behavior as in a regular Solidity division.\n return a / b;\n }\n\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n * denominator == 0.\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n * Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0 = x * y; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n if (denominator <= prod1) {\n revert MathOverflowedMulDiv();\n }\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n uint256 twos = denominator & (0 - denominator);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n // works in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n * towards zero.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n */\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n return uint8(rounding) % 2 == 1;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/math/SignedMath.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // must be unchecked in order to support `n = type(int256).min`\n return uint256(n >= 0 ? n : -n);\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n uint256 private _status;\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n constructor() {\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n _status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/StorageSlot.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(newImplementation.code.length > 0);\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Strings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n uint8 private constant ADDRESS_LENGTH = 20;\n\n /**\n * @dev The `value` string doesn't fit in the specified `length`.\n */\n error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toStringSigned(int256 value) internal pure returns (string memory) {\n return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n uint256 localValue = value;\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = HEX_DIGITS[localValue & 0xf];\n localValue >>= 4;\n }\n if (localValue != 0) {\n revert StringsInsufficientHexLength(value, length);\n }\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n * representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n" - }, - "contracts/AccessManager.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\nimport \"@openzeppelin/contracts/access/AccessControl.sol\";\r\n\r\ncontract AccessManager is AccessControl {\r\n bytes32 public constant VALIDATOR_ROLE = keccak256(\"VALIDATOR_ROLE\");\r\n bytes32 public constant AGENT_ROLE = keccak256(\"AGENT_ROLE\");\r\n\r\n constructor(address admin) {\r\n _grantRole(DEFAULT_ADMIN_ROLE, admin);\r\n }\r\n\r\n /**\r\n * Use this modifier to manage the fonction access more granularly\r\n * @param _functionSig The signature of the function to be called\r\n */\r\n modifier functionRoleOrAdmin(bytes32 _functionSig) {\r\n require(\r\n hasRole(DEFAULT_ADMIN_ROLE, _msgSender()) || hasRole(_functionSig, _msgSender()),\r\n \"[AccessManagement] Only the Admin or function granted user can interact\"\r\n );\r\n _;\r\n }\r\n\r\n /**\r\n * @dev Add a validator to the contract\r\n */\r\n function addValidator(address _validator) public functionRoleOrAdmin(this.addValidator.selector) {\r\n _grantRole(VALIDATOR_ROLE, _validator);\r\n }\r\n\r\n /**\r\n * @dev Remove a validator from the contract\r\n */\r\n function removeValidator(address _validator) public functionRoleOrAdmin(this.removeValidator.selector) {\r\n _revokeRole(VALIDATOR_ROLE, _validator);\r\n }\r\n\r\n /**\r\n * @dev Check if an address has the admin role\r\n */\r\n function hasAdminRole(address _address) public view returns (bool) {\r\n return hasRole(DEFAULT_ADMIN_ROLE, _address);\r\n }\r\n\r\n /**\r\n * @dev Check if an address has the validator role\r\n * @param _address The address to check\r\n */\r\n function hasValidatorRole(address _address) public view returns (bool) {\r\n return hasRole(VALIDATOR_ROLE, _address);\r\n }\r\n\r\n /**\r\n * @dev See {IERC165-supportsInterface}.\r\n */\r\n function supportsInterface(bytes4 _interfaceId) public view virtual override(AccessControl) returns (bool) {\r\n return super.supportsInterface(_interfaceId);\r\n }\r\n}\r\n\r\ncontract AccessManagerBase is Context {\r\n AccessManager accessManager;\r\n\r\n constructor(address _accessManager) {\r\n accessManager = AccessManager(_accessManager);\r\n }\r\n\r\n /**\r\n * Use this modifier to restrict to admin only\r\n */\r\n modifier onlyAdmin() {\r\n require(\r\n accessManager.hasRole(accessManager.DEFAULT_ADMIN_ROLE(), _msgSender()),\r\n \"[AccessManagement] Only the admin can interact\"\r\n );\r\n _;\r\n }\r\n\r\n /**\r\n * Use this modifier to restrict to validator only\r\n */\r\n modifier onlyValidator() {\r\n require(\r\n accessManager.hasRole(accessManager.VALIDATOR_ROLE(), _msgSender()),\r\n \"[AccessManagement] Only the validator can interact\"\r\n );\r\n _;\r\n }\r\n\r\n /**\r\n * Use this modifier to restrict to validator only\r\n */\r\n modifier onlyAgent() {\r\n require(\r\n accessManager.hasRole(accessManager.AGENT_ROLE(), _msgSender()),\r\n \"[AccessManagement] Only the agent can interact\"\r\n );\r\n _;\r\n }\r\n\r\n /**\r\n * Use this modifier to manage the fonction access more granularly\r\n */\r\n modifier onlyRole(bytes32 _role) {\r\n require(accessManager.hasRole(_role, _msgSender()), \"[AccessManager] Only the validator can interact\");\r\n _;\r\n }\r\n\r\n /**\r\n * Use this modifier to manage the fonction access more granularly\r\n * @param _functionSig The signature of the function to be called\r\n */\r\n modifier functionRoleOrAdmin(bytes32 _functionSig) {\r\n require(\r\n hasRole(accessManager.DEFAULT_ADMIN_ROLE(), _msgSender()) || hasRole(_functionSig, _msgSender()),\r\n \"[AccessManagement] Only the Admin or function granted user can interact\"\r\n );\r\n _;\r\n }\r\n\r\n function hasAdminRole() public view returns (bool) {\r\n return accessManager.hasAdminRole(_msgSender());\r\n }\r\n\r\n function hasValidatorRole() public view returns (bool) {\r\n return accessManager.hasValidatorRole(_msgSender());\r\n }\r\n\r\n function hasRole(bytes32 _role, address _address) public view returns (bool) {\r\n return accessManager.hasRole(_role, _address);\r\n }\r\n}\r\n" - }, - "contracts/DeedNFT.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\r\nimport \"@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol\";\r\nimport \"./AccessManager.sol\";\r\n\r\ncontract DeedNFT is ERC721, ERC721URIStorage, AccessManagerBase {\r\n struct DeedInfo {\r\n AssetType assetType;\r\n bool isValidated;\r\n }\r\n\r\n uint256 public nextDeedId;\r\n mapping(uint256 => DeedInfo) private deedInfoMap;\r\n\r\n enum AssetType {\r\n Land,\r\n Vehicle,\r\n Estate,\r\n CommercialEquipment\r\n }\r\n\r\n event DeedNFTMinted(uint256 deedId, DeedInfo deedInfo, address minter);\r\n event DeedNFTBurned(uint256 deedId);\r\n event DeedNFTAssetValidationSet(uint256 deedId, bool isValid);\r\n event DeedNFTIpfsDetailsSet(uint256 deedId, string newIpfsDetailsHash);\r\n event DeedNFTAssetTypeSet(uint256 deedId, AssetType newAssetType);\r\n\r\n constructor(address _accessManager) ERC721(\"DeedNFT\", \"DEED\") ERC721URIStorage() AccessManagerBase(_accessManager) {\r\n nextDeedId = 1;\r\n }\r\n\r\n modifier deedExists(uint256 _deedId) {\r\n require(\r\n _ownerOf(_deedId) != address(0),\r\n string.concat(\"[DeedNFT] Deed does not exist with id \", Strings.toString(_deedId))\r\n );\r\n _;\r\n }\r\n\r\n modifier onlyOwner(uint256 _deedId) {\r\n require(\r\n _msgSender() == _ownerOf(_deedId),\r\n string.concat(\"[DeedNFT] Must be owner of the Deed with id \", Strings.toString(_deedId))\r\n );\r\n _;\r\n }\r\n\r\n function mintAsset(\r\n address _owner,\r\n string memory _ipfsDetailsHash,\r\n AssetType _assetType\r\n ) public onlyValidator returns (uint256) {\r\n _mint(_owner, nextDeedId);\r\n\r\n DeedInfo storage deedInfo = deedInfoMap[nextDeedId];\r\n deedInfo.assetType = _assetType;\r\n _setTokenURI(nextDeedId, _ipfsDetailsHash);\r\n deedInfo.isValidated = true;\r\n emit DeedNFTMinted(nextDeedId, deedInfo, _msgSender());\r\n nextDeedId = nextDeedId + 1;\r\n return nextDeedId;\r\n }\r\n\r\n function burn(uint256 _deedId) public onlyOwner(_deedId) {\r\n _burn(_deedId);\r\n emit DeedNFTBurned(_deedId);\r\n }\r\n\r\n function setAssetValidation(uint256 _deedId, bool _isValid) public onlyValidator {\r\n require(_ownerOf(_deedId) != _msgSender(), \"[DeedNFT] Owner cannot validate their own asset\");\r\n _setAssetValidation(_deedId, _isValid);\r\n }\r\n\r\n function setIpfsDetailsHash(\r\n uint256 _deedId,\r\n string memory _ipfsDetailsHash\r\n ) public virtual deedExists(_deedId) onlyOwner(_deedId) {\r\n _setTokenURI(_deedId, _ipfsDetailsHash);\r\n _setAssetValidation(_deedId, false);\r\n emit DeedNFTIpfsDetailsSet(_deedId, _ipfsDetailsHash);\r\n }\r\n\r\n function setAssetType(uint256 _deedId, AssetType _assetType) public deedExists(_deedId) onlyOwner(_deedId) {\r\n DeedInfo storage deedInfo = deedInfoMap[_deedId];\r\n deedInfo.assetType = _assetType;\r\n _setAssetValidation(_deedId, false);\r\n emit DeedNFTAssetTypeSet(_deedId, _assetType);\r\n }\r\n\r\n function getDeedInfo(uint256 _deedId) public view deedExists(_deedId) returns (DeedInfo memory) {\r\n return deedInfoMap[_deedId];\r\n }\r\n\r\n function canSubdivide(uint256 _deedId) external view returns (bool) {\r\n AssetType assetType = getDeedInfo(_deedId).assetType;\r\n return assetType == AssetType.Land || assetType == AssetType.Estate;\r\n }\r\n\r\n function supportsInterface(\r\n bytes4 _interfaceId\r\n ) public view virtual override(ERC721, ERC721URIStorage) returns (bool) {\r\n return super.supportsInterface(_interfaceId);\r\n }\r\n\r\n function tokenURI(uint256 _deedId) public view override(ERC721, ERC721URIStorage) returns (string memory) {\r\n return super.tokenURI(_deedId);\r\n }\r\n\r\n function _setAssetValidation(uint256 _deedId, bool _isValid) internal {\r\n DeedInfo storage deedInfo = deedInfoMap[_deedId];\r\n deedInfo.isValidated = _isValid;\r\n emit DeedNFTAssetValidationSet(_deedId, _isValid);\r\n }\r\n}\r\n" - }, - "contracts/FundsManager.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\r\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\r\nimport \"@openzeppelin/contracts/access/AccessControl.sol\";\r\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\r\nimport \"./AccessManager.sol\";\r\n\r\ncontract FundsManager is Context, AccessManagerBase {\r\n event FundsStored(uint256 id, IERC20 token, uint256 amount, address sender, address caller, uint256 newBalance);\r\n event FundsWithdrawn(\r\n uint256 id,\r\n IERC20 token,\r\n uint256 amount,\r\n address destination,\r\n address caller,\r\n uint256 newBalance\r\n );\r\n\r\n // AccountOwner -> AccountId -> TokenAddress -> Amount\r\n mapping(address => mapping(uint256 => mapping(address => uint256))) public accountsMapping;\r\n\r\n constructor(address _accessManager) AccessManagerBase(_accessManager) {}\r\n\r\n /**\r\n * Get the balance of an account\r\n * @param _id AccountId\r\n * @param _token TokenAddress\r\n * @return Balance\r\n */\r\n function balanceOf(uint256 _id, IERC20 _token) external view returns (uint256) {\r\n return accountsMapping[_msgSender()][_id][address(_token)];\r\n }\r\n\r\n /**\r\n * Pull tokens from sender and store them in the contract\r\n * @param _id AccountId\r\n * @param _token TokenAddress\r\n * @param _amount Amount\r\n * @param _sender Witch address to pull tokens from\r\n */\r\n function store(uint256 _id, IERC20 _token, uint256 _amount, address _sender) external {\r\n require(\r\n _token.allowance(_sender, address(this)) >= _amount,\r\n string.concat(\r\n \"[Funds Manager] Not enough allowance for account \",\r\n Strings.toString(_id),\r\n \" and amount \",\r\n Strings.toString(_amount)\r\n )\r\n );\r\n\r\n _token.transferFrom(_sender, address(this), _amount);\r\n accountsMapping[_msgSender()][_id][address(_token)] += _amount;\r\n\r\n emit FundsStored(\r\n _id,\r\n _token,\r\n _amount,\r\n _sender,\r\n _msgSender(),\r\n accountsMapping[_msgSender()][_id][address(_token)]\r\n );\r\n }\r\n\r\n /**\r\n * Withdraw tokens from the contract and send them to the recipient\r\n * @param _id AccountId\r\n * @param _token TokenAddress\r\n * @param _amount Amount\r\n * @param _recipient Witch address to send tokens to\r\n */\r\n function withdraw(uint256 _id, IERC20 _token, uint256 _amount, address _recipient) external {\r\n require(\r\n accountsMapping[_msgSender()][_id][address(_token)] >= _amount,\r\n string.concat(\r\n \"[Funds Manager] Not enough funds for account \",\r\n Strings.toString(_id),\r\n \" and amount \",\r\n Strings.toString(_amount)\r\n )\r\n );\r\n\r\n accountsMapping[_msgSender()][_id][address(_token)] -= _amount;\r\n _token.transfer(_recipient, _amount);\r\n\r\n emit FundsWithdrawn(\r\n _id,\r\n _token,\r\n _amount,\r\n _recipient,\r\n _msgSender(),\r\n accountsMapping[_msgSender()][_id][address(_token)]\r\n );\r\n }\r\n}\r\n" - }, - "contracts/LeaseAgreement.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\n\r\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\r\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\r\nimport \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\r\nimport \"./DeedNFT.sol\"; // Import the IDeedNFT interface\r\nimport \"./LeaseNFT.sol\";\r\nimport \"./SubdivisionNFT.sol\"; // Import the ISubdivisionNFT interface\r\nimport \"./FundsManager.sol\";\r\nimport \"./AccessManager.sol\";\r\n\r\ninterface ILeaseNFT {\r\n function mint(address leaseOwner, uint256 leaseId) external;\r\n\r\n function burn(uint256 leaseId) external;\r\n}\r\n\r\ncontract LeaseAgreement is ReentrancyGuard, AccessManagerBase {\r\n // CONSTANTS\r\n uint256 private constant MONTH = 30.5 days;\r\n uint256 private constant MAX_NB_MONTH_FOR_DEPOSIT = 3;\r\n\r\n struct LeaseDates {\r\n uint256 startDate;\r\n uint256 endDate;\r\n uint256 rentDueDate;\r\n uint256 distributableDate;\r\n }\r\n\r\n struct Deposit {\r\n uint256 amount;\r\n bool paid;\r\n }\r\n\r\n struct Lease {\r\n address[] lesseeList;\r\n uint256 rentAmount;\r\n Deposit securityDeposit;\r\n uint256 latePaymentFee;\r\n uint32 gracePeriod;\r\n LeaseDates dates;\r\n uint256 extensionCount;\r\n uint256 deedId;\r\n address manager;\r\n uint8 managerPercentage;\r\n uint256 unclaimedRentAmount;\r\n bool isArchived;\r\n }\r\n\r\n struct RentPaymentInfo {\r\n uint256 rentAmount;\r\n uint256 totalBalance;\r\n uint32 unpaidMonths;\r\n uint256 rentDueDate;\r\n }\r\n\r\n modifier onlyLessor(uint256 _leaseId) {\r\n require(_msgSender() == leaseNFT.ownerOf(_leaseId), \"[Lease Agreement] Sender must be Lessor\");\r\n _;\r\n }\r\n modifier onlyActive(uint256 _leaseId) {\r\n require(\r\n block.timestamp < leases[_leaseId].dates.endDate && block.timestamp > leases[_leaseId].dates.startDate,\r\n \"[Lease Agreement] The contract has been archived.\"\r\n );\r\n _;\r\n }\r\n mapping(uint256 => Lease) public leases;\r\n uint256 public leaseCounter;\r\n LeaseNFT public leaseNFT;\r\n IERC20 public paymentToken;\r\n DeedNFT public deedNFT;\r\n SubdivisionNFT public subdivisionNFT;\r\n FundsManager public fundsManager;\r\n\r\n event LeaseFundsManagerSet(address fundsManager);\r\n event LeasePaymentTokenSet(address paymentToken);\r\n event LeaseCreated(uint256 leaseId, Lease lease);\r\n event LeaseTerminated(uint256 leaseId);\r\n event LeasePaymentMade(uint256 leaseId, uint256 amount, uint256 unclaimedRentAmount);\r\n event LeaseRentDistributed(uint256 leaseId, uint256 lessorAmount, uint256 managerAmount, uint256 distributableDate);\r\n event LeaseManagerSet(uint256 leaseId, address manager, uint256 percentage);\r\n event LeaseManagerUnset(uint256 leaseId);\r\n event LeaseDueDateChanged(uint256 leaseId, uint256 newDueDate);\r\n event LeaseDepositSubmited(uint256 leaseId, uint256 amount);\r\n event LeaseExtended(uint256 leaseId, uint256 endDate, uint256 rentAmount, uint256 extensionCount);\r\n\r\n constructor(\r\n address _leaseNFT,\r\n address _paymentToken,\r\n address _deedNFT,\r\n address _subdivisionNFT,\r\n address _fundsManager,\r\n address _accessManager\r\n ) AccessManagerBase(_accessManager) {\r\n require(_leaseNFT != address(0), \"[Lease Agreement] Invalid LeaseNFT address\");\r\n require(_paymentToken != address(0), \"[Lease Agreement] Invalid token address\");\r\n require(_deedNFT != address(0), \"[Lease Agreement] Invalid DeedNFT address\");\r\n require(_subdivisionNFT != address(0), \"[Lease Agreement] Invalid SubdivisionNFT address\");\r\n\r\n leaseNFT = LeaseNFT(_leaseNFT);\r\n deedNFT = DeedNFT(_deedNFT);\r\n subdivisionNFT = SubdivisionNFT(_subdivisionNFT);\r\n\r\n paymentToken = IERC20(_paymentToken);\r\n emit LeasePaymentTokenSet(_paymentToken);\r\n\r\n fundsManager = FundsManager(_fundsManager);\r\n emit LeaseFundsManagerSet(_fundsManager);\r\n\r\n leaseCounter = 0;\r\n }\r\n\r\n function setFundsManager(address _fundsManager) public functionRoleOrAdmin(this.setFundsManager.selector) {\r\n fundsManager = FundsManager(_fundsManager);\r\n emit LeaseFundsManagerSet(_fundsManager);\r\n }\r\n\r\n function getLesseeList(uint256 _leaseId) public view returns (address[] memory) {\r\n Lease storage lease = leases[_leaseId];\r\n return lease.lesseeList;\r\n }\r\n\r\n function setPaymentToken(address _paymentToken) public functionRoleOrAdmin(this.setPaymentToken.selector) {\r\n paymentToken = IERC20(_paymentToken);\r\n emit LeasePaymentTokenSet(_paymentToken);\r\n }\r\n\r\n function createLease(\r\n address[] memory _lesseeList,\r\n uint256 _startDate,\r\n uint256 _endDate,\r\n uint256 _rentAmount,\r\n uint256 _securityDepositAmount,\r\n uint256 _deedId,\r\n uint256 _latePaymentFee,\r\n uint32 _gracePeriod\r\n ) external {\r\n require(_startDate < _endDate, \"[Lease Agreement] Invalid start and end dates\");\r\n require(\r\n _endDate - _startDate > 1 * MONTH,\r\n \"[Lease Agreement] End date and start date should be 1 month appart\"\r\n );\r\n require(_gracePeriod >= 3);\r\n require(_latePaymentFee >= 0 && _latePaymentFee <= 15);\r\n bool isDeedOwner = _verifyDeedOwnership(_msgSender(), _deedId);\r\n bool isSubdivisionOwner = _verifySubdivisionOwnership(_msgSender(), _deedId);\r\n require(isDeedOwner || isSubdivisionOwner, \"[Lease Agreement] Lessor must own the property NFT\");\r\n\r\n uint256 leaseId = leaseCounter;\r\n leaseCounter++;\r\n Lease storage lease = leases[leaseId];\r\n lease.lesseeList = _lesseeList;\r\n lease.dates.startDate = _startDate;\r\n lease.dates.endDate = _endDate;\r\n lease.rentAmount = _rentAmount;\r\n lease.securityDeposit.amount = _securityDepositAmount;\r\n lease.dates.rentDueDate = _startDate + 1 * MONTH;\r\n lease.extensionCount = 0;\r\n lease.deedId = _deedId;\r\n lease.securityDeposit.paid = _securityDepositAmount == 0;\r\n lease.latePaymentFee = _latePaymentFee;\r\n lease.gracePeriod = _gracePeriod;\r\n lease.isArchived = false;\r\n leaseNFT.mint(_msgSender(), leaseId);\r\n lease.dates.distributableDate = lease.dates.rentDueDate;\r\n\r\n emit LeaseCreated(leaseId, lease);\r\n }\r\n\r\n function containsAddress(address[] memory _addresses, address _address) internal pure returns (bool) {\r\n bool contains = false;\r\n for (uint i = 0; i < _addresses.length; i++) {\r\n if (_addresses[i] == _address) {\r\n contains = true;\r\n break;\r\n }\r\n }\r\n return contains;\r\n }\r\n\r\n function transferLease(uint256 _leaseId, address[] memory _newLesseeList) public onlyLessor(_leaseId) {\r\n Lease storage lease = leases[_leaseId];\r\n lease.lesseeList = _newLesseeList;\r\n }\r\n\r\n function setManager(uint256 _leaseId, address _manager, uint8 _percentage) public onlyLessor(_leaseId) {\r\n Lease storage lease = leases[_leaseId];\r\n require(_percentage >= 0 && _percentage <= 100, \"[Lease Agreement] Invalid Manager percentage\");\r\n\r\n lease.manager = _manager;\r\n lease.managerPercentage = _percentage;\r\n\r\n emit LeaseManagerSet(_leaseId, _manager, _percentage);\r\n }\r\n\r\n function unsetManager(uint256 _leaseId) external {\r\n Lease storage lease = leases[_leaseId];\r\n require(\r\n _msgSender() == leaseNFT.ownerOf(_leaseId) || _msgSender() == lease.manager,\r\n \"[Lease Agreement] Only the Lessor or the Manager can remove the Manager\"\r\n );\r\n\r\n lease.manager = address(0);\r\n lease.managerPercentage = 0;\r\n\r\n emit LeaseManagerUnset(_leaseId);\r\n }\r\n\r\n function submitDeposit(uint256 _leaseId) external nonReentrant {\r\n Lease storage lease = leases[_leaseId];\r\n require(\r\n containsAddress(lease.lesseeList, _msgSender()),\r\n \"[Lease Agreement] Only the Lessee can submit the deposit\"\r\n );\r\n require(!lease.securityDeposit.paid, \"[Lease Agreement] Security deposit already paid\");\r\n\r\n fundsManager.store(_leaseId, paymentToken, lease.securityDeposit.amount, _msgSender());\r\n lease.securityDeposit.paid = true;\r\n\r\n emit LeaseDepositSubmited(_leaseId, lease.securityDeposit.amount);\r\n }\r\n\r\n function setDueDate(uint256 _leaseId, uint256 _newDueDate) public onlyLessor(_leaseId) {\r\n Lease storage lease = leases[_leaseId];\r\n require(\r\n _newDueDate >= (lease.dates.rentDueDate + 1 * MONTH),\r\n \"[Lease Agreement] New rent due date must be at least a month after current one\"\r\n );\r\n\r\n lease.dates.rentDueDate = _newDueDate;\r\n\r\n emit LeaseDueDateChanged(_leaseId, _newDueDate);\r\n }\r\n\r\n function payRent(uint256 _leaseId) external nonReentrant {\r\n Lease storage lease = leases[_leaseId];\r\n require(containsAddress(lease.lesseeList, _msgSender()), \"[Lease Agreement] Only the Lessee can pay rent\");\r\n require(lease.securityDeposit.paid, \"[Lease Agreement] Security deposit must be paid first\");\r\n require(\r\n block.timestamp >= lease.dates.startDate && block.timestamp <= lease.dates.endDate,\r\n \"[Lease Agreement] Outside of lease duration\"\r\n );\r\n\r\n RentPaymentInfo memory rentInfo = calculateRentPaymentInfo(_leaseId);\r\n lease.unclaimedRentAmount += rentInfo.totalBalance;\r\n lease.dates.rentDueDate += (rentInfo.unpaidMonths) * (1 * MONTH);\r\n fundsManager.store(_leaseId, paymentToken, rentInfo.totalBalance, _msgSender());\r\n\r\n emit LeaseDueDateChanged(_leaseId, lease.dates.rentDueDate);\r\n emit LeasePaymentMade(_leaseId, rentInfo.totalBalance, lease.unclaimedRentAmount);\r\n }\r\n\r\n function distributeRent(uint256 _leaseId) external nonReentrant {\r\n Lease storage lease = leases[_leaseId];\r\n require(\r\n _msgSender() == leaseNFT.ownerOf(_leaseId) || _msgSender() == lease.manager,\r\n \"[Lease Agreement] Caller must be the Lessor or the Manager\"\r\n );\r\n require(lease.unclaimedRentAmount > 0, \"[Lease Agreement] No rent to distribute\");\r\n uint256 nbMonthSinceLastDistribute = 0;\r\n require(\r\n block.timestamp > lease.dates.distributableDate,\r\n \"[Lease Agreement] Rent can only be distributed past the distributable date\"\r\n );\r\n\r\n nbMonthSinceLastDistribute = (block.timestamp - lease.dates.distributableDate) / (1 * MONTH) + 1;\r\n uint256 totalToClaim = lease.unclaimedRentAmount;\r\n uint256 managerAmount = 0;\r\n\r\n if (lease.manager != address(0)) {\r\n managerAmount = (totalToClaim * lease.managerPercentage) / 100;\r\n fundsManager.withdraw(_leaseId, paymentToken, uint32(managerAmount), lease.manager);\r\n }\r\n\r\n uint256 lessorAmount = totalToClaim - managerAmount;\r\n fundsManager.withdraw(_leaseId, paymentToken, uint32(lessorAmount), leaseNFT.ownerOf(_leaseId));\r\n lease.unclaimedRentAmount = 0;\r\n lease.dates.distributableDate += nbMonthSinceLastDistribute * (1 * MONTH);\r\n\r\n emit LeaseRentDistributed(_leaseId, uint32(lessorAmount), uint32(managerAmount), lease.dates.distributableDate);\r\n }\r\n\r\n function extendLease(uint256 _leaseId, uint256 _extensionPeriod) external onlyLessor(_leaseId) {\r\n Lease storage lease = leases[_leaseId];\r\n require(!lease.isArchived, \"[Lease Agreement] Lease has been archived\");\r\n require(\r\n block.timestamp >= lease.dates.endDate - 45 days, // TODO: Configurable\r\n \"[Lease Agreement] Extension can only be requested in the last 45 days\"\r\n );\r\n require(lease.extensionCount < 2, \"[Lease Agreement] Maximum extensions reached\");\r\n lease.dates.endDate += _extensionPeriod;\r\n lease.rentAmount += (lease.rentAmount * 3) / 100;\r\n lease.extensionCount++;\r\n\r\n emit LeaseExtended(_leaseId, lease.dates.endDate, lease.rentAmount, lease.extensionCount);\r\n }\r\n\r\n function withdrawDeposit(uint256 _leaseId) external nonReentrant {\r\n Lease storage lease = leases[_leaseId];\r\n require(\r\n lease.isArchived || block.timestamp > lease.dates.endDate,\r\n \"[Lease Agreement] Cannot withdraw deposit if Lease still active\"\r\n );\r\n require(containsAddress(lease.lesseeList, _msgSender()), \"[Lease Agreement] Caller must be one of the lessees\");\r\n RentPaymentInfo memory rentInfo = calculateRentPaymentInfo(_leaseId);\r\n bool shouldSendDepositToLessor = (rentInfo.unpaidMonths >= MAX_NB_MONTH_FOR_DEPOSIT);\r\n // Send security deposit to the sender of the lessee list\r\n if (!shouldSendDepositToLessor) {\r\n fundsManager.withdraw(_leaseId, paymentToken, lease.securityDeposit.amount, _msgSender());\r\n }\r\n lease.isArchived = true;\r\n }\r\n\r\n function burnLease(uint256 _leaseId) public {\r\n Lease storage lease = leases[_leaseId];\r\n require(\r\n _msgSender() == leaseNFT.ownerOf(_leaseId) || _msgSender() == lease.manager,\r\n \"[Lease Agreement] Sender must be manager or lessor\"\r\n );\r\n require(lease.isArchived, \"[Lease Agreement] Lease has been archived\");\r\n leaseNFT.burn(_leaseId);\r\n }\r\n\r\n function terminateLease(uint256 _leaseId) external nonReentrant onlyLessor(_leaseId) {\r\n Lease storage lease = leases[_leaseId];\r\n require(block.timestamp >= lease.dates.startDate, \"[Lease Agreement] Lease has not started yet\");\r\n RentPaymentInfo memory rentInfo = calculateRentPaymentInfo(_leaseId);\r\n bool shouldSendDepositToLessor = (rentInfo.unpaidMonths >= MAX_NB_MONTH_FOR_DEPOSIT);\r\n\r\n // Send security deposit to the lessor if needed\r\n if (shouldSendDepositToLessor) {\r\n fundsManager.withdraw(_leaseId, paymentToken, lease.securityDeposit.amount, leaseNFT.ownerOf(_leaseId));\r\n }\r\n lease.isArchived = true;\r\n emit LeaseTerminated(_leaseId);\r\n }\r\n\r\n function calculateRentPaymentInfo(uint256 _leaseId) public view returns (RentPaymentInfo memory rentInfo) {\r\n Lease storage lease = leases[_leaseId];\r\n rentInfo.rentAmount = lease.rentAmount;\r\n // sidenote: rent due date is incremented by 1 month each time the rent is paid.(function payRent)\r\n if (block.timestamp > lease.dates.rentDueDate + (lease.gracePeriod * 1 days)) {\r\n // Function to calculate rentAmountIncrease increase\r\n rentInfo.rentAmount += (lease.rentAmount * lease.latePaymentFee) / 100;\r\n rentInfo.unpaidMonths = uint32((block.timestamp - lease.dates.rentDueDate) / (1 * MONTH) + 1);\r\n rentInfo.totalBalance = (rentInfo.unpaidMonths) * rentInfo.rentAmount;\r\n } else {\r\n rentInfo.unpaidMonths = 1;\r\n rentInfo.totalBalance = rentInfo.rentAmount;\r\n }\r\n return rentInfo;\r\n }\r\n\r\n function _verifySubdivisionOwnership(address _owner, uint256 _subdivisionId) internal view returns (bool) {\r\n return subdivisionNFT.isOwnerOfSubdivision(_owner, _subdivisionId);\r\n }\r\n\r\n function _verifyDeedOwnership(address _owner, uint256 _deedId) internal view returns (bool) {\r\n try deedNFT.ownerOf(_deedId) returns (address owner) {\r\n return owner == _owner;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n" - }, - "contracts/LeaseNFT.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\n\r\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\r\nimport \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\r\nimport \"@openzeppelin/contracts/utils/Address.sol\";\r\nimport \"@openzeppelin/contracts/utils/math/Math.sol\";\r\nimport \"@openzeppelin/contracts/utils/introspection/ERC165.sol\";\r\nimport \"./AccessManager.sol\";\r\n\r\ncontract LeaseNFT is ERC721, AccessManagerBase {\r\n address private leaseAgreementAddress;\r\n\r\n event LeaseNFTMinted(address leaseOwner, uint256 leaseId, address minter);\r\n event LeaseNFTBurned(uint256 leaseId, address burner);\r\n event LeaseNFTAgreementSet(uint256 leaseId, address burner);\r\n\r\n constructor(address _accessManager) ERC721(\"LeaseNFT\", \"LEASE\") AccessManagerBase(_accessManager) {}\r\n\r\n function setLeaseAgreementAddress(address _leaseAgreementAddress) external onlyAdmin {\r\n leaseAgreementAddress = _leaseAgreementAddress;\r\n }\r\n\r\n function mint(address _to, uint256 _leaseId) external {\r\n require(\r\n hasAdminRole() || _msgSender() == leaseAgreementAddress,\r\n \"[LeaseNFT] Only LeaseAgreement contract can mint the lease\"\r\n );\r\n _mint(_to, _leaseId);\r\n emit LeaseNFTMinted(_to, _leaseId, _msgSender());\r\n }\r\n\r\n function exists(uint256 _leaseId) public view returns (bool) {\r\n return _ownerOf(_leaseId) != address(0);\r\n }\r\n\r\n function burn(uint256 _leaseId) external {\r\n require(\r\n hasAdminRole() || _msgSender() == leaseAgreementAddress,\r\n \"[LeaseNFT] Only LeaseAgreement can burn the lease\"\r\n );\r\n _burn(_leaseId);\r\n emit LeaseNFTBurned(_leaseId, _msgSender());\r\n }\r\n}\r\n" - }, - "contracts/SubdivisionNFT.sol": { - "content": "// SPDX-License-Identifier: AGPL-3.0\r\npragma solidity ^0.8.20;\r\nimport \"@openzeppelin/contracts/token/ERC1155/ERC1155.sol\";\r\nimport \"@openzeppelin/contracts/access/AccessControl.sol\";\r\nimport \"./DeedNFT.sol\";\r\nimport \"./AccessManager.sol\";\r\n\r\ncontract SubdivisionNFT is ERC1155, AccessManagerBase {\r\n struct SubdivisionInfo {\r\n bytes ipfsDetailsHash;\r\n address owner;\r\n uint256 parentDeed;\r\n }\r\n\r\n uint256 private _nextsubTokenID;\r\n mapping(uint256 => SubdivisionInfo) private subdivisionInfoMap;\r\n\r\n bytes32 public constant MINTER_ROLE = keccak256(\"MINTER_ROLE\");\r\n DeedNFT public deedNFT;\r\n\r\n event SubdivisionMinted(\r\n address subdivisionOwner,\r\n uint256 subdivisionId,\r\n uint256 deedId,\r\n bytes ipfsDetailsHash,\r\n address minter\r\n );\r\n event SubdivisionBurned(address account, uint256 subdivisionId, uint256 deedId, bytes ipfsDetailsHash);\r\n event SubdivisionInfoSet(uint256 tokenId, SubdivisionInfo info);\r\n\r\n constructor(address _deedNFT, address _accessManager) ERC1155(\"\") AccessManagerBase(_accessManager) {\r\n require(_deedNFT != address(0), \"[SubdivisionNFT] Invalid DeedNFT address\");\r\n\r\n _nextsubTokenID = 1;\r\n deedNFT = DeedNFT(_deedNFT);\r\n }\r\n\r\n function mintSubdivision(SubdivisionInfo memory _info) public {\r\n require(\r\n _msgSender() == deedNFT.ownerOf(_info.parentDeed),\r\n \"[SubdivisionNFT] Sender must be the owner of the parent deed\"\r\n );\r\n require(deedNFT.canSubdivide(_info.parentDeed), \"[SubdivisionNFT] Parent deed must be land or estate\");\r\n\r\n _mint(_info.owner, _nextsubTokenID, 1, _info.ipfsDetailsHash);\r\n SubdivisionInfo storage subInfo = subdivisionInfoMap[_nextsubTokenID];\r\n subInfo.ipfsDetailsHash = _info.ipfsDetailsHash;\r\n subInfo.owner = _info.owner;\r\n subInfo.parentDeed = _info.parentDeed;\r\n\r\n emit SubdivisionMinted(_info.owner, _nextsubTokenID, _info.parentDeed, _info.ipfsDetailsHash, _msgSender());\r\n _nextsubTokenID = _nextsubTokenID + 1;\r\n }\r\n\r\n function batchMint(SubdivisionInfo[] memory _infos) public {\r\n for (uint i = 0; i < _infos.length; i++) {\r\n mintSubdivision(_infos[i]);\r\n }\r\n }\r\n\r\n function setInfo(uint256 _subTokenId, SubdivisionInfo memory _newInfo) public virtual {\r\n require(\r\n isOwnerOfSubdivision(_msgSender(), _subTokenId) == true,\r\n \"[SubdivisionNFT] Sender Must be owner of subdivision to set info\"\r\n );\r\n\r\n subdivisionInfoMap[_subTokenId] = _newInfo;\r\n\r\n emit SubdivisionInfoSet(_subTokenId, _newInfo);\r\n }\r\n\r\n function burnSubdivision(uint256 _subTokenId) public {\r\n require(\r\n isOwnerOfSubdivision(_msgSender(), _subTokenId) == true,\r\n \"[SubdivisionNFT] Sender must be owner of the subdivision to burn it\"\r\n );\r\n\r\n _burn(_msgSender(), _subTokenId, 1);\r\n\r\n emit SubdivisionBurned(\r\n _msgSender(),\r\n _subTokenId,\r\n subdivisionInfoMap[_subTokenId].parentDeed,\r\n subdivisionInfoMap[_subTokenId].ipfsDetailsHash\r\n );\r\n }\r\n\r\n function getParentDeed(uint256 _subTokenId) public view returns (uint256) {\r\n SubdivisionInfo storage info = subdivisionInfoMap[_subTokenId];\r\n return info.parentDeed;\r\n }\r\n\r\n function isOwnerOfSubdivision(address _owner, uint256 _subTokenId) public view returns (bool) {\r\n return balanceOf(_owner, _subTokenId) > 0;\r\n }\r\n\r\n function supportsInterface(bytes4 _interfaceId) public view virtual override(ERC1155) returns (bool) {\r\n return super.supportsInterface(_interfaceId);\r\n }\r\n}\r\n" - } - }, - "settings": { - "optimizer": { - "enabled": true, - "runs": 200 - }, - "evmVersion": "paris", - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - } - } -} \ No newline at end of file diff --git a/packages/hardhat/flaten.txt b/packages/hardhat/flaten.txt new file mode 100644 index 00000000..a6e13c4e Binary files /dev/null and b/packages/hardhat/flaten.txt differ diff --git a/packages/hardhat/hardhat.config.ts b/packages/hardhat/hardhat.config.ts index 43d556f4..cf97f764 100644 --- a/packages/hardhat/hardhat.config.ts +++ b/packages/hardhat/hardhat.config.ts @@ -1,12 +1,11 @@ import * as dotenv from "dotenv"; dotenv.config(); import { HardhatUserConfig } from "hardhat/config"; -import "@nomicfoundation/hardhat-toolbox"; import "@eth-optimism/hardhat-ovm"; import "hardhat-deploy"; -import "@matterlabs/hardhat-zksync-solc"; -import "@matterlabs/hardhat-zksync-verify"; import "solidity-coverage"; +import "@openzeppelin/hardhat-upgrades"; +import "@nomicfoundation/hardhat-verify"; // If not set, it uses ours Alchemy's default API key. // You can get your own at https://dashboard.alchemyapi.io @@ -26,8 +25,16 @@ const config: HardhatUserConfig = { // https://docs.soliditylang.org/en/latest/using-the-compiler.html#optimizer-options runs: 200, }, + outputSelection: { + "*": { + "*": ["abi", "evm.bytecode", "evm.deployedBytecode", "metadata"], + }, + }, }, }, + sourcify: { + enabled: true, + }, ovm: { solcVersion: "0.8.20", }, @@ -94,18 +101,6 @@ const config: HardhatUserConfig = { url: `https://polygon-mumbai.g.alchemy.com/v2/${providerApiKey}`, accounts: [deployerPrivateKey], }, - zkSyncTestnet: { - url: "https://testnet.era.zksync.dev", - zksync: true, - accounts: [deployerPrivateKey], - verifyURL: "https://zksync2-testnet-explorer.zksync.dev/contract_verification", - }, - zkSync: { - url: "https://mainnet.era.zksync.io", - zksync: true, - accounts: [deployerPrivateKey], - verifyURL: "https://zksync2-mainnet-explorer.zksync.io/contract_verification", - }, }, verify: { etherscan: { diff --git a/packages/hardhat/package.json b/packages/hardhat/package.json index 8eed81d4..d9c65d7e 100644 --- a/packages/hardhat/package.json +++ b/packages/hardhat/package.json @@ -8,26 +8,28 @@ "deploy:goerli": "hardhat deploy --network goerli && yarn verify --network goerli", "deploy:gnosis": "hardhat deploy --network gnosis && yarn verify --network gnosis", "deploy:sepolia": "hardhat deploy --network sepolia && yarn verify --network sepolia", + "deploy-proxy:sepolia": "hardhat run scripts/reset-proxy.ts --network sepolia && hardhat deploy --network sepolia && yarn verify --network sepolia", "coverage": "hardhat coverage --testfiles \"test/*.spec.ts\" --solcoverjs ./test/coverage.solcover.ts", "fork": "MAINNET_FORKING_ENABLED=true hardhat node --network hardhat --no-deploy", "generate": "hardhat run scripts/generateAccount.ts", "lint": "eslint --config ./.eslintrc.json --ignore-path ./.eslintignore ./*.ts ./deploy/**/*.ts ./scripts/**/*.ts ./test/**/*.ts", "lint-staged": "eslint --config ./.eslintrc.json --ignore-path ./.eslintignore", "test": "hardhat test --network hardhat", - "verify": "hardhat etherscan-verify", + "verify": "hardhat verify", "verify:sepolia": "yarn verify --network sepolia" }, "devDependencies": { "@eth-optimism/hardhat-ovm": "^0.2.4", "@ethersproject/abi": "^5.7.0", "@ethersproject/providers": "^5.7.1", - "@matterlabs/hardhat-zksync-solc": "^0.3.17", - "@matterlabs/hardhat-zksync-verify": "^0.1.8", "@nomicfoundation/hardhat-chai-matchers": "^1.0.3", + "@nomicfoundation/hardhat-ethers": "^3.0.5", "@nomicfoundation/hardhat-network-helpers": "^1.0.8", - "@nomicfoundation/hardhat-toolbox": "^2.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.4", "@nomiclabs/hardhat-ethers": "npm:hardhat-deploy-ethers@^0.3.0-beta.13", - "@nomiclabs/hardhat-etherscan": "^3.1.0", + "@openzeppelin/contracts": "^5.0.0", + "@openzeppelin/contracts-upgradeable": "^5.0.0", + "@openzeppelin/hardhat-upgrades": "^3.0.3", "@typechain/ethers-v5": "^10.1.0", "@typechain/hardhat": "^6.1.3", "@types/eslint": "^8", @@ -40,7 +42,7 @@ "eslint": "^8.26.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.2.1", - "ethers": "^5.7.1", + "ethers": "^6.10.0", "hardhat": "^2.19.2", "hardhat-deploy": "^0.11.26", "hardhat-gas-reporter": "^1.0.9", @@ -51,9 +53,10 @@ "typescript": "^4.9.5" }, "dependencies": { - "@openzeppelin/contracts": "^5.0.0", "dotenv": "^16.0.3", "envfile": "^6.18.0", + "global": "^4.4.0", + "graph": "^0.2.0", "qrcode": "^1.5.1" } } diff --git a/packages/hardhat/scripts/deploy-config-update.ts b/packages/hardhat/scripts/deploy-config-update.ts new file mode 100644 index 00000000..385c3591 --- /dev/null +++ b/packages/hardhat/scripts/deploy-config-update.ts @@ -0,0 +1,38 @@ +import fs from "fs"; +import path from "path"; + +type DeployConfig = { + [network: string]: { + manager: string; + "deed-proxy": string; + "access-manager-proxy": string; + }; +}; + +const filePath = path.resolve(__dirname, "../deploy-config.json"); + +export const updateDeployConfig = (config: DeployConfig) => { + try { + // Convert the object to a JSON string + const jsonData = JSON.stringify(config, null, 2); + // Write the JSON string to a file synchronously + fs.writeFileSync(filePath, jsonData, "utf8"); + console.log("Deploy config successfully updated"); + } catch (error) { + console.error("Error writing to deploy config file:", error); + throw error; // Rethrow or handle as needed + } +}; + +export const getDeployConfig = () => { + try { + // Read the file synchronously + const rawData = fs.readFileSync(filePath, "utf8"); + // Parse the JSON content and return the object + const jsonData = JSON.parse(rawData); + return jsonData as DeployConfig; + } catch (error) { + console.error("Error reading or parsing the file:", error); + throw error; // Rethrow or handle as needed + } +}; diff --git a/packages/hardhat/scripts/export-contract.ts b/packages/hardhat/scripts/export-contract.ts new file mode 100644 index 00000000..7762f5d6 --- /dev/null +++ b/packages/hardhat/scripts/export-contract.ts @@ -0,0 +1,30 @@ +import { Network } from "hardhat/types"; +import fs from "fs"; + +export default function exportContractResult(network: Network, contractName: string, contractResult: any) { + // Export to hardhat single file + try { + const artifact = fs.readFileSync(`./artifacts/contracts/${contractName}.sol/${contractName}.json`, "utf8"); + contractResult = { + ...contractResult, + ...JSON.parse(artifact), + }; + fs.writeFileSync( + `./deployments/${network.name}/${contractName}.json`, + JSON.stringify({ + address: contractResult.address, + abi: contractResult.abi, + // transactionHash: contractResult.transactionHash, + // receipt: contractResult.receipt, + // args: contractResult.args, + // solcInputHash: contractResult.solcInputHash, + // metadata: contractResult.metadata, + // bytecode: contractResult.bytecode, + // deployedBytecode: contractResult.deployedBytecode, + }), + ); + } catch (error) { + console.error("Error during publishing deployement result for contract:" + contractName, error); + throw error; + } +} diff --git a/packages/hardhat/scripts/reset-proxy.ts b/packages/hardhat/scripts/reset-proxy.ts new file mode 100644 index 00000000..18c55365 --- /dev/null +++ b/packages/hardhat/scripts/reset-proxy.ts @@ -0,0 +1,8 @@ +import { getDeployConfig, updateDeployConfig } from "./deploy-config-update"; +import hardhat from "hardhat"; + +console.log(`Resetting proxy addresses for ${hardhat.network.name}`); +const actualConfig = getDeployConfig(); +actualConfig[hardhat.network.name]["deed-proxy"] = ""; +actualConfig[hardhat.network.name]["access-manager-proxy"] = ""; +updateDeployConfig(actualConfig); diff --git a/packages/nextjs/.graphclient/index.ts b/packages/nextjs/.graphclient/index.ts new file mode 100644 index 00000000..3f0a9407 --- /dev/null +++ b/packages/nextjs/.graphclient/index.ts @@ -0,0 +1,1867 @@ +// @ts-nocheck +import { GraphQLResolveInfo, SelectionSetNode, FieldNode, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql'; +import type { GetMeshOptions } from '@graphql-mesh/runtime'; +import type { YamlConfig } from '@graphql-mesh/types'; +import { PubSub } from '@graphql-mesh/utils'; +import { DefaultLogger } from '@graphql-mesh/utils'; +import MeshCache from "@graphql-mesh/cache-localforage"; +import { fetch as fetchFn } from '@whatwg-node/fetch'; + +import { MeshResolvedSource } from '@graphql-mesh/runtime'; +import { MeshTransform, MeshPlugin } from '@graphql-mesh/types'; +import GraphqlHandler from "@graphql-mesh/graphql" +import BareMerger from "@graphql-mesh/merger-bare"; +import { createMeshHTTPHandler, MeshHTTPHandler } from '@graphql-mesh/http'; +import { getMesh, ExecuteMeshFn, SubscribeMeshFn, MeshContext as BaseMeshContext, MeshInstance } from '@graphql-mesh/runtime'; +import { MeshStore, FsStoreStorageAdapter } from '@graphql-mesh/store'; +import { path as pathModule } from '@graphql-mesh/cross-helpers'; +import { ImportFn } from '@graphql-mesh/types'; +import type { Deed3SepoliaTypes } from './sources/Deed3-Sepolia/types'; +import * as importedModule$0 from "./sources/Deed3-Sepolia/introspectionSchema"; +export type Maybe = T | null; +export type InputMaybe = Maybe; +export type Exact = { [K in keyof T]: T[K] }; +export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; +export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; +export type RequireFields = Omit & { [P in K]-?: NonNullable }; + + + +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: string; + String: string; + Boolean: boolean; + Int: number; + Float: number; + BigDecimal: any; + BigInt: any; + Bytes: any; + Int8: any; +}; + +export type Aggregation_interval = + | 'hour' + | 'day'; + +export type Approval = { + id: Scalars['Bytes']; + owner: Scalars['Bytes']; + approved: Scalars['Bytes']; + tokenId: Scalars['BigInt']; + blockNumber: Scalars['BigInt']; + blockTimestamp: Scalars['BigInt']; + transactionHash: Scalars['Bytes']; +}; + +export type ApprovalForAll = { + id: Scalars['Bytes']; + owner: Scalars['Bytes']; + operator: Scalars['Bytes']; + approved: Scalars['Boolean']; + blockNumber: Scalars['BigInt']; + blockTimestamp: Scalars['BigInt']; + transactionHash: Scalars['Bytes']; +}; + +export type ApprovalForAll_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + id_contains?: InputMaybe; + id_not_contains?: InputMaybe; + owner?: InputMaybe; + owner_not?: InputMaybe; + owner_gt?: InputMaybe; + owner_lt?: InputMaybe; + owner_gte?: InputMaybe; + owner_lte?: InputMaybe; + owner_in?: InputMaybe>; + owner_not_in?: InputMaybe>; + owner_contains?: InputMaybe; + owner_not_contains?: InputMaybe; + operator?: InputMaybe; + operator_not?: InputMaybe; + operator_gt?: InputMaybe; + operator_lt?: InputMaybe; + operator_gte?: InputMaybe; + operator_lte?: InputMaybe; + operator_in?: InputMaybe>; + operator_not_in?: InputMaybe>; + operator_contains?: InputMaybe; + operator_not_contains?: InputMaybe; + approved?: InputMaybe; + approved_not?: InputMaybe; + approved_in?: InputMaybe>; + approved_not_in?: InputMaybe>; + blockNumber?: InputMaybe; + blockNumber_not?: InputMaybe; + blockNumber_gt?: InputMaybe; + blockNumber_lt?: InputMaybe; + blockNumber_gte?: InputMaybe; + blockNumber_lte?: InputMaybe; + blockNumber_in?: InputMaybe>; + blockNumber_not_in?: InputMaybe>; + blockTimestamp?: InputMaybe; + blockTimestamp_not?: InputMaybe; + blockTimestamp_gt?: InputMaybe; + blockTimestamp_lt?: InputMaybe; + blockTimestamp_gte?: InputMaybe; + blockTimestamp_lte?: InputMaybe; + blockTimestamp_in?: InputMaybe>; + blockTimestamp_not_in?: InputMaybe>; + transactionHash?: InputMaybe; + transactionHash_not?: InputMaybe; + transactionHash_gt?: InputMaybe; + transactionHash_lt?: InputMaybe; + transactionHash_gte?: InputMaybe; + transactionHash_lte?: InputMaybe; + transactionHash_in?: InputMaybe>; + transactionHash_not_in?: InputMaybe>; + transactionHash_contains?: InputMaybe; + transactionHash_not_contains?: InputMaybe; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type ApprovalForAll_orderBy = + | 'id' + | 'owner' + | 'operator' + | 'approved' + | 'blockNumber' + | 'blockTimestamp' + | 'transactionHash'; + +export type Approval_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + id_contains?: InputMaybe; + id_not_contains?: InputMaybe; + owner?: InputMaybe; + owner_not?: InputMaybe; + owner_gt?: InputMaybe; + owner_lt?: InputMaybe; + owner_gte?: InputMaybe; + owner_lte?: InputMaybe; + owner_in?: InputMaybe>; + owner_not_in?: InputMaybe>; + owner_contains?: InputMaybe; + owner_not_contains?: InputMaybe; + approved?: InputMaybe; + approved_not?: InputMaybe; + approved_gt?: InputMaybe; + approved_lt?: InputMaybe; + approved_gte?: InputMaybe; + approved_lte?: InputMaybe; + approved_in?: InputMaybe>; + approved_not_in?: InputMaybe>; + approved_contains?: InputMaybe; + approved_not_contains?: InputMaybe; + tokenId?: InputMaybe; + tokenId_not?: InputMaybe; + tokenId_gt?: InputMaybe; + tokenId_lt?: InputMaybe; + tokenId_gte?: InputMaybe; + tokenId_lte?: InputMaybe; + tokenId_in?: InputMaybe>; + tokenId_not_in?: InputMaybe>; + blockNumber?: InputMaybe; + blockNumber_not?: InputMaybe; + blockNumber_gt?: InputMaybe; + blockNumber_lt?: InputMaybe; + blockNumber_gte?: InputMaybe; + blockNumber_lte?: InputMaybe; + blockNumber_in?: InputMaybe>; + blockNumber_not_in?: InputMaybe>; + blockTimestamp?: InputMaybe; + blockTimestamp_not?: InputMaybe; + blockTimestamp_gt?: InputMaybe; + blockTimestamp_lt?: InputMaybe; + blockTimestamp_gte?: InputMaybe; + blockTimestamp_lte?: InputMaybe; + blockTimestamp_in?: InputMaybe>; + blockTimestamp_not_in?: InputMaybe>; + transactionHash?: InputMaybe; + transactionHash_not?: InputMaybe; + transactionHash_gt?: InputMaybe; + transactionHash_lt?: InputMaybe; + transactionHash_gte?: InputMaybe; + transactionHash_lte?: InputMaybe; + transactionHash_in?: InputMaybe>; + transactionHash_not_in?: InputMaybe>; + transactionHash_contains?: InputMaybe; + transactionHash_not_contains?: InputMaybe; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type Approval_orderBy = + | 'id' + | 'owner' + | 'approved' + | 'tokenId' + | 'blockNumber' + | 'blockTimestamp' + | 'transactionHash'; + +export type BlockChangedFilter = { + number_gte: Scalars['Int']; +}; + +export type Block_height = { + hash?: InputMaybe; + number?: InputMaybe; + number_gte?: InputMaybe; +}; + +export type DeedEntity = { + id: Scalars['ID']; + deedId: Scalars['BigInt']; + owner: Scalars['Bytes']; + assetType: Scalars['Int']; + isValidated: Scalars['Boolean']; + minter: Scalars['Bytes']; + uri: Scalars['String']; + blockNumber: Scalars['BigInt']; + blockTimestamp: Scalars['BigInt']; + transactionHash: Scalars['Bytes']; + deedMetadata: DeedMetadata; +}; + +export type DeedEntity_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + deedId?: InputMaybe; + deedId_not?: InputMaybe; + deedId_gt?: InputMaybe; + deedId_lt?: InputMaybe; + deedId_gte?: InputMaybe; + deedId_lte?: InputMaybe; + deedId_in?: InputMaybe>; + deedId_not_in?: InputMaybe>; + owner?: InputMaybe; + owner_not?: InputMaybe; + owner_gt?: InputMaybe; + owner_lt?: InputMaybe; + owner_gte?: InputMaybe; + owner_lte?: InputMaybe; + owner_in?: InputMaybe>; + owner_not_in?: InputMaybe>; + owner_contains?: InputMaybe; + owner_not_contains?: InputMaybe; + assetType?: InputMaybe; + assetType_not?: InputMaybe; + assetType_gt?: InputMaybe; + assetType_lt?: InputMaybe; + assetType_gte?: InputMaybe; + assetType_lte?: InputMaybe; + assetType_in?: InputMaybe>; + assetType_not_in?: InputMaybe>; + isValidated?: InputMaybe; + isValidated_not?: InputMaybe; + isValidated_in?: InputMaybe>; + isValidated_not_in?: InputMaybe>; + minter?: InputMaybe; + minter_not?: InputMaybe; + minter_gt?: InputMaybe; + minter_lt?: InputMaybe; + minter_gte?: InputMaybe; + minter_lte?: InputMaybe; + minter_in?: InputMaybe>; + minter_not_in?: InputMaybe>; + minter_contains?: InputMaybe; + minter_not_contains?: InputMaybe; + uri?: InputMaybe; + uri_not?: InputMaybe; + uri_gt?: InputMaybe; + uri_lt?: InputMaybe; + uri_gte?: InputMaybe; + uri_lte?: InputMaybe; + uri_in?: InputMaybe>; + uri_not_in?: InputMaybe>; + uri_contains?: InputMaybe; + uri_contains_nocase?: InputMaybe; + uri_not_contains?: InputMaybe; + uri_not_contains_nocase?: InputMaybe; + uri_starts_with?: InputMaybe; + uri_starts_with_nocase?: InputMaybe; + uri_not_starts_with?: InputMaybe; + uri_not_starts_with_nocase?: InputMaybe; + uri_ends_with?: InputMaybe; + uri_ends_with_nocase?: InputMaybe; + uri_not_ends_with?: InputMaybe; + uri_not_ends_with_nocase?: InputMaybe; + blockNumber?: InputMaybe; + blockNumber_not?: InputMaybe; + blockNumber_gt?: InputMaybe; + blockNumber_lt?: InputMaybe; + blockNumber_gte?: InputMaybe; + blockNumber_lte?: InputMaybe; + blockNumber_in?: InputMaybe>; + blockNumber_not_in?: InputMaybe>; + blockTimestamp?: InputMaybe; + blockTimestamp_not?: InputMaybe; + blockTimestamp_gt?: InputMaybe; + blockTimestamp_lt?: InputMaybe; + blockTimestamp_gte?: InputMaybe; + blockTimestamp_lte?: InputMaybe; + blockTimestamp_in?: InputMaybe>; + blockTimestamp_not_in?: InputMaybe>; + transactionHash?: InputMaybe; + transactionHash_not?: InputMaybe; + transactionHash_gt?: InputMaybe; + transactionHash_lt?: InputMaybe; + transactionHash_gte?: InputMaybe; + transactionHash_lte?: InputMaybe; + transactionHash_in?: InputMaybe>; + transactionHash_not_in?: InputMaybe>; + transactionHash_contains?: InputMaybe; + transactionHash_not_contains?: InputMaybe; + deedMetadata?: InputMaybe; + deedMetadata_not?: InputMaybe; + deedMetadata_gt?: InputMaybe; + deedMetadata_lt?: InputMaybe; + deedMetadata_gte?: InputMaybe; + deedMetadata_lte?: InputMaybe; + deedMetadata_in?: InputMaybe>; + deedMetadata_not_in?: InputMaybe>; + deedMetadata_contains?: InputMaybe; + deedMetadata_contains_nocase?: InputMaybe; + deedMetadata_not_contains?: InputMaybe; + deedMetadata_not_contains_nocase?: InputMaybe; + deedMetadata_starts_with?: InputMaybe; + deedMetadata_starts_with_nocase?: InputMaybe; + deedMetadata_not_starts_with?: InputMaybe; + deedMetadata_not_starts_with_nocase?: InputMaybe; + deedMetadata_ends_with?: InputMaybe; + deedMetadata_ends_with_nocase?: InputMaybe; + deedMetadata_not_ends_with?: InputMaybe; + deedMetadata_not_ends_with_nocase?: InputMaybe; + deedMetadata_?: InputMaybe; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type DeedEntity_orderBy = + | 'id' + | 'deedId' + | 'owner' + | 'assetType' + | 'isValidated' + | 'minter' + | 'uri' + | 'blockNumber' + | 'blockTimestamp' + | 'transactionHash' + | 'deedMetadata' + | 'deedMetadata__id' + | 'deedMetadata__ownerInformation_type' + | 'deedMetadata__ownerInformation_name' + | 'deedMetadata__ownerInformation_position' + | 'deedMetadata__ownerInformation_entityName' + | 'deedMetadata__ownerInformation_entityType' + | 'deedMetadata__propertyDetails_type' + | 'deedMetadata__propertyDetails_address' + | 'deedMetadata__propertyDetails_city' + | 'deedMetadata__propertyDetails_state' + | 'deedMetadata__propertyDetails_size' + | 'deedMetadata__propertyDetails_subType' + | 'deedMetadata__propertyDetails_zoning' + | 'deedMetadata__otherInformation_blockchain' + | 'deedMetadata__otherInformation_wrapper'; + +export type DeedMetadata = { + id: Scalars['ID']; + ownerInformation_type: Scalars['String']; + ownerInformation_name: Scalars['String']; + ownerInformation_position?: Maybe; + ownerInformation_entityName?: Maybe; + ownerInformation_entityType?: Maybe; + ownerInformation_ids: FileInfo; + ownerInformation_operatingAgreement?: Maybe; + ownerInformation_articleIncorporation: FileInfo; + ownerInformation_proofBill?: Maybe; + ownerInformation_supportingDoc?: Maybe>; + propertyDetails_type: Scalars['String']; + propertyDetails_address: Scalars['String']; + propertyDetails_city: Scalars['String']; + propertyDetails_state: Scalars['String']; + propertyDetails_size?: Maybe; + propertyDetails_subType?: Maybe; + propertyDetails_zoning?: Maybe; + propertyDetails_purchaseContract?: Maybe; + propertyDetails_deedOrTitle: FileInfo; + propertyDetails_images?: Maybe>; + otherInformation_blockchain: Scalars['String']; + otherInformation_wrapper: Scalars['String']; +}; + + +export type DeedMetadataownerInformation_supportingDocArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; +}; + + +export type DeedMetadatapropertyDetails_imagesArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; +}; + +export type DeedMetadata_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + ownerInformation_type?: InputMaybe; + ownerInformation_type_not?: InputMaybe; + ownerInformation_type_gt?: InputMaybe; + ownerInformation_type_lt?: InputMaybe; + ownerInformation_type_gte?: InputMaybe; + ownerInformation_type_lte?: InputMaybe; + ownerInformation_type_in?: InputMaybe>; + ownerInformation_type_not_in?: InputMaybe>; + ownerInformation_type_contains?: InputMaybe; + ownerInformation_type_contains_nocase?: InputMaybe; + ownerInformation_type_not_contains?: InputMaybe; + ownerInformation_type_not_contains_nocase?: InputMaybe; + ownerInformation_type_starts_with?: InputMaybe; + ownerInformation_type_starts_with_nocase?: InputMaybe; + ownerInformation_type_not_starts_with?: InputMaybe; + ownerInformation_type_not_starts_with_nocase?: InputMaybe; + ownerInformation_type_ends_with?: InputMaybe; + ownerInformation_type_ends_with_nocase?: InputMaybe; + ownerInformation_type_not_ends_with?: InputMaybe; + ownerInformation_type_not_ends_with_nocase?: InputMaybe; + ownerInformation_name?: InputMaybe; + ownerInformation_name_not?: InputMaybe; + ownerInformation_name_gt?: InputMaybe; + ownerInformation_name_lt?: InputMaybe; + ownerInformation_name_gte?: InputMaybe; + ownerInformation_name_lte?: InputMaybe; + ownerInformation_name_in?: InputMaybe>; + ownerInformation_name_not_in?: InputMaybe>; + ownerInformation_name_contains?: InputMaybe; + ownerInformation_name_contains_nocase?: InputMaybe; + ownerInformation_name_not_contains?: InputMaybe; + ownerInformation_name_not_contains_nocase?: InputMaybe; + ownerInformation_name_starts_with?: InputMaybe; + ownerInformation_name_starts_with_nocase?: InputMaybe; + ownerInformation_name_not_starts_with?: InputMaybe; + ownerInformation_name_not_starts_with_nocase?: InputMaybe; + ownerInformation_name_ends_with?: InputMaybe; + ownerInformation_name_ends_with_nocase?: InputMaybe; + ownerInformation_name_not_ends_with?: InputMaybe; + ownerInformation_name_not_ends_with_nocase?: InputMaybe; + ownerInformation_position?: InputMaybe; + ownerInformation_position_not?: InputMaybe; + ownerInformation_position_gt?: InputMaybe; + ownerInformation_position_lt?: InputMaybe; + ownerInformation_position_gte?: InputMaybe; + ownerInformation_position_lte?: InputMaybe; + ownerInformation_position_in?: InputMaybe>; + ownerInformation_position_not_in?: InputMaybe>; + ownerInformation_position_contains?: InputMaybe; + ownerInformation_position_contains_nocase?: InputMaybe; + ownerInformation_position_not_contains?: InputMaybe; + ownerInformation_position_not_contains_nocase?: InputMaybe; + ownerInformation_position_starts_with?: InputMaybe; + ownerInformation_position_starts_with_nocase?: InputMaybe; + ownerInformation_position_not_starts_with?: InputMaybe; + ownerInformation_position_not_starts_with_nocase?: InputMaybe; + ownerInformation_position_ends_with?: InputMaybe; + ownerInformation_position_ends_with_nocase?: InputMaybe; + ownerInformation_position_not_ends_with?: InputMaybe; + ownerInformation_position_not_ends_with_nocase?: InputMaybe; + ownerInformation_entityName?: InputMaybe; + ownerInformation_entityName_not?: InputMaybe; + ownerInformation_entityName_gt?: InputMaybe; + ownerInformation_entityName_lt?: InputMaybe; + ownerInformation_entityName_gte?: InputMaybe; + ownerInformation_entityName_lte?: InputMaybe; + ownerInformation_entityName_in?: InputMaybe>; + ownerInformation_entityName_not_in?: InputMaybe>; + ownerInformation_entityName_contains?: InputMaybe; + ownerInformation_entityName_contains_nocase?: InputMaybe; + ownerInformation_entityName_not_contains?: InputMaybe; + ownerInformation_entityName_not_contains_nocase?: InputMaybe; + ownerInformation_entityName_starts_with?: InputMaybe; + ownerInformation_entityName_starts_with_nocase?: InputMaybe; + ownerInformation_entityName_not_starts_with?: InputMaybe; + ownerInformation_entityName_not_starts_with_nocase?: InputMaybe; + ownerInformation_entityName_ends_with?: InputMaybe; + ownerInformation_entityName_ends_with_nocase?: InputMaybe; + ownerInformation_entityName_not_ends_with?: InputMaybe; + ownerInformation_entityName_not_ends_with_nocase?: InputMaybe; + ownerInformation_entityType?: InputMaybe; + ownerInformation_entityType_not?: InputMaybe; + ownerInformation_entityType_gt?: InputMaybe; + ownerInformation_entityType_lt?: InputMaybe; + ownerInformation_entityType_gte?: InputMaybe; + ownerInformation_entityType_lte?: InputMaybe; + ownerInformation_entityType_in?: InputMaybe>; + ownerInformation_entityType_not_in?: InputMaybe>; + ownerInformation_entityType_contains?: InputMaybe; + ownerInformation_entityType_contains_nocase?: InputMaybe; + ownerInformation_entityType_not_contains?: InputMaybe; + ownerInformation_entityType_not_contains_nocase?: InputMaybe; + ownerInformation_entityType_starts_with?: InputMaybe; + ownerInformation_entityType_starts_with_nocase?: InputMaybe; + ownerInformation_entityType_not_starts_with?: InputMaybe; + ownerInformation_entityType_not_starts_with_nocase?: InputMaybe; + ownerInformation_entityType_ends_with?: InputMaybe; + ownerInformation_entityType_ends_with_nocase?: InputMaybe; + ownerInformation_entityType_not_ends_with?: InputMaybe; + ownerInformation_entityType_not_ends_with_nocase?: InputMaybe; + ownerInformation_ids?: InputMaybe; + ownerInformation_ids_not?: InputMaybe; + ownerInformation_ids_gt?: InputMaybe; + ownerInformation_ids_lt?: InputMaybe; + ownerInformation_ids_gte?: InputMaybe; + ownerInformation_ids_lte?: InputMaybe; + ownerInformation_ids_in?: InputMaybe>; + ownerInformation_ids_not_in?: InputMaybe>; + ownerInformation_ids_contains?: InputMaybe; + ownerInformation_ids_contains_nocase?: InputMaybe; + ownerInformation_ids_not_contains?: InputMaybe; + ownerInformation_ids_not_contains_nocase?: InputMaybe; + ownerInformation_ids_starts_with?: InputMaybe; + ownerInformation_ids_starts_with_nocase?: InputMaybe; + ownerInformation_ids_not_starts_with?: InputMaybe; + ownerInformation_ids_not_starts_with_nocase?: InputMaybe; + ownerInformation_ids_ends_with?: InputMaybe; + ownerInformation_ids_ends_with_nocase?: InputMaybe; + ownerInformation_ids_not_ends_with?: InputMaybe; + ownerInformation_ids_not_ends_with_nocase?: InputMaybe; + ownerInformation_ids_?: InputMaybe; + ownerInformation_operatingAgreement?: InputMaybe; + ownerInformation_operatingAgreement_not?: InputMaybe; + ownerInformation_operatingAgreement_gt?: InputMaybe; + ownerInformation_operatingAgreement_lt?: InputMaybe; + ownerInformation_operatingAgreement_gte?: InputMaybe; + ownerInformation_operatingAgreement_lte?: InputMaybe; + ownerInformation_operatingAgreement_in?: InputMaybe>; + ownerInformation_operatingAgreement_not_in?: InputMaybe>; + ownerInformation_operatingAgreement_contains?: InputMaybe; + ownerInformation_operatingAgreement_contains_nocase?: InputMaybe; + ownerInformation_operatingAgreement_not_contains?: InputMaybe; + ownerInformation_operatingAgreement_not_contains_nocase?: InputMaybe; + ownerInformation_operatingAgreement_starts_with?: InputMaybe; + ownerInformation_operatingAgreement_starts_with_nocase?: InputMaybe; + ownerInformation_operatingAgreement_not_starts_with?: InputMaybe; + ownerInformation_operatingAgreement_not_starts_with_nocase?: InputMaybe; + ownerInformation_operatingAgreement_ends_with?: InputMaybe; + ownerInformation_operatingAgreement_ends_with_nocase?: InputMaybe; + ownerInformation_operatingAgreement_not_ends_with?: InputMaybe; + ownerInformation_operatingAgreement_not_ends_with_nocase?: InputMaybe; + ownerInformation_operatingAgreement_?: InputMaybe; + ownerInformation_articleIncorporation?: InputMaybe; + ownerInformation_articleIncorporation_not?: InputMaybe; + ownerInformation_articleIncorporation_gt?: InputMaybe; + ownerInformation_articleIncorporation_lt?: InputMaybe; + ownerInformation_articleIncorporation_gte?: InputMaybe; + ownerInformation_articleIncorporation_lte?: InputMaybe; + ownerInformation_articleIncorporation_in?: InputMaybe>; + ownerInformation_articleIncorporation_not_in?: InputMaybe>; + ownerInformation_articleIncorporation_contains?: InputMaybe; + ownerInformation_articleIncorporation_contains_nocase?: InputMaybe; + ownerInformation_articleIncorporation_not_contains?: InputMaybe; + ownerInformation_articleIncorporation_not_contains_nocase?: InputMaybe; + ownerInformation_articleIncorporation_starts_with?: InputMaybe; + ownerInformation_articleIncorporation_starts_with_nocase?: InputMaybe; + ownerInformation_articleIncorporation_not_starts_with?: InputMaybe; + ownerInformation_articleIncorporation_not_starts_with_nocase?: InputMaybe; + ownerInformation_articleIncorporation_ends_with?: InputMaybe; + ownerInformation_articleIncorporation_ends_with_nocase?: InputMaybe; + ownerInformation_articleIncorporation_not_ends_with?: InputMaybe; + ownerInformation_articleIncorporation_not_ends_with_nocase?: InputMaybe; + ownerInformation_articleIncorporation_?: InputMaybe; + ownerInformation_proofBill?: InputMaybe; + ownerInformation_proofBill_not?: InputMaybe; + ownerInformation_proofBill_gt?: InputMaybe; + ownerInformation_proofBill_lt?: InputMaybe; + ownerInformation_proofBill_gte?: InputMaybe; + ownerInformation_proofBill_lte?: InputMaybe; + ownerInformation_proofBill_in?: InputMaybe>; + ownerInformation_proofBill_not_in?: InputMaybe>; + ownerInformation_proofBill_contains?: InputMaybe; + ownerInformation_proofBill_contains_nocase?: InputMaybe; + ownerInformation_proofBill_not_contains?: InputMaybe; + ownerInformation_proofBill_not_contains_nocase?: InputMaybe; + ownerInformation_proofBill_starts_with?: InputMaybe; + ownerInformation_proofBill_starts_with_nocase?: InputMaybe; + ownerInformation_proofBill_not_starts_with?: InputMaybe; + ownerInformation_proofBill_not_starts_with_nocase?: InputMaybe; + ownerInformation_proofBill_ends_with?: InputMaybe; + ownerInformation_proofBill_ends_with_nocase?: InputMaybe; + ownerInformation_proofBill_not_ends_with?: InputMaybe; + ownerInformation_proofBill_not_ends_with_nocase?: InputMaybe; + ownerInformation_proofBill_?: InputMaybe; + ownerInformation_supportingDoc?: InputMaybe>; + ownerInformation_supportingDoc_not?: InputMaybe>; + ownerInformation_supportingDoc_contains?: InputMaybe>; + ownerInformation_supportingDoc_contains_nocase?: InputMaybe>; + ownerInformation_supportingDoc_not_contains?: InputMaybe>; + ownerInformation_supportingDoc_not_contains_nocase?: InputMaybe>; + ownerInformation_supportingDoc_?: InputMaybe; + propertyDetails_type?: InputMaybe; + propertyDetails_type_not?: InputMaybe; + propertyDetails_type_gt?: InputMaybe; + propertyDetails_type_lt?: InputMaybe; + propertyDetails_type_gte?: InputMaybe; + propertyDetails_type_lte?: InputMaybe; + propertyDetails_type_in?: InputMaybe>; + propertyDetails_type_not_in?: InputMaybe>; + propertyDetails_type_contains?: InputMaybe; + propertyDetails_type_contains_nocase?: InputMaybe; + propertyDetails_type_not_contains?: InputMaybe; + propertyDetails_type_not_contains_nocase?: InputMaybe; + propertyDetails_type_starts_with?: InputMaybe; + propertyDetails_type_starts_with_nocase?: InputMaybe; + propertyDetails_type_not_starts_with?: InputMaybe; + propertyDetails_type_not_starts_with_nocase?: InputMaybe; + propertyDetails_type_ends_with?: InputMaybe; + propertyDetails_type_ends_with_nocase?: InputMaybe; + propertyDetails_type_not_ends_with?: InputMaybe; + propertyDetails_type_not_ends_with_nocase?: InputMaybe; + propertyDetails_address?: InputMaybe; + propertyDetails_address_not?: InputMaybe; + propertyDetails_address_gt?: InputMaybe; + propertyDetails_address_lt?: InputMaybe; + propertyDetails_address_gte?: InputMaybe; + propertyDetails_address_lte?: InputMaybe; + propertyDetails_address_in?: InputMaybe>; + propertyDetails_address_not_in?: InputMaybe>; + propertyDetails_address_contains?: InputMaybe; + propertyDetails_address_contains_nocase?: InputMaybe; + propertyDetails_address_not_contains?: InputMaybe; + propertyDetails_address_not_contains_nocase?: InputMaybe; + propertyDetails_address_starts_with?: InputMaybe; + propertyDetails_address_starts_with_nocase?: InputMaybe; + propertyDetails_address_not_starts_with?: InputMaybe; + propertyDetails_address_not_starts_with_nocase?: InputMaybe; + propertyDetails_address_ends_with?: InputMaybe; + propertyDetails_address_ends_with_nocase?: InputMaybe; + propertyDetails_address_not_ends_with?: InputMaybe; + propertyDetails_address_not_ends_with_nocase?: InputMaybe; + propertyDetails_city?: InputMaybe; + propertyDetails_city_not?: InputMaybe; + propertyDetails_city_gt?: InputMaybe; + propertyDetails_city_lt?: InputMaybe; + propertyDetails_city_gte?: InputMaybe; + propertyDetails_city_lte?: InputMaybe; + propertyDetails_city_in?: InputMaybe>; + propertyDetails_city_not_in?: InputMaybe>; + propertyDetails_city_contains?: InputMaybe; + propertyDetails_city_contains_nocase?: InputMaybe; + propertyDetails_city_not_contains?: InputMaybe; + propertyDetails_city_not_contains_nocase?: InputMaybe; + propertyDetails_city_starts_with?: InputMaybe; + propertyDetails_city_starts_with_nocase?: InputMaybe; + propertyDetails_city_not_starts_with?: InputMaybe; + propertyDetails_city_not_starts_with_nocase?: InputMaybe; + propertyDetails_city_ends_with?: InputMaybe; + propertyDetails_city_ends_with_nocase?: InputMaybe; + propertyDetails_city_not_ends_with?: InputMaybe; + propertyDetails_city_not_ends_with_nocase?: InputMaybe; + propertyDetails_state?: InputMaybe; + propertyDetails_state_not?: InputMaybe; + propertyDetails_state_gt?: InputMaybe; + propertyDetails_state_lt?: InputMaybe; + propertyDetails_state_gte?: InputMaybe; + propertyDetails_state_lte?: InputMaybe; + propertyDetails_state_in?: InputMaybe>; + propertyDetails_state_not_in?: InputMaybe>; + propertyDetails_state_contains?: InputMaybe; + propertyDetails_state_contains_nocase?: InputMaybe; + propertyDetails_state_not_contains?: InputMaybe; + propertyDetails_state_not_contains_nocase?: InputMaybe; + propertyDetails_state_starts_with?: InputMaybe; + propertyDetails_state_starts_with_nocase?: InputMaybe; + propertyDetails_state_not_starts_with?: InputMaybe; + propertyDetails_state_not_starts_with_nocase?: InputMaybe; + propertyDetails_state_ends_with?: InputMaybe; + propertyDetails_state_ends_with_nocase?: InputMaybe; + propertyDetails_state_not_ends_with?: InputMaybe; + propertyDetails_state_not_ends_with_nocase?: InputMaybe; + propertyDetails_size?: InputMaybe; + propertyDetails_size_not?: InputMaybe; + propertyDetails_size_gt?: InputMaybe; + propertyDetails_size_lt?: InputMaybe; + propertyDetails_size_gte?: InputMaybe; + propertyDetails_size_lte?: InputMaybe; + propertyDetails_size_in?: InputMaybe>; + propertyDetails_size_not_in?: InputMaybe>; + propertyDetails_size_contains?: InputMaybe; + propertyDetails_size_contains_nocase?: InputMaybe; + propertyDetails_size_not_contains?: InputMaybe; + propertyDetails_size_not_contains_nocase?: InputMaybe; + propertyDetails_size_starts_with?: InputMaybe; + propertyDetails_size_starts_with_nocase?: InputMaybe; + propertyDetails_size_not_starts_with?: InputMaybe; + propertyDetails_size_not_starts_with_nocase?: InputMaybe; + propertyDetails_size_ends_with?: InputMaybe; + propertyDetails_size_ends_with_nocase?: InputMaybe; + propertyDetails_size_not_ends_with?: InputMaybe; + propertyDetails_size_not_ends_with_nocase?: InputMaybe; + propertyDetails_subType?: InputMaybe; + propertyDetails_subType_not?: InputMaybe; + propertyDetails_subType_gt?: InputMaybe; + propertyDetails_subType_lt?: InputMaybe; + propertyDetails_subType_gte?: InputMaybe; + propertyDetails_subType_lte?: InputMaybe; + propertyDetails_subType_in?: InputMaybe>; + propertyDetails_subType_not_in?: InputMaybe>; + propertyDetails_subType_contains?: InputMaybe; + propertyDetails_subType_contains_nocase?: InputMaybe; + propertyDetails_subType_not_contains?: InputMaybe; + propertyDetails_subType_not_contains_nocase?: InputMaybe; + propertyDetails_subType_starts_with?: InputMaybe; + propertyDetails_subType_starts_with_nocase?: InputMaybe; + propertyDetails_subType_not_starts_with?: InputMaybe; + propertyDetails_subType_not_starts_with_nocase?: InputMaybe; + propertyDetails_subType_ends_with?: InputMaybe; + propertyDetails_subType_ends_with_nocase?: InputMaybe; + propertyDetails_subType_not_ends_with?: InputMaybe; + propertyDetails_subType_not_ends_with_nocase?: InputMaybe; + propertyDetails_zoning?: InputMaybe; + propertyDetails_zoning_not?: InputMaybe; + propertyDetails_zoning_gt?: InputMaybe; + propertyDetails_zoning_lt?: InputMaybe; + propertyDetails_zoning_gte?: InputMaybe; + propertyDetails_zoning_lte?: InputMaybe; + propertyDetails_zoning_in?: InputMaybe>; + propertyDetails_zoning_not_in?: InputMaybe>; + propertyDetails_zoning_contains?: InputMaybe; + propertyDetails_zoning_contains_nocase?: InputMaybe; + propertyDetails_zoning_not_contains?: InputMaybe; + propertyDetails_zoning_not_contains_nocase?: InputMaybe; + propertyDetails_zoning_starts_with?: InputMaybe; + propertyDetails_zoning_starts_with_nocase?: InputMaybe; + propertyDetails_zoning_not_starts_with?: InputMaybe; + propertyDetails_zoning_not_starts_with_nocase?: InputMaybe; + propertyDetails_zoning_ends_with?: InputMaybe; + propertyDetails_zoning_ends_with_nocase?: InputMaybe; + propertyDetails_zoning_not_ends_with?: InputMaybe; + propertyDetails_zoning_not_ends_with_nocase?: InputMaybe; + propertyDetails_purchaseContract?: InputMaybe; + propertyDetails_purchaseContract_not?: InputMaybe; + propertyDetails_purchaseContract_gt?: InputMaybe; + propertyDetails_purchaseContract_lt?: InputMaybe; + propertyDetails_purchaseContract_gte?: InputMaybe; + propertyDetails_purchaseContract_lte?: InputMaybe; + propertyDetails_purchaseContract_in?: InputMaybe>; + propertyDetails_purchaseContract_not_in?: InputMaybe>; + propertyDetails_purchaseContract_contains?: InputMaybe; + propertyDetails_purchaseContract_contains_nocase?: InputMaybe; + propertyDetails_purchaseContract_not_contains?: InputMaybe; + propertyDetails_purchaseContract_not_contains_nocase?: InputMaybe; + propertyDetails_purchaseContract_starts_with?: InputMaybe; + propertyDetails_purchaseContract_starts_with_nocase?: InputMaybe; + propertyDetails_purchaseContract_not_starts_with?: InputMaybe; + propertyDetails_purchaseContract_not_starts_with_nocase?: InputMaybe; + propertyDetails_purchaseContract_ends_with?: InputMaybe; + propertyDetails_purchaseContract_ends_with_nocase?: InputMaybe; + propertyDetails_purchaseContract_not_ends_with?: InputMaybe; + propertyDetails_purchaseContract_not_ends_with_nocase?: InputMaybe; + propertyDetails_purchaseContract_?: InputMaybe; + propertyDetails_deedOrTitle?: InputMaybe; + propertyDetails_deedOrTitle_not?: InputMaybe; + propertyDetails_deedOrTitle_gt?: InputMaybe; + propertyDetails_deedOrTitle_lt?: InputMaybe; + propertyDetails_deedOrTitle_gte?: InputMaybe; + propertyDetails_deedOrTitle_lte?: InputMaybe; + propertyDetails_deedOrTitle_in?: InputMaybe>; + propertyDetails_deedOrTitle_not_in?: InputMaybe>; + propertyDetails_deedOrTitle_contains?: InputMaybe; + propertyDetails_deedOrTitle_contains_nocase?: InputMaybe; + propertyDetails_deedOrTitle_not_contains?: InputMaybe; + propertyDetails_deedOrTitle_not_contains_nocase?: InputMaybe; + propertyDetails_deedOrTitle_starts_with?: InputMaybe; + propertyDetails_deedOrTitle_starts_with_nocase?: InputMaybe; + propertyDetails_deedOrTitle_not_starts_with?: InputMaybe; + propertyDetails_deedOrTitle_not_starts_with_nocase?: InputMaybe; + propertyDetails_deedOrTitle_ends_with?: InputMaybe; + propertyDetails_deedOrTitle_ends_with_nocase?: InputMaybe; + propertyDetails_deedOrTitle_not_ends_with?: InputMaybe; + propertyDetails_deedOrTitle_not_ends_with_nocase?: InputMaybe; + propertyDetails_deedOrTitle_?: InputMaybe; + propertyDetails_images?: InputMaybe>; + propertyDetails_images_not?: InputMaybe>; + propertyDetails_images_contains?: InputMaybe>; + propertyDetails_images_contains_nocase?: InputMaybe>; + propertyDetails_images_not_contains?: InputMaybe>; + propertyDetails_images_not_contains_nocase?: InputMaybe>; + propertyDetails_images_?: InputMaybe; + otherInformation_blockchain?: InputMaybe; + otherInformation_blockchain_not?: InputMaybe; + otherInformation_blockchain_gt?: InputMaybe; + otherInformation_blockchain_lt?: InputMaybe; + otherInformation_blockchain_gte?: InputMaybe; + otherInformation_blockchain_lte?: InputMaybe; + otherInformation_blockchain_in?: InputMaybe>; + otherInformation_blockchain_not_in?: InputMaybe>; + otherInformation_blockchain_contains?: InputMaybe; + otherInformation_blockchain_contains_nocase?: InputMaybe; + otherInformation_blockchain_not_contains?: InputMaybe; + otherInformation_blockchain_not_contains_nocase?: InputMaybe; + otherInformation_blockchain_starts_with?: InputMaybe; + otherInformation_blockchain_starts_with_nocase?: InputMaybe; + otherInformation_blockchain_not_starts_with?: InputMaybe; + otherInformation_blockchain_not_starts_with_nocase?: InputMaybe; + otherInformation_blockchain_ends_with?: InputMaybe; + otherInformation_blockchain_ends_with_nocase?: InputMaybe; + otherInformation_blockchain_not_ends_with?: InputMaybe; + otherInformation_blockchain_not_ends_with_nocase?: InputMaybe; + otherInformation_wrapper?: InputMaybe; + otherInformation_wrapper_not?: InputMaybe; + otherInformation_wrapper_gt?: InputMaybe; + otherInformation_wrapper_lt?: InputMaybe; + otherInformation_wrapper_gte?: InputMaybe; + otherInformation_wrapper_lte?: InputMaybe; + otherInformation_wrapper_in?: InputMaybe>; + otherInformation_wrapper_not_in?: InputMaybe>; + otherInformation_wrapper_contains?: InputMaybe; + otherInformation_wrapper_contains_nocase?: InputMaybe; + otherInformation_wrapper_not_contains?: InputMaybe; + otherInformation_wrapper_not_contains_nocase?: InputMaybe; + otherInformation_wrapper_starts_with?: InputMaybe; + otherInformation_wrapper_starts_with_nocase?: InputMaybe; + otherInformation_wrapper_not_starts_with?: InputMaybe; + otherInformation_wrapper_not_starts_with_nocase?: InputMaybe; + otherInformation_wrapper_ends_with?: InputMaybe; + otherInformation_wrapper_ends_with_nocase?: InputMaybe; + otherInformation_wrapper_not_ends_with?: InputMaybe; + otherInformation_wrapper_not_ends_with_nocase?: InputMaybe; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type DeedMetadata_orderBy = + | 'id' + | 'ownerInformation_type' + | 'ownerInformation_name' + | 'ownerInformation_position' + | 'ownerInformation_entityName' + | 'ownerInformation_entityType' + | 'ownerInformation_ids' + | 'ownerInformation_ids__id' + | 'ownerInformation_ids__name' + | 'ownerInformation_ids__size' + | 'ownerInformation_ids__type' + | 'ownerInformation_ids__timestamp' + | 'ownerInformation_operatingAgreement' + | 'ownerInformation_operatingAgreement__id' + | 'ownerInformation_operatingAgreement__name' + | 'ownerInformation_operatingAgreement__size' + | 'ownerInformation_operatingAgreement__type' + | 'ownerInformation_operatingAgreement__timestamp' + | 'ownerInformation_articleIncorporation' + | 'ownerInformation_articleIncorporation__id' + | 'ownerInformation_articleIncorporation__name' + | 'ownerInformation_articleIncorporation__size' + | 'ownerInformation_articleIncorporation__type' + | 'ownerInformation_articleIncorporation__timestamp' + | 'ownerInformation_proofBill' + | 'ownerInformation_proofBill__id' + | 'ownerInformation_proofBill__name' + | 'ownerInformation_proofBill__size' + | 'ownerInformation_proofBill__type' + | 'ownerInformation_proofBill__timestamp' + | 'ownerInformation_supportingDoc' + | 'propertyDetails_type' + | 'propertyDetails_address' + | 'propertyDetails_city' + | 'propertyDetails_state' + | 'propertyDetails_size' + | 'propertyDetails_subType' + | 'propertyDetails_zoning' + | 'propertyDetails_purchaseContract' + | 'propertyDetails_purchaseContract__id' + | 'propertyDetails_purchaseContract__name' + | 'propertyDetails_purchaseContract__size' + | 'propertyDetails_purchaseContract__type' + | 'propertyDetails_purchaseContract__timestamp' + | 'propertyDetails_deedOrTitle' + | 'propertyDetails_deedOrTitle__id' + | 'propertyDetails_deedOrTitle__name' + | 'propertyDetails_deedOrTitle__size' + | 'propertyDetails_deedOrTitle__type' + | 'propertyDetails_deedOrTitle__timestamp' + | 'propertyDetails_images' + | 'otherInformation_blockchain' + | 'otherInformation_wrapper'; + +export type FileInfo = { + id: Scalars['ID']; + name: Scalars['String']; + size: Scalars['BigInt']; + type: Scalars['String']; + timestamp: Scalars['String']; +}; + +export type FileInfo_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + name?: InputMaybe; + name_not?: InputMaybe; + name_gt?: InputMaybe; + name_lt?: InputMaybe; + name_gte?: InputMaybe; + name_lte?: InputMaybe; + name_in?: InputMaybe>; + name_not_in?: InputMaybe>; + name_contains?: InputMaybe; + name_contains_nocase?: InputMaybe; + name_not_contains?: InputMaybe; + name_not_contains_nocase?: InputMaybe; + name_starts_with?: InputMaybe; + name_starts_with_nocase?: InputMaybe; + name_not_starts_with?: InputMaybe; + name_not_starts_with_nocase?: InputMaybe; + name_ends_with?: InputMaybe; + name_ends_with_nocase?: InputMaybe; + name_not_ends_with?: InputMaybe; + name_not_ends_with_nocase?: InputMaybe; + size?: InputMaybe; + size_not?: InputMaybe; + size_gt?: InputMaybe; + size_lt?: InputMaybe; + size_gte?: InputMaybe; + size_lte?: InputMaybe; + size_in?: InputMaybe>; + size_not_in?: InputMaybe>; + type?: InputMaybe; + type_not?: InputMaybe; + type_gt?: InputMaybe; + type_lt?: InputMaybe; + type_gte?: InputMaybe; + type_lte?: InputMaybe; + type_in?: InputMaybe>; + type_not_in?: InputMaybe>; + type_contains?: InputMaybe; + type_contains_nocase?: InputMaybe; + type_not_contains?: InputMaybe; + type_not_contains_nocase?: InputMaybe; + type_starts_with?: InputMaybe; + type_starts_with_nocase?: InputMaybe; + type_not_starts_with?: InputMaybe; + type_not_starts_with_nocase?: InputMaybe; + type_ends_with?: InputMaybe; + type_ends_with_nocase?: InputMaybe; + type_not_ends_with?: InputMaybe; + type_not_ends_with_nocase?: InputMaybe; + timestamp?: InputMaybe; + timestamp_not?: InputMaybe; + timestamp_gt?: InputMaybe; + timestamp_lt?: InputMaybe; + timestamp_gte?: InputMaybe; + timestamp_lte?: InputMaybe; + timestamp_in?: InputMaybe>; + timestamp_not_in?: InputMaybe>; + timestamp_contains?: InputMaybe; + timestamp_contains_nocase?: InputMaybe; + timestamp_not_contains?: InputMaybe; + timestamp_not_contains_nocase?: InputMaybe; + timestamp_starts_with?: InputMaybe; + timestamp_starts_with_nocase?: InputMaybe; + timestamp_not_starts_with?: InputMaybe; + timestamp_not_starts_with_nocase?: InputMaybe; + timestamp_ends_with?: InputMaybe; + timestamp_ends_with_nocase?: InputMaybe; + timestamp_not_ends_with?: InputMaybe; + timestamp_not_ends_with_nocase?: InputMaybe; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type FileInfo_orderBy = + | 'id' + | 'name' + | 'size' + | 'type' + | 'timestamp'; + +/** Defines the order direction, either ascending or descending */ +export type OrderDirection = + | 'asc' + | 'desc'; + +export type Query = { + deedEntity?: Maybe; + deedEntities: Array; + deedMetadata?: Maybe; + deedMetadata_collection: Array; + transfer?: Maybe; + transfers: Array; + approval?: Maybe; + approvals: Array; + approvalForAll?: Maybe; + approvalForAlls: Array; + fileInfo?: Maybe; + fileInfos: Array; + /** Access to subgraph metadata */ + _meta?: Maybe<_Meta_>; +}; + + +export type QuerydeedEntityArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerydeedEntitiesArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerydeedMetadataArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerydeedMetadata_collectionArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerytransferArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerytransfersArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryapprovalArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryapprovalsArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryapprovalForAllArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryapprovalForAllsArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryfileInfoArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryfileInfosArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type Query_metaArgs = { + block?: InputMaybe; +}; + +export type Subscription = { + deedEntity?: Maybe; + deedEntities: Array; + deedMetadata?: Maybe; + deedMetadata_collection: Array; + transfer?: Maybe; + transfers: Array; + approval?: Maybe; + approvals: Array; + approvalForAll?: Maybe; + approvalForAlls: Array; + fileInfo?: Maybe; + fileInfos: Array; + /** Access to subgraph metadata */ + _meta?: Maybe<_Meta_>; +}; + + +export type SubscriptiondeedEntityArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptiondeedEntitiesArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptiondeedMetadataArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptiondeedMetadata_collectionArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptiontransferArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptiontransfersArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionapprovalArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionapprovalsArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionapprovalForAllArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionapprovalForAllsArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionfileInfoArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionfileInfosArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type Subscription_metaArgs = { + block?: InputMaybe; +}; + +export type Transfer = { + id: Scalars['Bytes']; + from: Scalars['Bytes']; + to: Scalars['Bytes']; + tokenId: Scalars['BigInt']; + blockNumber: Scalars['BigInt']; + blockTimestamp: Scalars['BigInt']; + transactionHash: Scalars['Bytes']; +}; + +export type Transfer_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + id_contains?: InputMaybe; + id_not_contains?: InputMaybe; + from?: InputMaybe; + from_not?: InputMaybe; + from_gt?: InputMaybe; + from_lt?: InputMaybe; + from_gte?: InputMaybe; + from_lte?: InputMaybe; + from_in?: InputMaybe>; + from_not_in?: InputMaybe>; + from_contains?: InputMaybe; + from_not_contains?: InputMaybe; + to?: InputMaybe; + to_not?: InputMaybe; + to_gt?: InputMaybe; + to_lt?: InputMaybe; + to_gte?: InputMaybe; + to_lte?: InputMaybe; + to_in?: InputMaybe>; + to_not_in?: InputMaybe>; + to_contains?: InputMaybe; + to_not_contains?: InputMaybe; + tokenId?: InputMaybe; + tokenId_not?: InputMaybe; + tokenId_gt?: InputMaybe; + tokenId_lt?: InputMaybe; + tokenId_gte?: InputMaybe; + tokenId_lte?: InputMaybe; + tokenId_in?: InputMaybe>; + tokenId_not_in?: InputMaybe>; + blockNumber?: InputMaybe; + blockNumber_not?: InputMaybe; + blockNumber_gt?: InputMaybe; + blockNumber_lt?: InputMaybe; + blockNumber_gte?: InputMaybe; + blockNumber_lte?: InputMaybe; + blockNumber_in?: InputMaybe>; + blockNumber_not_in?: InputMaybe>; + blockTimestamp?: InputMaybe; + blockTimestamp_not?: InputMaybe; + blockTimestamp_gt?: InputMaybe; + blockTimestamp_lt?: InputMaybe; + blockTimestamp_gte?: InputMaybe; + blockTimestamp_lte?: InputMaybe; + blockTimestamp_in?: InputMaybe>; + blockTimestamp_not_in?: InputMaybe>; + transactionHash?: InputMaybe; + transactionHash_not?: InputMaybe; + transactionHash_gt?: InputMaybe; + transactionHash_lt?: InputMaybe; + transactionHash_gte?: InputMaybe; + transactionHash_lte?: InputMaybe; + transactionHash_in?: InputMaybe>; + transactionHash_not_in?: InputMaybe>; + transactionHash_contains?: InputMaybe; + transactionHash_not_contains?: InputMaybe; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type Transfer_orderBy = + | 'id' + | 'from' + | 'to' + | 'tokenId' + | 'blockNumber' + | 'blockTimestamp' + | 'transactionHash'; + +export type _Block_ = { + /** The hash of the block */ + hash?: Maybe; + /** The block number */ + number: Scalars['Int']; + /** Integer representation of the timestamp stored in blocks for the chain */ + timestamp?: Maybe; +}; + +/** The type for the top-level _meta field */ +export type _Meta_ = { + /** + * Information about a specific subgraph block. The hash of the block + * will be null if the _meta field has a block constraint that asks for + * a block number. It will be filled if the _meta field has no block constraint + * and therefore asks for the latest block + * + */ + block: _Block_; + /** The deployment ID */ + deployment: Scalars['String']; + /** If `true`, the subgraph encountered indexing errors at some past block */ + hasIndexingErrors: Scalars['Boolean']; +}; + +export type _SubgraphErrorPolicy_ = + /** Data will be returned even if the subgraph has indexing errors */ + | 'allow' + /** If the subgraph has indexing errors, data will be omitted. The default. */ + | 'deny'; + +export type WithIndex = TObject & Record; +export type ResolversObject = WithIndex; + +export type ResolverTypeWrapper = Promise | T; + + +export type ResolverWithResolve = { + resolve: ResolverFn; +}; + +export type LegacyStitchingResolver = { + fragment: string; + resolve: ResolverFn; +}; + +export type NewStitchingResolver = { + selectionSet: string | ((fieldNode: FieldNode) => SelectionSetNode); + resolve: ResolverFn; +}; +export type StitchingResolver = LegacyStitchingResolver | NewStitchingResolver; +export type Resolver = + | ResolverFn + | ResolverWithResolve + | StitchingResolver; + +export type ResolverFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => Promise | TResult; + +export type SubscriptionSubscribeFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => AsyncIterable | Promise>; + +export type SubscriptionResolveFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => TResult | Promise; + +export interface SubscriptionSubscriberObject { + subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>; + resolve?: SubscriptionResolveFn; +} + +export interface SubscriptionResolverObject { + subscribe: SubscriptionSubscribeFn; + resolve: SubscriptionResolveFn; +} + +export type SubscriptionObject = + | SubscriptionSubscriberObject + | SubscriptionResolverObject; + +export type SubscriptionResolver = + | ((...args: any[]) => SubscriptionObject) + | SubscriptionObject; + +export type TypeResolveFn = ( + parent: TParent, + context: TContext, + info: GraphQLResolveInfo +) => Maybe | Promise>; + +export type IsTypeOfResolverFn = (obj: T, context: TContext, info: GraphQLResolveInfo) => boolean | Promise; + +export type NextResolverFn = () => Promise; + +export type DirectiveResolverFn = ( + next: NextResolverFn, + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => TResult | Promise; + + + +/** Mapping between all available schema types and the resolvers types */ +export type ResolversTypes = ResolversObject<{ + Aggregation_interval: Aggregation_interval; + Approval: ResolverTypeWrapper; + ApprovalForAll: ResolverTypeWrapper; + ApprovalForAll_filter: ApprovalForAll_filter; + ApprovalForAll_orderBy: ApprovalForAll_orderBy; + Approval_filter: Approval_filter; + Approval_orderBy: Approval_orderBy; + BigDecimal: ResolverTypeWrapper; + BigInt: ResolverTypeWrapper; + BlockChangedFilter: BlockChangedFilter; + Block_height: Block_height; + Boolean: ResolverTypeWrapper; + Bytes: ResolverTypeWrapper; + DeedEntity: ResolverTypeWrapper; + DeedEntity_filter: DeedEntity_filter; + DeedEntity_orderBy: DeedEntity_orderBy; + DeedMetadata: ResolverTypeWrapper; + DeedMetadata_filter: DeedMetadata_filter; + DeedMetadata_orderBy: DeedMetadata_orderBy; + FileInfo: ResolverTypeWrapper; + FileInfo_filter: FileInfo_filter; + FileInfo_orderBy: FileInfo_orderBy; + Float: ResolverTypeWrapper; + ID: ResolverTypeWrapper; + Int: ResolverTypeWrapper; + Int8: ResolverTypeWrapper; + OrderDirection: OrderDirection; + Query: ResolverTypeWrapper<{}>; + String: ResolverTypeWrapper; + Subscription: ResolverTypeWrapper<{}>; + Transfer: ResolverTypeWrapper; + Transfer_filter: Transfer_filter; + Transfer_orderBy: Transfer_orderBy; + _Block_: ResolverTypeWrapper<_Block_>; + _Meta_: ResolverTypeWrapper<_Meta_>; + _SubgraphErrorPolicy_: _SubgraphErrorPolicy_; +}>; + +/** Mapping between all available schema types and the resolvers parents */ +export type ResolversParentTypes = ResolversObject<{ + Approval: Approval; + ApprovalForAll: ApprovalForAll; + ApprovalForAll_filter: ApprovalForAll_filter; + Approval_filter: Approval_filter; + BigDecimal: Scalars['BigDecimal']; + BigInt: Scalars['BigInt']; + BlockChangedFilter: BlockChangedFilter; + Block_height: Block_height; + Boolean: Scalars['Boolean']; + Bytes: Scalars['Bytes']; + DeedEntity: DeedEntity; + DeedEntity_filter: DeedEntity_filter; + DeedMetadata: DeedMetadata; + DeedMetadata_filter: DeedMetadata_filter; + FileInfo: FileInfo; + FileInfo_filter: FileInfo_filter; + Float: Scalars['Float']; + ID: Scalars['ID']; + Int: Scalars['Int']; + Int8: Scalars['Int8']; + Query: {}; + String: Scalars['String']; + Subscription: {}; + Transfer: Transfer; + Transfer_filter: Transfer_filter; + _Block_: _Block_; + _Meta_: _Meta_; +}>; + +export type entityDirectiveArgs = { }; + +export type entityDirectiveResolver = DirectiveResolverFn; + +export type subgraphIdDirectiveArgs = { + id: Scalars['String']; +}; + +export type subgraphIdDirectiveResolver = DirectiveResolverFn; + +export type derivedFromDirectiveArgs = { + field: Scalars['String']; +}; + +export type derivedFromDirectiveResolver = DirectiveResolverFn; + +export type ApprovalResolvers = ResolversObject<{ + id?: Resolver; + owner?: Resolver; + approved?: Resolver; + tokenId?: Resolver; + blockNumber?: Resolver; + blockTimestamp?: Resolver; + transactionHash?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type ApprovalForAllResolvers = ResolversObject<{ + id?: Resolver; + owner?: Resolver; + operator?: Resolver; + approved?: Resolver; + blockNumber?: Resolver; + blockTimestamp?: Resolver; + transactionHash?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export interface BigDecimalScalarConfig extends GraphQLScalarTypeConfig { + name: 'BigDecimal'; +} + +export interface BigIntScalarConfig extends GraphQLScalarTypeConfig { + name: 'BigInt'; +} + +export interface BytesScalarConfig extends GraphQLScalarTypeConfig { + name: 'Bytes'; +} + +export type DeedEntityResolvers = ResolversObject<{ + id?: Resolver; + deedId?: Resolver; + owner?: Resolver; + assetType?: Resolver; + isValidated?: Resolver; + minter?: Resolver; + uri?: Resolver; + blockNumber?: Resolver; + blockTimestamp?: Resolver; + transactionHash?: Resolver; + deedMetadata?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type DeedMetadataResolvers = ResolversObject<{ + id?: Resolver; + ownerInformation_type?: Resolver; + ownerInformation_name?: Resolver; + ownerInformation_position?: Resolver, ParentType, ContextType>; + ownerInformation_entityName?: Resolver, ParentType, ContextType>; + ownerInformation_entityType?: Resolver, ParentType, ContextType>; + ownerInformation_ids?: Resolver; + ownerInformation_operatingAgreement?: Resolver, ParentType, ContextType>; + ownerInformation_articleIncorporation?: Resolver; + ownerInformation_proofBill?: Resolver, ParentType, ContextType>; + ownerInformation_supportingDoc?: Resolver>, ParentType, ContextType, RequireFields>; + propertyDetails_type?: Resolver; + propertyDetails_address?: Resolver; + propertyDetails_city?: Resolver; + propertyDetails_state?: Resolver; + propertyDetails_size?: Resolver, ParentType, ContextType>; + propertyDetails_subType?: Resolver, ParentType, ContextType>; + propertyDetails_zoning?: Resolver, ParentType, ContextType>; + propertyDetails_purchaseContract?: Resolver, ParentType, ContextType>; + propertyDetails_deedOrTitle?: Resolver; + propertyDetails_images?: Resolver>, ParentType, ContextType, RequireFields>; + otherInformation_blockchain?: Resolver; + otherInformation_wrapper?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type FileInfoResolvers = ResolversObject<{ + id?: Resolver; + name?: Resolver; + size?: Resolver; + type?: Resolver; + timestamp?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export interface Int8ScalarConfig extends GraphQLScalarTypeConfig { + name: 'Int8'; +} + +export type QueryResolvers = ResolversObject<{ + deedEntity?: Resolver, ParentType, ContextType, RequireFields>; + deedEntities?: Resolver, ParentType, ContextType, RequireFields>; + deedMetadata?: Resolver, ParentType, ContextType, RequireFields>; + deedMetadata_collection?: Resolver, ParentType, ContextType, RequireFields>; + transfer?: Resolver, ParentType, ContextType, RequireFields>; + transfers?: Resolver, ParentType, ContextType, RequireFields>; + approval?: Resolver, ParentType, ContextType, RequireFields>; + approvals?: Resolver, ParentType, ContextType, RequireFields>; + approvalForAll?: Resolver, ParentType, ContextType, RequireFields>; + approvalForAlls?: Resolver, ParentType, ContextType, RequireFields>; + fileInfo?: Resolver, ParentType, ContextType, RequireFields>; + fileInfos?: Resolver, ParentType, ContextType, RequireFields>; + _meta?: Resolver, ParentType, ContextType, Partial>; +}>; + +export type SubscriptionResolvers = ResolversObject<{ + deedEntity?: SubscriptionResolver, "deedEntity", ParentType, ContextType, RequireFields>; + deedEntities?: SubscriptionResolver, "deedEntities", ParentType, ContextType, RequireFields>; + deedMetadata?: SubscriptionResolver, "deedMetadata", ParentType, ContextType, RequireFields>; + deedMetadata_collection?: SubscriptionResolver, "deedMetadata_collection", ParentType, ContextType, RequireFields>; + transfer?: SubscriptionResolver, "transfer", ParentType, ContextType, RequireFields>; + transfers?: SubscriptionResolver, "transfers", ParentType, ContextType, RequireFields>; + approval?: SubscriptionResolver, "approval", ParentType, ContextType, RequireFields>; + approvals?: SubscriptionResolver, "approvals", ParentType, ContextType, RequireFields>; + approvalForAll?: SubscriptionResolver, "approvalForAll", ParentType, ContextType, RequireFields>; + approvalForAlls?: SubscriptionResolver, "approvalForAlls", ParentType, ContextType, RequireFields>; + fileInfo?: SubscriptionResolver, "fileInfo", ParentType, ContextType, RequireFields>; + fileInfos?: SubscriptionResolver, "fileInfos", ParentType, ContextType, RequireFields>; + _meta?: SubscriptionResolver, "_meta", ParentType, ContextType, Partial>; +}>; + +export type TransferResolvers = ResolversObject<{ + id?: Resolver; + from?: Resolver; + to?: Resolver; + tokenId?: Resolver; + blockNumber?: Resolver; + blockTimestamp?: Resolver; + transactionHash?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type _Block_Resolvers = ResolversObject<{ + hash?: Resolver, ParentType, ContextType>; + number?: Resolver; + timestamp?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type _Meta_Resolvers = ResolversObject<{ + block?: Resolver; + deployment?: Resolver; + hasIndexingErrors?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type Resolvers = ResolversObject<{ + Approval?: ApprovalResolvers; + ApprovalForAll?: ApprovalForAllResolvers; + BigDecimal?: GraphQLScalarType; + BigInt?: GraphQLScalarType; + Bytes?: GraphQLScalarType; + DeedEntity?: DeedEntityResolvers; + DeedMetadata?: DeedMetadataResolvers; + FileInfo?: FileInfoResolvers; + Int8?: GraphQLScalarType; + Query?: QueryResolvers; + Subscription?: SubscriptionResolvers; + Transfer?: TransferResolvers; + _Block_?: _Block_Resolvers; + _Meta_?: _Meta_Resolvers; +}>; + +export type DirectiveResolvers = ResolversObject<{ + entity?: entityDirectiveResolver; + subgraphId?: subgraphIdDirectiveResolver; + derivedFrom?: derivedFromDirectiveResolver; +}>; + +export type MeshContext = Deed3SepoliaTypes.Context & BaseMeshContext; + + +import { fileURLToPath } from '@graphql-mesh/utils'; +const baseDir = pathModule.join(pathModule.dirname(fileURLToPath(import.meta.url)), '..'); + +const importFn: ImportFn = (moduleId: string) => { + const relativeModuleId = (pathModule.isAbsolute(moduleId) ? pathModule.relative(baseDir, moduleId) : moduleId).split('\\').join('/').replace(baseDir + '/', ''); + switch(relativeModuleId) { + case ".graphclient/sources/Deed3-Sepolia/introspectionSchema": + return Promise.resolve(importedModule$0) as T; + + default: + return Promise.reject(new Error(`Cannot find module '${relativeModuleId}'.`)); + } +}; + +const rootStore = new MeshStore('.graphclient', new FsStoreStorageAdapter({ + cwd: baseDir, + importFn, + fileType: "ts", +}), { + readonly: true, + validate: false +}); + +export const rawServeConfig: YamlConfig.Config['serve'] = undefined as any +export async function getMeshOptions(): Promise { +const pubsub = new PubSub(); +const sourcesStore = rootStore.child('sources'); +const logger = new DefaultLogger("GraphClient"); +const cache = new (MeshCache as any)({ + ...({} as any), + importFn, + store: rootStore.child('cache'), + pubsub, + logger, + } as any) + +const sources: MeshResolvedSource[] = []; +const transforms: MeshTransform[] = []; +const additionalEnvelopPlugins: MeshPlugin[] = []; +const deed3SepoliaTransforms = []; +const additionalTypeDefs = [] as any[]; +const deed3SepoliaHandler = new GraphqlHandler({ + name: "Deed3-Sepolia", + config: {"endpoint":"https://api.studio.thegraph.com/query/56229/deed3-sepolia/version/latest"}, + baseDir, + cache, + pubsub, + store: sourcesStore.child("Deed3-Sepolia"), + logger: logger.child("Deed3-Sepolia"), + importFn, + }); +sources[0] = { + name: 'Deed3-Sepolia', + handler: deed3SepoliaHandler, + transforms: deed3SepoliaTransforms + } +const additionalResolvers = [] as any[] +const merger = new(BareMerger as any)({ + cache, + pubsub, + logger: logger.child('bareMerger'), + store: rootStore.child('bareMerger') + }) + + return { + sources, + transforms, + additionalTypeDefs, + additionalResolvers, + cache, + pubsub, + merger, + logger, + additionalEnvelopPlugins, + get documents() { + return [ + + ]; + }, + fetchFn, + }; +} + +export function createBuiltMeshHTTPHandler(): MeshHTTPHandler { + return createMeshHTTPHandler({ + baseDir, + getBuiltMesh: getBuiltGraphClient, + rawServeConfig: undefined, + }) +} + + +let meshInstance$: Promise | undefined; + +export function getBuiltGraphClient(): Promise { + if (meshInstance$ == null) { + meshInstance$ = getMeshOptions().then(meshOptions => getMesh(meshOptions)).then(mesh => { + const id = mesh.pubsub.subscribe('destroy', () => { + meshInstance$ = undefined; + mesh.pubsub.unsubscribe(id); + }); + return mesh; + }); + } + return meshInstance$; +} + +export const execute: ExecuteMeshFn = (...args) => getBuiltGraphClient().then(({ execute }) => execute(...args)); + +export const subscribe: SubscribeMeshFn = (...args) => getBuiltGraphClient().then(({ subscribe }) => subscribe(...args)); \ No newline at end of file diff --git a/packages/nextjs/.graphclient/schema.graphql b/packages/nextjs/.graphclient/schema.graphql new file mode 100644 index 00000000..603285d3 --- /dev/null +++ b/packages/nextjs/.graphclient/schema.graphql @@ -0,0 +1,1452 @@ +schema { + query: Query + subscription: Subscription +} + +"Marks the GraphQL type as indexable entity. Each type that should be an entity is required to be annotated with this directive." +directive @entity on OBJECT + +"Defined a Subgraph ID for an object type" +directive @subgraphId(id: String!) on OBJECT + +"creates a virtual field on the entity that may be queried but cannot be set manually through the mappings API." +directive @derivedFrom(field: String!) on FIELD_DEFINITION + +enum Aggregation_interval { + hour + day +} + +type Approval { + id: Bytes! + owner: Bytes! + approved: Bytes! + tokenId: BigInt! + blockNumber: BigInt! + blockTimestamp: BigInt! + transactionHash: Bytes! +} + +type ApprovalForAll { + id: Bytes! + owner: Bytes! + operator: Bytes! + approved: Boolean! + blockNumber: BigInt! + blockTimestamp: BigInt! + transactionHash: Bytes! +} + +input ApprovalForAll_filter { + id: Bytes + id_not: Bytes + id_gt: Bytes + id_lt: Bytes + id_gte: Bytes + id_lte: Bytes + id_in: [Bytes!] + id_not_in: [Bytes!] + id_contains: Bytes + id_not_contains: Bytes + owner: Bytes + owner_not: Bytes + owner_gt: Bytes + owner_lt: Bytes + owner_gte: Bytes + owner_lte: Bytes + owner_in: [Bytes!] + owner_not_in: [Bytes!] + owner_contains: Bytes + owner_not_contains: Bytes + operator: Bytes + operator_not: Bytes + operator_gt: Bytes + operator_lt: Bytes + operator_gte: Bytes + operator_lte: Bytes + operator_in: [Bytes!] + operator_not_in: [Bytes!] + operator_contains: Bytes + operator_not_contains: Bytes + approved: Boolean + approved_not: Boolean + approved_in: [Boolean!] + approved_not_in: [Boolean!] + blockNumber: BigInt + blockNumber_not: BigInt + blockNumber_gt: BigInt + blockNumber_lt: BigInt + blockNumber_gte: BigInt + blockNumber_lte: BigInt + blockNumber_in: [BigInt!] + blockNumber_not_in: [BigInt!] + blockTimestamp: BigInt + blockTimestamp_not: BigInt + blockTimestamp_gt: BigInt + blockTimestamp_lt: BigInt + blockTimestamp_gte: BigInt + blockTimestamp_lte: BigInt + blockTimestamp_in: [BigInt!] + blockTimestamp_not_in: [BigInt!] + transactionHash: Bytes + transactionHash_not: Bytes + transactionHash_gt: Bytes + transactionHash_lt: Bytes + transactionHash_gte: Bytes + transactionHash_lte: Bytes + transactionHash_in: [Bytes!] + transactionHash_not_in: [Bytes!] + transactionHash_contains: Bytes + transactionHash_not_contains: Bytes + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [ApprovalForAll_filter] + or: [ApprovalForAll_filter] +} + +enum ApprovalForAll_orderBy { + id + owner + operator + approved + blockNumber + blockTimestamp + transactionHash +} + +input Approval_filter { + id: Bytes + id_not: Bytes + id_gt: Bytes + id_lt: Bytes + id_gte: Bytes + id_lte: Bytes + id_in: [Bytes!] + id_not_in: [Bytes!] + id_contains: Bytes + id_not_contains: Bytes + owner: Bytes + owner_not: Bytes + owner_gt: Bytes + owner_lt: Bytes + owner_gte: Bytes + owner_lte: Bytes + owner_in: [Bytes!] + owner_not_in: [Bytes!] + owner_contains: Bytes + owner_not_contains: Bytes + approved: Bytes + approved_not: Bytes + approved_gt: Bytes + approved_lt: Bytes + approved_gte: Bytes + approved_lte: Bytes + approved_in: [Bytes!] + approved_not_in: [Bytes!] + approved_contains: Bytes + approved_not_contains: Bytes + tokenId: BigInt + tokenId_not: BigInt + tokenId_gt: BigInt + tokenId_lt: BigInt + tokenId_gte: BigInt + tokenId_lte: BigInt + tokenId_in: [BigInt!] + tokenId_not_in: [BigInt!] + blockNumber: BigInt + blockNumber_not: BigInt + blockNumber_gt: BigInt + blockNumber_lt: BigInt + blockNumber_gte: BigInt + blockNumber_lte: BigInt + blockNumber_in: [BigInt!] + blockNumber_not_in: [BigInt!] + blockTimestamp: BigInt + blockTimestamp_not: BigInt + blockTimestamp_gt: BigInt + blockTimestamp_lt: BigInt + blockTimestamp_gte: BigInt + blockTimestamp_lte: BigInt + blockTimestamp_in: [BigInt!] + blockTimestamp_not_in: [BigInt!] + transactionHash: Bytes + transactionHash_not: Bytes + transactionHash_gt: Bytes + transactionHash_lt: Bytes + transactionHash_gte: Bytes + transactionHash_lte: Bytes + transactionHash_in: [Bytes!] + transactionHash_not_in: [Bytes!] + transactionHash_contains: Bytes + transactionHash_not_contains: Bytes + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [Approval_filter] + or: [Approval_filter] +} + +enum Approval_orderBy { + id + owner + approved + tokenId + blockNumber + blockTimestamp + transactionHash +} + +scalar BigDecimal + +scalar BigInt + +input BlockChangedFilter { + number_gte: Int! +} + +input Block_height { + hash: Bytes + number: Int + number_gte: Int +} + +scalar Bytes + +type DeedEntity { + id: ID! + deedId: BigInt! + owner: Bytes! + assetType: Int! + isValidated: Boolean! + minter: Bytes! + uri: String! + blockNumber: BigInt! + blockTimestamp: BigInt! + transactionHash: Bytes! + deedMetadata: DeedMetadata! +} + +input DeedEntity_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + deedId: BigInt + deedId_not: BigInt + deedId_gt: BigInt + deedId_lt: BigInt + deedId_gte: BigInt + deedId_lte: BigInt + deedId_in: [BigInt!] + deedId_not_in: [BigInt!] + owner: Bytes + owner_not: Bytes + owner_gt: Bytes + owner_lt: Bytes + owner_gte: Bytes + owner_lte: Bytes + owner_in: [Bytes!] + owner_not_in: [Bytes!] + owner_contains: Bytes + owner_not_contains: Bytes + assetType: Int + assetType_not: Int + assetType_gt: Int + assetType_lt: Int + assetType_gte: Int + assetType_lte: Int + assetType_in: [Int!] + assetType_not_in: [Int!] + isValidated: Boolean + isValidated_not: Boolean + isValidated_in: [Boolean!] + isValidated_not_in: [Boolean!] + minter: Bytes + minter_not: Bytes + minter_gt: Bytes + minter_lt: Bytes + minter_gte: Bytes + minter_lte: Bytes + minter_in: [Bytes!] + minter_not_in: [Bytes!] + minter_contains: Bytes + minter_not_contains: Bytes + uri: String + uri_not: String + uri_gt: String + uri_lt: String + uri_gte: String + uri_lte: String + uri_in: [String!] + uri_not_in: [String!] + uri_contains: String + uri_contains_nocase: String + uri_not_contains: String + uri_not_contains_nocase: String + uri_starts_with: String + uri_starts_with_nocase: String + uri_not_starts_with: String + uri_not_starts_with_nocase: String + uri_ends_with: String + uri_ends_with_nocase: String + uri_not_ends_with: String + uri_not_ends_with_nocase: String + blockNumber: BigInt + blockNumber_not: BigInt + blockNumber_gt: BigInt + blockNumber_lt: BigInt + blockNumber_gte: BigInt + blockNumber_lte: BigInt + blockNumber_in: [BigInt!] + blockNumber_not_in: [BigInt!] + blockTimestamp: BigInt + blockTimestamp_not: BigInt + blockTimestamp_gt: BigInt + blockTimestamp_lt: BigInt + blockTimestamp_gte: BigInt + blockTimestamp_lte: BigInt + blockTimestamp_in: [BigInt!] + blockTimestamp_not_in: [BigInt!] + transactionHash: Bytes + transactionHash_not: Bytes + transactionHash_gt: Bytes + transactionHash_lt: Bytes + transactionHash_gte: Bytes + transactionHash_lte: Bytes + transactionHash_in: [Bytes!] + transactionHash_not_in: [Bytes!] + transactionHash_contains: Bytes + transactionHash_not_contains: Bytes + deedMetadata: String + deedMetadata_not: String + deedMetadata_gt: String + deedMetadata_lt: String + deedMetadata_gte: String + deedMetadata_lte: String + deedMetadata_in: [String!] + deedMetadata_not_in: [String!] + deedMetadata_contains: String + deedMetadata_contains_nocase: String + deedMetadata_not_contains: String + deedMetadata_not_contains_nocase: String + deedMetadata_starts_with: String + deedMetadata_starts_with_nocase: String + deedMetadata_not_starts_with: String + deedMetadata_not_starts_with_nocase: String + deedMetadata_ends_with: String + deedMetadata_ends_with_nocase: String + deedMetadata_not_ends_with: String + deedMetadata_not_ends_with_nocase: String + deedMetadata_: DeedMetadata_filter + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [DeedEntity_filter] + or: [DeedEntity_filter] +} + +enum DeedEntity_orderBy { + id + deedId + owner + assetType + isValidated + minter + uri + blockNumber + blockTimestamp + transactionHash + deedMetadata + deedMetadata__id + deedMetadata__ownerInformation_type + deedMetadata__ownerInformation_name + deedMetadata__ownerInformation_position + deedMetadata__ownerInformation_entityName + deedMetadata__ownerInformation_entityType + deedMetadata__propertyDetails_type + deedMetadata__propertyDetails_address + deedMetadata__propertyDetails_city + deedMetadata__propertyDetails_state + deedMetadata__propertyDetails_size + deedMetadata__propertyDetails_subType + deedMetadata__propertyDetails_zoning + deedMetadata__otherInformation_blockchain + deedMetadata__otherInformation_wrapper +} + +type DeedMetadata { + id: ID! + ownerInformation_type: String! + ownerInformation_name: String! + ownerInformation_position: String + ownerInformation_entityName: String + ownerInformation_entityType: String + ownerInformation_ids: FileInfo! + ownerInformation_operatingAgreement: FileInfo + ownerInformation_articleIncorporation: FileInfo! + ownerInformation_proofBill: FileInfo + ownerInformation_supportingDoc(skip: Int = 0, first: Int = 100, orderBy: FileInfo_orderBy, orderDirection: OrderDirection, where: FileInfo_filter): [FileInfo!] + propertyDetails_type: String! + propertyDetails_address: String! + propertyDetails_city: String! + propertyDetails_state: String! + propertyDetails_size: String + propertyDetails_subType: String + propertyDetails_zoning: String + propertyDetails_purchaseContract: FileInfo + propertyDetails_deedOrTitle: FileInfo! + propertyDetails_images(skip: Int = 0, first: Int = 100, orderBy: FileInfo_orderBy, orderDirection: OrderDirection, where: FileInfo_filter): [FileInfo!] + otherInformation_blockchain: String! + otherInformation_wrapper: String! +} + +input DeedMetadata_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + ownerInformation_type: String + ownerInformation_type_not: String + ownerInformation_type_gt: String + ownerInformation_type_lt: String + ownerInformation_type_gte: String + ownerInformation_type_lte: String + ownerInformation_type_in: [String!] + ownerInformation_type_not_in: [String!] + ownerInformation_type_contains: String + ownerInformation_type_contains_nocase: String + ownerInformation_type_not_contains: String + ownerInformation_type_not_contains_nocase: String + ownerInformation_type_starts_with: String + ownerInformation_type_starts_with_nocase: String + ownerInformation_type_not_starts_with: String + ownerInformation_type_not_starts_with_nocase: String + ownerInformation_type_ends_with: String + ownerInformation_type_ends_with_nocase: String + ownerInformation_type_not_ends_with: String + ownerInformation_type_not_ends_with_nocase: String + ownerInformation_name: String + ownerInformation_name_not: String + ownerInformation_name_gt: String + ownerInformation_name_lt: String + ownerInformation_name_gte: String + ownerInformation_name_lte: String + ownerInformation_name_in: [String!] + ownerInformation_name_not_in: [String!] + ownerInformation_name_contains: String + ownerInformation_name_contains_nocase: String + ownerInformation_name_not_contains: String + ownerInformation_name_not_contains_nocase: String + ownerInformation_name_starts_with: String + ownerInformation_name_starts_with_nocase: String + ownerInformation_name_not_starts_with: String + ownerInformation_name_not_starts_with_nocase: String + ownerInformation_name_ends_with: String + ownerInformation_name_ends_with_nocase: String + ownerInformation_name_not_ends_with: String + ownerInformation_name_not_ends_with_nocase: String + ownerInformation_position: String + ownerInformation_position_not: String + ownerInformation_position_gt: String + ownerInformation_position_lt: String + ownerInformation_position_gte: String + ownerInformation_position_lte: String + ownerInformation_position_in: [String!] + ownerInformation_position_not_in: [String!] + ownerInformation_position_contains: String + ownerInformation_position_contains_nocase: String + ownerInformation_position_not_contains: String + ownerInformation_position_not_contains_nocase: String + ownerInformation_position_starts_with: String + ownerInformation_position_starts_with_nocase: String + ownerInformation_position_not_starts_with: String + ownerInformation_position_not_starts_with_nocase: String + ownerInformation_position_ends_with: String + ownerInformation_position_ends_with_nocase: String + ownerInformation_position_not_ends_with: String + ownerInformation_position_not_ends_with_nocase: String + ownerInformation_entityName: String + ownerInformation_entityName_not: String + ownerInformation_entityName_gt: String + ownerInformation_entityName_lt: String + ownerInformation_entityName_gte: String + ownerInformation_entityName_lte: String + ownerInformation_entityName_in: [String!] + ownerInformation_entityName_not_in: [String!] + ownerInformation_entityName_contains: String + ownerInformation_entityName_contains_nocase: String + ownerInformation_entityName_not_contains: String + ownerInformation_entityName_not_contains_nocase: String + ownerInformation_entityName_starts_with: String + ownerInformation_entityName_starts_with_nocase: String + ownerInformation_entityName_not_starts_with: String + ownerInformation_entityName_not_starts_with_nocase: String + ownerInformation_entityName_ends_with: String + ownerInformation_entityName_ends_with_nocase: String + ownerInformation_entityName_not_ends_with: String + ownerInformation_entityName_not_ends_with_nocase: String + ownerInformation_entityType: String + ownerInformation_entityType_not: String + ownerInformation_entityType_gt: String + ownerInformation_entityType_lt: String + ownerInformation_entityType_gte: String + ownerInformation_entityType_lte: String + ownerInformation_entityType_in: [String!] + ownerInformation_entityType_not_in: [String!] + ownerInformation_entityType_contains: String + ownerInformation_entityType_contains_nocase: String + ownerInformation_entityType_not_contains: String + ownerInformation_entityType_not_contains_nocase: String + ownerInformation_entityType_starts_with: String + ownerInformation_entityType_starts_with_nocase: String + ownerInformation_entityType_not_starts_with: String + ownerInformation_entityType_not_starts_with_nocase: String + ownerInformation_entityType_ends_with: String + ownerInformation_entityType_ends_with_nocase: String + ownerInformation_entityType_not_ends_with: String + ownerInformation_entityType_not_ends_with_nocase: String + ownerInformation_ids: String + ownerInformation_ids_not: String + ownerInformation_ids_gt: String + ownerInformation_ids_lt: String + ownerInformation_ids_gte: String + ownerInformation_ids_lte: String + ownerInformation_ids_in: [String!] + ownerInformation_ids_not_in: [String!] + ownerInformation_ids_contains: String + ownerInformation_ids_contains_nocase: String + ownerInformation_ids_not_contains: String + ownerInformation_ids_not_contains_nocase: String + ownerInformation_ids_starts_with: String + ownerInformation_ids_starts_with_nocase: String + ownerInformation_ids_not_starts_with: String + ownerInformation_ids_not_starts_with_nocase: String + ownerInformation_ids_ends_with: String + ownerInformation_ids_ends_with_nocase: String + ownerInformation_ids_not_ends_with: String + ownerInformation_ids_not_ends_with_nocase: String + ownerInformation_ids_: FileInfo_filter + ownerInformation_operatingAgreement: String + ownerInformation_operatingAgreement_not: String + ownerInformation_operatingAgreement_gt: String + ownerInformation_operatingAgreement_lt: String + ownerInformation_operatingAgreement_gte: String + ownerInformation_operatingAgreement_lte: String + ownerInformation_operatingAgreement_in: [String!] + ownerInformation_operatingAgreement_not_in: [String!] + ownerInformation_operatingAgreement_contains: String + ownerInformation_operatingAgreement_contains_nocase: String + ownerInformation_operatingAgreement_not_contains: String + ownerInformation_operatingAgreement_not_contains_nocase: String + ownerInformation_operatingAgreement_starts_with: String + ownerInformation_operatingAgreement_starts_with_nocase: String + ownerInformation_operatingAgreement_not_starts_with: String + ownerInformation_operatingAgreement_not_starts_with_nocase: String + ownerInformation_operatingAgreement_ends_with: String + ownerInformation_operatingAgreement_ends_with_nocase: String + ownerInformation_operatingAgreement_not_ends_with: String + ownerInformation_operatingAgreement_not_ends_with_nocase: String + ownerInformation_operatingAgreement_: FileInfo_filter + ownerInformation_articleIncorporation: String + ownerInformation_articleIncorporation_not: String + ownerInformation_articleIncorporation_gt: String + ownerInformation_articleIncorporation_lt: String + ownerInformation_articleIncorporation_gte: String + ownerInformation_articleIncorporation_lte: String + ownerInformation_articleIncorporation_in: [String!] + ownerInformation_articleIncorporation_not_in: [String!] + ownerInformation_articleIncorporation_contains: String + ownerInformation_articleIncorporation_contains_nocase: String + ownerInformation_articleIncorporation_not_contains: String + ownerInformation_articleIncorporation_not_contains_nocase: String + ownerInformation_articleIncorporation_starts_with: String + ownerInformation_articleIncorporation_starts_with_nocase: String + ownerInformation_articleIncorporation_not_starts_with: String + ownerInformation_articleIncorporation_not_starts_with_nocase: String + ownerInformation_articleIncorporation_ends_with: String + ownerInformation_articleIncorporation_ends_with_nocase: String + ownerInformation_articleIncorporation_not_ends_with: String + ownerInformation_articleIncorporation_not_ends_with_nocase: String + ownerInformation_articleIncorporation_: FileInfo_filter + ownerInformation_proofBill: String + ownerInformation_proofBill_not: String + ownerInformation_proofBill_gt: String + ownerInformation_proofBill_lt: String + ownerInformation_proofBill_gte: String + ownerInformation_proofBill_lte: String + ownerInformation_proofBill_in: [String!] + ownerInformation_proofBill_not_in: [String!] + ownerInformation_proofBill_contains: String + ownerInformation_proofBill_contains_nocase: String + ownerInformation_proofBill_not_contains: String + ownerInformation_proofBill_not_contains_nocase: String + ownerInformation_proofBill_starts_with: String + ownerInformation_proofBill_starts_with_nocase: String + ownerInformation_proofBill_not_starts_with: String + ownerInformation_proofBill_not_starts_with_nocase: String + ownerInformation_proofBill_ends_with: String + ownerInformation_proofBill_ends_with_nocase: String + ownerInformation_proofBill_not_ends_with: String + ownerInformation_proofBill_not_ends_with_nocase: String + ownerInformation_proofBill_: FileInfo_filter + ownerInformation_supportingDoc: [String!] + ownerInformation_supportingDoc_not: [String!] + ownerInformation_supportingDoc_contains: [String!] + ownerInformation_supportingDoc_contains_nocase: [String!] + ownerInformation_supportingDoc_not_contains: [String!] + ownerInformation_supportingDoc_not_contains_nocase: [String!] + ownerInformation_supportingDoc_: FileInfo_filter + propertyDetails_type: String + propertyDetails_type_not: String + propertyDetails_type_gt: String + propertyDetails_type_lt: String + propertyDetails_type_gte: String + propertyDetails_type_lte: String + propertyDetails_type_in: [String!] + propertyDetails_type_not_in: [String!] + propertyDetails_type_contains: String + propertyDetails_type_contains_nocase: String + propertyDetails_type_not_contains: String + propertyDetails_type_not_contains_nocase: String + propertyDetails_type_starts_with: String + propertyDetails_type_starts_with_nocase: String + propertyDetails_type_not_starts_with: String + propertyDetails_type_not_starts_with_nocase: String + propertyDetails_type_ends_with: String + propertyDetails_type_ends_with_nocase: String + propertyDetails_type_not_ends_with: String + propertyDetails_type_not_ends_with_nocase: String + propertyDetails_address: String + propertyDetails_address_not: String + propertyDetails_address_gt: String + propertyDetails_address_lt: String + propertyDetails_address_gte: String + propertyDetails_address_lte: String + propertyDetails_address_in: [String!] + propertyDetails_address_not_in: [String!] + propertyDetails_address_contains: String + propertyDetails_address_contains_nocase: String + propertyDetails_address_not_contains: String + propertyDetails_address_not_contains_nocase: String + propertyDetails_address_starts_with: String + propertyDetails_address_starts_with_nocase: String + propertyDetails_address_not_starts_with: String + propertyDetails_address_not_starts_with_nocase: String + propertyDetails_address_ends_with: String + propertyDetails_address_ends_with_nocase: String + propertyDetails_address_not_ends_with: String + propertyDetails_address_not_ends_with_nocase: String + propertyDetails_city: String + propertyDetails_city_not: String + propertyDetails_city_gt: String + propertyDetails_city_lt: String + propertyDetails_city_gte: String + propertyDetails_city_lte: String + propertyDetails_city_in: [String!] + propertyDetails_city_not_in: [String!] + propertyDetails_city_contains: String + propertyDetails_city_contains_nocase: String + propertyDetails_city_not_contains: String + propertyDetails_city_not_contains_nocase: String + propertyDetails_city_starts_with: String + propertyDetails_city_starts_with_nocase: String + propertyDetails_city_not_starts_with: String + propertyDetails_city_not_starts_with_nocase: String + propertyDetails_city_ends_with: String + propertyDetails_city_ends_with_nocase: String + propertyDetails_city_not_ends_with: String + propertyDetails_city_not_ends_with_nocase: String + propertyDetails_state: String + propertyDetails_state_not: String + propertyDetails_state_gt: String + propertyDetails_state_lt: String + propertyDetails_state_gte: String + propertyDetails_state_lte: String + propertyDetails_state_in: [String!] + propertyDetails_state_not_in: [String!] + propertyDetails_state_contains: String + propertyDetails_state_contains_nocase: String + propertyDetails_state_not_contains: String + propertyDetails_state_not_contains_nocase: String + propertyDetails_state_starts_with: String + propertyDetails_state_starts_with_nocase: String + propertyDetails_state_not_starts_with: String + propertyDetails_state_not_starts_with_nocase: String + propertyDetails_state_ends_with: String + propertyDetails_state_ends_with_nocase: String + propertyDetails_state_not_ends_with: String + propertyDetails_state_not_ends_with_nocase: String + propertyDetails_size: String + propertyDetails_size_not: String + propertyDetails_size_gt: String + propertyDetails_size_lt: String + propertyDetails_size_gte: String + propertyDetails_size_lte: String + propertyDetails_size_in: [String!] + propertyDetails_size_not_in: [String!] + propertyDetails_size_contains: String + propertyDetails_size_contains_nocase: String + propertyDetails_size_not_contains: String + propertyDetails_size_not_contains_nocase: String + propertyDetails_size_starts_with: String + propertyDetails_size_starts_with_nocase: String + propertyDetails_size_not_starts_with: String + propertyDetails_size_not_starts_with_nocase: String + propertyDetails_size_ends_with: String + propertyDetails_size_ends_with_nocase: String + propertyDetails_size_not_ends_with: String + propertyDetails_size_not_ends_with_nocase: String + propertyDetails_subType: String + propertyDetails_subType_not: String + propertyDetails_subType_gt: String + propertyDetails_subType_lt: String + propertyDetails_subType_gte: String + propertyDetails_subType_lte: String + propertyDetails_subType_in: [String!] + propertyDetails_subType_not_in: [String!] + propertyDetails_subType_contains: String + propertyDetails_subType_contains_nocase: String + propertyDetails_subType_not_contains: String + propertyDetails_subType_not_contains_nocase: String + propertyDetails_subType_starts_with: String + propertyDetails_subType_starts_with_nocase: String + propertyDetails_subType_not_starts_with: String + propertyDetails_subType_not_starts_with_nocase: String + propertyDetails_subType_ends_with: String + propertyDetails_subType_ends_with_nocase: String + propertyDetails_subType_not_ends_with: String + propertyDetails_subType_not_ends_with_nocase: String + propertyDetails_zoning: String + propertyDetails_zoning_not: String + propertyDetails_zoning_gt: String + propertyDetails_zoning_lt: String + propertyDetails_zoning_gte: String + propertyDetails_zoning_lte: String + propertyDetails_zoning_in: [String!] + propertyDetails_zoning_not_in: [String!] + propertyDetails_zoning_contains: String + propertyDetails_zoning_contains_nocase: String + propertyDetails_zoning_not_contains: String + propertyDetails_zoning_not_contains_nocase: String + propertyDetails_zoning_starts_with: String + propertyDetails_zoning_starts_with_nocase: String + propertyDetails_zoning_not_starts_with: String + propertyDetails_zoning_not_starts_with_nocase: String + propertyDetails_zoning_ends_with: String + propertyDetails_zoning_ends_with_nocase: String + propertyDetails_zoning_not_ends_with: String + propertyDetails_zoning_not_ends_with_nocase: String + propertyDetails_purchaseContract: String + propertyDetails_purchaseContract_not: String + propertyDetails_purchaseContract_gt: String + propertyDetails_purchaseContract_lt: String + propertyDetails_purchaseContract_gte: String + propertyDetails_purchaseContract_lte: String + propertyDetails_purchaseContract_in: [String!] + propertyDetails_purchaseContract_not_in: [String!] + propertyDetails_purchaseContract_contains: String + propertyDetails_purchaseContract_contains_nocase: String + propertyDetails_purchaseContract_not_contains: String + propertyDetails_purchaseContract_not_contains_nocase: String + propertyDetails_purchaseContract_starts_with: String + propertyDetails_purchaseContract_starts_with_nocase: String + propertyDetails_purchaseContract_not_starts_with: String + propertyDetails_purchaseContract_not_starts_with_nocase: String + propertyDetails_purchaseContract_ends_with: String + propertyDetails_purchaseContract_ends_with_nocase: String + propertyDetails_purchaseContract_not_ends_with: String + propertyDetails_purchaseContract_not_ends_with_nocase: String + propertyDetails_purchaseContract_: FileInfo_filter + propertyDetails_deedOrTitle: String + propertyDetails_deedOrTitle_not: String + propertyDetails_deedOrTitle_gt: String + propertyDetails_deedOrTitle_lt: String + propertyDetails_deedOrTitle_gte: String + propertyDetails_deedOrTitle_lte: String + propertyDetails_deedOrTitle_in: [String!] + propertyDetails_deedOrTitle_not_in: [String!] + propertyDetails_deedOrTitle_contains: String + propertyDetails_deedOrTitle_contains_nocase: String + propertyDetails_deedOrTitle_not_contains: String + propertyDetails_deedOrTitle_not_contains_nocase: String + propertyDetails_deedOrTitle_starts_with: String + propertyDetails_deedOrTitle_starts_with_nocase: String + propertyDetails_deedOrTitle_not_starts_with: String + propertyDetails_deedOrTitle_not_starts_with_nocase: String + propertyDetails_deedOrTitle_ends_with: String + propertyDetails_deedOrTitle_ends_with_nocase: String + propertyDetails_deedOrTitle_not_ends_with: String + propertyDetails_deedOrTitle_not_ends_with_nocase: String + propertyDetails_deedOrTitle_: FileInfo_filter + propertyDetails_images: [String!] + propertyDetails_images_not: [String!] + propertyDetails_images_contains: [String!] + propertyDetails_images_contains_nocase: [String!] + propertyDetails_images_not_contains: [String!] + propertyDetails_images_not_contains_nocase: [String!] + propertyDetails_images_: FileInfo_filter + otherInformation_blockchain: String + otherInformation_blockchain_not: String + otherInformation_blockchain_gt: String + otherInformation_blockchain_lt: String + otherInformation_blockchain_gte: String + otherInformation_blockchain_lte: String + otherInformation_blockchain_in: [String!] + otherInformation_blockchain_not_in: [String!] + otherInformation_blockchain_contains: String + otherInformation_blockchain_contains_nocase: String + otherInformation_blockchain_not_contains: String + otherInformation_blockchain_not_contains_nocase: String + otherInformation_blockchain_starts_with: String + otherInformation_blockchain_starts_with_nocase: String + otherInformation_blockchain_not_starts_with: String + otherInformation_blockchain_not_starts_with_nocase: String + otherInformation_blockchain_ends_with: String + otherInformation_blockchain_ends_with_nocase: String + otherInformation_blockchain_not_ends_with: String + otherInformation_blockchain_not_ends_with_nocase: String + otherInformation_wrapper: String + otherInformation_wrapper_not: String + otherInformation_wrapper_gt: String + otherInformation_wrapper_lt: String + otherInformation_wrapper_gte: String + otherInformation_wrapper_lte: String + otherInformation_wrapper_in: [String!] + otherInformation_wrapper_not_in: [String!] + otherInformation_wrapper_contains: String + otherInformation_wrapper_contains_nocase: String + otherInformation_wrapper_not_contains: String + otherInformation_wrapper_not_contains_nocase: String + otherInformation_wrapper_starts_with: String + otherInformation_wrapper_starts_with_nocase: String + otherInformation_wrapper_not_starts_with: String + otherInformation_wrapper_not_starts_with_nocase: String + otherInformation_wrapper_ends_with: String + otherInformation_wrapper_ends_with_nocase: String + otherInformation_wrapper_not_ends_with: String + otherInformation_wrapper_not_ends_with_nocase: String + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [DeedMetadata_filter] + or: [DeedMetadata_filter] +} + +enum DeedMetadata_orderBy { + id + ownerInformation_type + ownerInformation_name + ownerInformation_position + ownerInformation_entityName + ownerInformation_entityType + ownerInformation_ids + ownerInformation_ids__id + ownerInformation_ids__name + ownerInformation_ids__size + ownerInformation_ids__type + ownerInformation_ids__timestamp + ownerInformation_operatingAgreement + ownerInformation_operatingAgreement__id + ownerInformation_operatingAgreement__name + ownerInformation_operatingAgreement__size + ownerInformation_operatingAgreement__type + ownerInformation_operatingAgreement__timestamp + ownerInformation_articleIncorporation + ownerInformation_articleIncorporation__id + ownerInformation_articleIncorporation__name + ownerInformation_articleIncorporation__size + ownerInformation_articleIncorporation__type + ownerInformation_articleIncorporation__timestamp + ownerInformation_proofBill + ownerInformation_proofBill__id + ownerInformation_proofBill__name + ownerInformation_proofBill__size + ownerInformation_proofBill__type + ownerInformation_proofBill__timestamp + ownerInformation_supportingDoc + propertyDetails_type + propertyDetails_address + propertyDetails_city + propertyDetails_state + propertyDetails_size + propertyDetails_subType + propertyDetails_zoning + propertyDetails_purchaseContract + propertyDetails_purchaseContract__id + propertyDetails_purchaseContract__name + propertyDetails_purchaseContract__size + propertyDetails_purchaseContract__type + propertyDetails_purchaseContract__timestamp + propertyDetails_deedOrTitle + propertyDetails_deedOrTitle__id + propertyDetails_deedOrTitle__name + propertyDetails_deedOrTitle__size + propertyDetails_deedOrTitle__type + propertyDetails_deedOrTitle__timestamp + propertyDetails_images + otherInformation_blockchain + otherInformation_wrapper +} + +type FileInfo { + id: ID! + name: String! + size: BigInt! + type: String! + timestamp: String! +} + +input FileInfo_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + name: String + name_not: String + name_gt: String + name_lt: String + name_gte: String + name_lte: String + name_in: [String!] + name_not_in: [String!] + name_contains: String + name_contains_nocase: String + name_not_contains: String + name_not_contains_nocase: String + name_starts_with: String + name_starts_with_nocase: String + name_not_starts_with: String + name_not_starts_with_nocase: String + name_ends_with: String + name_ends_with_nocase: String + name_not_ends_with: String + name_not_ends_with_nocase: String + size: BigInt + size_not: BigInt + size_gt: BigInt + size_lt: BigInt + size_gte: BigInt + size_lte: BigInt + size_in: [BigInt!] + size_not_in: [BigInt!] + type: String + type_not: String + type_gt: String + type_lt: String + type_gte: String + type_lte: String + type_in: [String!] + type_not_in: [String!] + type_contains: String + type_contains_nocase: String + type_not_contains: String + type_not_contains_nocase: String + type_starts_with: String + type_starts_with_nocase: String + type_not_starts_with: String + type_not_starts_with_nocase: String + type_ends_with: String + type_ends_with_nocase: String + type_not_ends_with: String + type_not_ends_with_nocase: String + timestamp: String + timestamp_not: String + timestamp_gt: String + timestamp_lt: String + timestamp_gte: String + timestamp_lte: String + timestamp_in: [String!] + timestamp_not_in: [String!] + timestamp_contains: String + timestamp_contains_nocase: String + timestamp_not_contains: String + timestamp_not_contains_nocase: String + timestamp_starts_with: String + timestamp_starts_with_nocase: String + timestamp_not_starts_with: String + timestamp_not_starts_with_nocase: String + timestamp_ends_with: String + timestamp_ends_with_nocase: String + timestamp_not_ends_with: String + timestamp_not_ends_with_nocase: String + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [FileInfo_filter] + or: [FileInfo_filter] +} + +enum FileInfo_orderBy { + id + name + size + type + timestamp +} + +""" +8 bytes signed integer + +""" +scalar Int8 + +"""Defines the order direction, either ascending or descending""" +enum OrderDirection { + asc + desc +} + +type Query { + deedEntity( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): DeedEntity + deedEntities( + skip: Int = 0 + first: Int = 100 + orderBy: DeedEntity_orderBy + orderDirection: OrderDirection + where: DeedEntity_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [DeedEntity!]! + deedMetadata( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): DeedMetadata + deedMetadata_collection( + skip: Int = 0 + first: Int = 100 + orderBy: DeedMetadata_orderBy + orderDirection: OrderDirection + where: DeedMetadata_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [DeedMetadata!]! + transfer( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Transfer + transfers( + skip: Int = 0 + first: Int = 100 + orderBy: Transfer_orderBy + orderDirection: OrderDirection + where: Transfer_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Transfer!]! + approval( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Approval + approvals( + skip: Int = 0 + first: Int = 100 + orderBy: Approval_orderBy + orderDirection: OrderDirection + where: Approval_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Approval!]! + approvalForAll( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): ApprovalForAll + approvalForAlls( + skip: Int = 0 + first: Int = 100 + orderBy: ApprovalForAll_orderBy + orderDirection: OrderDirection + where: ApprovalForAll_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [ApprovalForAll!]! + fileInfo( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): FileInfo + fileInfos( + skip: Int = 0 + first: Int = 100 + orderBy: FileInfo_orderBy + orderDirection: OrderDirection + where: FileInfo_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [FileInfo!]! + """Access to subgraph metadata""" + _meta(block: Block_height): _Meta_ +} + +type Subscription { + deedEntity( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): DeedEntity + deedEntities( + skip: Int = 0 + first: Int = 100 + orderBy: DeedEntity_orderBy + orderDirection: OrderDirection + where: DeedEntity_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [DeedEntity!]! + deedMetadata( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): DeedMetadata + deedMetadata_collection( + skip: Int = 0 + first: Int = 100 + orderBy: DeedMetadata_orderBy + orderDirection: OrderDirection + where: DeedMetadata_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [DeedMetadata!]! + transfer( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Transfer + transfers( + skip: Int = 0 + first: Int = 100 + orderBy: Transfer_orderBy + orderDirection: OrderDirection + where: Transfer_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Transfer!]! + approval( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Approval + approvals( + skip: Int = 0 + first: Int = 100 + orderBy: Approval_orderBy + orderDirection: OrderDirection + where: Approval_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Approval!]! + approvalForAll( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): ApprovalForAll + approvalForAlls( + skip: Int = 0 + first: Int = 100 + orderBy: ApprovalForAll_orderBy + orderDirection: OrderDirection + where: ApprovalForAll_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [ApprovalForAll!]! + fileInfo( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): FileInfo + fileInfos( + skip: Int = 0 + first: Int = 100 + orderBy: FileInfo_orderBy + orderDirection: OrderDirection + where: FileInfo_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [FileInfo!]! + """Access to subgraph metadata""" + _meta(block: Block_height): _Meta_ +} + +type Transfer { + id: Bytes! + from: Bytes! + to: Bytes! + tokenId: BigInt! + blockNumber: BigInt! + blockTimestamp: BigInt! + transactionHash: Bytes! +} + +input Transfer_filter { + id: Bytes + id_not: Bytes + id_gt: Bytes + id_lt: Bytes + id_gte: Bytes + id_lte: Bytes + id_in: [Bytes!] + id_not_in: [Bytes!] + id_contains: Bytes + id_not_contains: Bytes + from: Bytes + from_not: Bytes + from_gt: Bytes + from_lt: Bytes + from_gte: Bytes + from_lte: Bytes + from_in: [Bytes!] + from_not_in: [Bytes!] + from_contains: Bytes + from_not_contains: Bytes + to: Bytes + to_not: Bytes + to_gt: Bytes + to_lt: Bytes + to_gte: Bytes + to_lte: Bytes + to_in: [Bytes!] + to_not_in: [Bytes!] + to_contains: Bytes + to_not_contains: Bytes + tokenId: BigInt + tokenId_not: BigInt + tokenId_gt: BigInt + tokenId_lt: BigInt + tokenId_gte: BigInt + tokenId_lte: BigInt + tokenId_in: [BigInt!] + tokenId_not_in: [BigInt!] + blockNumber: BigInt + blockNumber_not: BigInt + blockNumber_gt: BigInt + blockNumber_lt: BigInt + blockNumber_gte: BigInt + blockNumber_lte: BigInt + blockNumber_in: [BigInt!] + blockNumber_not_in: [BigInt!] + blockTimestamp: BigInt + blockTimestamp_not: BigInt + blockTimestamp_gt: BigInt + blockTimestamp_lt: BigInt + blockTimestamp_gte: BigInt + blockTimestamp_lte: BigInt + blockTimestamp_in: [BigInt!] + blockTimestamp_not_in: [BigInt!] + transactionHash: Bytes + transactionHash_not: Bytes + transactionHash_gt: Bytes + transactionHash_lt: Bytes + transactionHash_gte: Bytes + transactionHash_lte: Bytes + transactionHash_in: [Bytes!] + transactionHash_not_in: [Bytes!] + transactionHash_contains: Bytes + transactionHash_not_contains: Bytes + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [Transfer_filter] + or: [Transfer_filter] +} + +enum Transfer_orderBy { + id + from + to + tokenId + blockNumber + blockTimestamp + transactionHash +} + +type _Block_ { + """The hash of the block""" + hash: Bytes + """The block number""" + number: Int! + """Integer representation of the timestamp stored in blocks for the chain""" + timestamp: Int +} + +"""The type for the top-level _meta field""" +type _Meta_ { + """ + Information about a specific subgraph block. The hash of the block + will be null if the _meta field has a block constraint that asks for + a block number. It will be filled if the _meta field has no block constraint + and therefore asks for the latest block + + """ + block: _Block_! + """The deployment ID""" + deployment: String! + """If `true`, the subgraph encountered indexing errors at some past block""" + hasIndexingErrors: Boolean! +} + +enum _SubgraphErrorPolicy_ { + """Data will be returned even if the subgraph has indexing errors""" + allow + """ + If the subgraph has indexing errors, data will be omitted. The default. + """ + deny +} \ No newline at end of file diff --git a/packages/nextjs/.graphclient/sources/Deed3-Sepolia/introspectionSchema.ts b/packages/nextjs/.graphclient/sources/Deed3-Sepolia/introspectionSchema.ts new file mode 100644 index 00000000..6cf4591e --- /dev/null +++ b/packages/nextjs/.graphclient/sources/Deed3-Sepolia/introspectionSchema.ts @@ -0,0 +1,18988 @@ +// @ts-nocheck +import { buildASTSchema } from 'graphql'; + +const schemaAST = { + "kind": "Document", + "definitions": [ + { + "kind": "SchemaDefinition", + "operationTypes": [ + { + "kind": "OperationTypeDefinition", + "operation": "query", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Query" + } + } + }, + { + "kind": "OperationTypeDefinition", + "operation": "subscription", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Subscription" + } + } + } + ], + "directives": [] + }, + { + "kind": "DirectiveDefinition", + "description": { + "kind": "StringValue", + "value": "Marks the GraphQL type as indexable entity. Each type that should be an entity is required to be annotated with this directive." + }, + "name": { + "kind": "Name", + "value": "entity" + }, + "arguments": [], + "repeatable": false, + "locations": [ + { + "kind": "Name", + "value": "OBJECT" + } + ] + }, + { + "kind": "DirectiveDefinition", + "description": { + "kind": "StringValue", + "value": "Defined a Subgraph ID for an object type" + }, + "name": { + "kind": "Name", + "value": "subgraphId" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + } + ], + "repeatable": false, + "locations": [ + { + "kind": "Name", + "value": "OBJECT" + } + ] + }, + { + "kind": "DirectiveDefinition", + "description": { + "kind": "StringValue", + "value": "creates a virtual field on the entity that may be queried but cannot be set manually through the mappings API." + }, + "name": { + "kind": "Name", + "value": "derivedFrom" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "field" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + } + ], + "repeatable": false, + "locations": [ + { + "kind": "Name", + "value": "FIELD_DEFINITION" + } + ] + }, + { + "kind": "EnumTypeDefinition", + "name": { + "kind": "Name", + "value": "Aggregation_interval" + }, + "values": [ + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "hour" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "day" + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Approval" + }, + "fields": [ + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "owner" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "approved" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "tokenId" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "blockNumber" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "transactionHash" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + }, + "directives": [] + } + ], + "interfaces": [], + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "ApprovalForAll" + }, + "fields": [ + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "owner" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "operator" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "approved" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "blockNumber" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "transactionHash" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + }, + "directives": [] + } + ], + "interfaces": [], + "directives": [] + }, + { + "kind": "InputObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "ApprovalForAll_filter" + }, + "fields": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "operator" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "operator_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "operator_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "operator_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "operator_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "operator_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "operator_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "operator_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "operator_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "operator_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "approved" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "approved_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "approved_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "approved_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Filter for the block changed event.", + "block": true + }, + "name": { + "kind": "Name", + "value": "_change_block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BlockChangedFilter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ApprovalForAll_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ApprovalForAll_filter" + } + } + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "name": { + "kind": "Name", + "value": "ApprovalForAll_orderBy" + }, + "values": [ + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "owner" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "operator" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "approved" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash" + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "InputObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Approval_filter" + }, + "fields": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "approved" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "approved_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "approved_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "approved_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "approved_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "approved_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "approved_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "approved_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "approved_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "approved_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "tokenId" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "tokenId_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "tokenId_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "tokenId_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "tokenId_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "tokenId_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "tokenId_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "tokenId_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Filter for the block changed event.", + "block": true + }, + "name": { + "kind": "Name", + "value": "_change_block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BlockChangedFilter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Approval_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Approval_filter" + } + } + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "name": { + "kind": "Name", + "value": "Approval_orderBy" + }, + "values": [ + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "owner" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "approved" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "tokenId" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash" + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "ScalarTypeDefinition", + "name": { + "kind": "Name", + "value": "BigDecimal" + }, + "directives": [] + }, + { + "kind": "ScalarTypeDefinition", + "name": { + "kind": "Name", + "value": "BigInt" + }, + "directives": [] + }, + { + "kind": "InputObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "BlockChangedFilter" + }, + "fields": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "number_gte" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + } + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "InputObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Block_height" + }, + "fields": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "hash" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "number" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "number_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "ScalarTypeDefinition", + "name": { + "kind": "Name", + "value": "Bytes" + }, + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "DeedEntity" + }, + "fields": [ + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "deedId" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "owner" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "assetType" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "isValidated" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "minter" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "uri" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "blockNumber" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "transactionHash" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedMetadata" + } + } + }, + "directives": [] + } + ], + "interfaces": [], + "directives": [] + }, + { + "kind": "InputObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "DeedEntity_filter" + }, + "fields": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedId" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedId_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedId_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedId_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedId_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedId_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedId_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedId_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "owner_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "assetType" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "assetType_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "assetType_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "assetType_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "assetType_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "assetType_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "assetType_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "assetType_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "isValidated" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "isValidated_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "isValidated_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "isValidated_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "minter" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "minter_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "minter_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "minter_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "minter_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "minter_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "minter_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "minter_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "minter_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "minter_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "uri_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedMetadata_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Filter for the block changed event.", + "block": true + }, + "name": { + "kind": "Name", + "value": "_change_block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BlockChangedFilter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedEntity_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedEntity_filter" + } + } + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "name": { + "kind": "Name", + "value": "DeedEntity_orderBy" + }, + "values": [ + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "deedId" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "owner" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "assetType" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "isValidated" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "minter" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "uri" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata__id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata__ownerInformation_type" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata__ownerInformation_name" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata__ownerInformation_position" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata__ownerInformation_entityName" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata__ownerInformation_entityType" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata__propertyDetails_type" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata__propertyDetails_address" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata__propertyDetails_city" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata__propertyDetails_state" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata__propertyDetails_size" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata__propertyDetails_subType" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata__propertyDetails_zoning" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata__otherInformation_blockchain" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata__otherInformation_wrapper" + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "DeedMetadata" + }, + "fields": [ + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position" + }, + "arguments": [], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName" + }, + "arguments": [], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType" + }, + "arguments": [], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement" + }, + "arguments": [], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill" + }, + "arguments": [], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_supportingDoc" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo_filter" + } + }, + "directives": [] + } + ], + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo" + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size" + }, + "arguments": [], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType" + }, + "arguments": [], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning" + }, + "arguments": [], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract" + }, + "arguments": [], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_images" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo_filter" + } + }, + "directives": [] + } + ], + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo" + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + } + ], + "interfaces": [], + "directives": [] + }, + { + "kind": "InputObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "DeedMetadata_filter" + }, + "fields": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids_" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement_" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation_" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill_" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_supportingDoc" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_supportingDoc_not" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_supportingDoc_contains" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_supportingDoc_contains_nocase" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_supportingDoc_not_contains" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_supportingDoc_not_contains_nocase" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_supportingDoc_" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract_" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle_" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_images" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_images_not" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_images_contains" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_images_contains_nocase" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_images_not_contains" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_images_not_contains_nocase" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_images_" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Filter for the block changed event.", + "block": true + }, + "name": { + "kind": "Name", + "value": "_change_block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BlockChangedFilter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedMetadata_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedMetadata_filter" + } + } + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "name": { + "kind": "Name", + "value": "DeedMetadata_orderBy" + }, + "values": [ + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_type" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_name" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_position" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityName" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_entityType" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids__id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids__name" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids__size" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids__type" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_ids__timestamp" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement__id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement__name" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement__size" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement__type" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_operatingAgreement__timestamp" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation__id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation__name" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation__size" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation__type" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_articleIncorporation__timestamp" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill__id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill__name" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill__size" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill__type" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_proofBill__timestamp" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "ownerInformation_supportingDoc" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_type" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_address" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_city" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_state" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_size" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_subType" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_zoning" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract__id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract__name" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract__size" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract__type" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_purchaseContract__timestamp" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle__id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle__name" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle__size" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle__type" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_deedOrTitle__timestamp" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "propertyDetails_images" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_blockchain" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "otherInformation_wrapper" + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "FileInfo" + }, + "fields": [ + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "name" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "size" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "type" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "timestamp" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + } + ], + "interfaces": [], + "directives": [] + }, + { + "kind": "InputObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "FileInfo_filter" + }, + "fields": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "name_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "size" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "size_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "size_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "size_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "size_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "size_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "size_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "size_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "type_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_not_contains_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_not_starts_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_not_starts_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_not_ends_with" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp_not_ends_with_nocase" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Filter for the block changed event.", + "block": true + }, + "name": { + "kind": "Name", + "value": "_change_block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BlockChangedFilter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo_filter" + } + } + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "name": { + "kind": "Name", + "value": "FileInfo_orderBy" + }, + "values": [ + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "name" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "size" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "type" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "timestamp" + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "ScalarTypeDefinition", + "description": { + "kind": "StringValue", + "value": "8 bytes signed integer\n", + "block": true + }, + "name": { + "kind": "Name", + "value": "Int8" + }, + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "description": { + "kind": "StringValue", + "value": "Defines the order direction, either ascending or descending", + "block": true + }, + "name": { + "kind": "Name", + "value": "OrderDirection" + }, + "values": [ + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "asc" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "desc" + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Query" + }, + "fields": [ + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "deedEntity" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedEntity" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "deedEntities" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedEntity_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedEntity_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedEntity" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedMetadata" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_collection" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedMetadata_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedMetadata_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedMetadata" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "transfer" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Transfer" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "transfers" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Transfer_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Transfer_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Transfer" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "approval" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Approval" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "approvals" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Approval_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Approval_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Approval" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "approvalForAll" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ApprovalForAll" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "approvalForAlls" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ApprovalForAll_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ApprovalForAll_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ApprovalForAll" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "fileInfo" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "fileInfos" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "description": { + "kind": "StringValue", + "value": "Access to subgraph metadata", + "block": true + }, + "name": { + "kind": "Name", + "value": "_meta" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_Meta_" + } + }, + "directives": [] + } + ], + "interfaces": [], + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Subscription" + }, + "fields": [ + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "deedEntity" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedEntity" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "deedEntities" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedEntity_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedEntity_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedEntity" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedMetadata" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "deedMetadata_collection" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedMetadata_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedMetadata_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "DeedMetadata" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "transfer" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Transfer" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "transfers" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Transfer_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Transfer_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Transfer" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "approval" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Approval" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "approvals" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Approval_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Approval_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Approval" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "approvalForAll" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ApprovalForAll" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "approvalForAlls" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ApprovalForAll_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ApprovalForAll_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ApprovalForAll" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "fileInfo" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "fileInfos" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FileInfo" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "description": { + "kind": "StringValue", + "value": "Access to subgraph metadata", + "block": true + }, + "name": { + "kind": "Name", + "value": "_meta" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_Meta_" + } + }, + "directives": [] + } + ], + "interfaces": [], + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Transfer" + }, + "fields": [ + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "from" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "to" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "tokenId" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "blockNumber" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "transactionHash" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + }, + "directives": [] + } + ], + "interfaces": [], + "directives": [] + }, + { + "kind": "InputObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Transfer_filter" + }, + "fields": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "from" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "from_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "from_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "from_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "from_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "from_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "from_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "from_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "from_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "from_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "to" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "to_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "to_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "to_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "to_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "to_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "to_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "to_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "to_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "to_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "tokenId" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "tokenId_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "tokenId_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "tokenId_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "tokenId_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "tokenId_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "tokenId_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "tokenId_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Filter for the block changed event.", + "block": true + }, + "name": { + "kind": "Name", + "value": "_change_block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BlockChangedFilter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Transfer_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Transfer_filter" + } + } + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "name": { + "kind": "Name", + "value": "Transfer_orderBy" + }, + "values": [ + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "from" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "to" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "tokenId" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "blockNumber" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "blockTimestamp" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash" + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "_Block_" + }, + "fields": [ + { + "kind": "FieldDefinition", + "description": { + "kind": "StringValue", + "value": "The hash of the block", + "block": true + }, + "name": { + "kind": "Name", + "value": "hash" + }, + "arguments": [], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "description": { + "kind": "StringValue", + "value": "The block number", + "block": true + }, + "name": { + "kind": "Name", + "value": "number" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "description": { + "kind": "StringValue", + "value": "Integer representation of the timestamp stored in blocks for the chain", + "block": true + }, + "name": { + "kind": "Name", + "value": "timestamp" + }, + "arguments": [], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "directives": [] + } + ], + "interfaces": [], + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "description": { + "kind": "StringValue", + "value": "The type for the top-level _meta field", + "block": true + }, + "name": { + "kind": "Name", + "value": "_Meta_" + }, + "fields": [ + { + "kind": "FieldDefinition", + "description": { + "kind": "StringValue", + "value": "Information about a specific subgraph block. The hash of the block\nwill be null if the _meta field has a block constraint that asks for\na block number. It will be filled if the _meta field has no block constraint\nand therefore asks for the latest block\n", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_Block_" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "description": { + "kind": "StringValue", + "value": "The deployment ID", + "block": true + }, + "name": { + "kind": "Name", + "value": "deployment" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "String" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "description": { + "kind": "StringValue", + "value": "If `true`, the subgraph encountered indexing errors at some past block", + "block": true + }, + "name": { + "kind": "Name", + "value": "hasIndexingErrors" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" + } + } + }, + "directives": [] + } + ], + "interfaces": [], + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + }, + "values": [ + { + "kind": "EnumValueDefinition", + "description": { + "kind": "StringValue", + "value": "Data will be returned even if the subgraph has indexing errors", + "block": true + }, + "name": { + "kind": "Name", + "value": "allow" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "description": { + "kind": "StringValue", + "value": "If the subgraph has indexing errors, data will be omitted. The default.", + "block": true + }, + "name": { + "kind": "Name", + "value": "deny" + }, + "directives": [] + } + ], + "directives": [] + } + ] +}; + +export default buildASTSchema(schemaAST, { + assumeValid: true, + assumeValidSDL: true +}); \ No newline at end of file diff --git a/packages/nextjs/.graphclient/sources/Deed3-Sepolia/schema.graphql b/packages/nextjs/.graphclient/sources/Deed3-Sepolia/schema.graphql new file mode 100644 index 00000000..603285d3 --- /dev/null +++ b/packages/nextjs/.graphclient/sources/Deed3-Sepolia/schema.graphql @@ -0,0 +1,1452 @@ +schema { + query: Query + subscription: Subscription +} + +"Marks the GraphQL type as indexable entity. Each type that should be an entity is required to be annotated with this directive." +directive @entity on OBJECT + +"Defined a Subgraph ID for an object type" +directive @subgraphId(id: String!) on OBJECT + +"creates a virtual field on the entity that may be queried but cannot be set manually through the mappings API." +directive @derivedFrom(field: String!) on FIELD_DEFINITION + +enum Aggregation_interval { + hour + day +} + +type Approval { + id: Bytes! + owner: Bytes! + approved: Bytes! + tokenId: BigInt! + blockNumber: BigInt! + blockTimestamp: BigInt! + transactionHash: Bytes! +} + +type ApprovalForAll { + id: Bytes! + owner: Bytes! + operator: Bytes! + approved: Boolean! + blockNumber: BigInt! + blockTimestamp: BigInt! + transactionHash: Bytes! +} + +input ApprovalForAll_filter { + id: Bytes + id_not: Bytes + id_gt: Bytes + id_lt: Bytes + id_gte: Bytes + id_lte: Bytes + id_in: [Bytes!] + id_not_in: [Bytes!] + id_contains: Bytes + id_not_contains: Bytes + owner: Bytes + owner_not: Bytes + owner_gt: Bytes + owner_lt: Bytes + owner_gte: Bytes + owner_lte: Bytes + owner_in: [Bytes!] + owner_not_in: [Bytes!] + owner_contains: Bytes + owner_not_contains: Bytes + operator: Bytes + operator_not: Bytes + operator_gt: Bytes + operator_lt: Bytes + operator_gte: Bytes + operator_lte: Bytes + operator_in: [Bytes!] + operator_not_in: [Bytes!] + operator_contains: Bytes + operator_not_contains: Bytes + approved: Boolean + approved_not: Boolean + approved_in: [Boolean!] + approved_not_in: [Boolean!] + blockNumber: BigInt + blockNumber_not: BigInt + blockNumber_gt: BigInt + blockNumber_lt: BigInt + blockNumber_gte: BigInt + blockNumber_lte: BigInt + blockNumber_in: [BigInt!] + blockNumber_not_in: [BigInt!] + blockTimestamp: BigInt + blockTimestamp_not: BigInt + blockTimestamp_gt: BigInt + blockTimestamp_lt: BigInt + blockTimestamp_gte: BigInt + blockTimestamp_lte: BigInt + blockTimestamp_in: [BigInt!] + blockTimestamp_not_in: [BigInt!] + transactionHash: Bytes + transactionHash_not: Bytes + transactionHash_gt: Bytes + transactionHash_lt: Bytes + transactionHash_gte: Bytes + transactionHash_lte: Bytes + transactionHash_in: [Bytes!] + transactionHash_not_in: [Bytes!] + transactionHash_contains: Bytes + transactionHash_not_contains: Bytes + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [ApprovalForAll_filter] + or: [ApprovalForAll_filter] +} + +enum ApprovalForAll_orderBy { + id + owner + operator + approved + blockNumber + blockTimestamp + transactionHash +} + +input Approval_filter { + id: Bytes + id_not: Bytes + id_gt: Bytes + id_lt: Bytes + id_gte: Bytes + id_lte: Bytes + id_in: [Bytes!] + id_not_in: [Bytes!] + id_contains: Bytes + id_not_contains: Bytes + owner: Bytes + owner_not: Bytes + owner_gt: Bytes + owner_lt: Bytes + owner_gte: Bytes + owner_lte: Bytes + owner_in: [Bytes!] + owner_not_in: [Bytes!] + owner_contains: Bytes + owner_not_contains: Bytes + approved: Bytes + approved_not: Bytes + approved_gt: Bytes + approved_lt: Bytes + approved_gte: Bytes + approved_lte: Bytes + approved_in: [Bytes!] + approved_not_in: [Bytes!] + approved_contains: Bytes + approved_not_contains: Bytes + tokenId: BigInt + tokenId_not: BigInt + tokenId_gt: BigInt + tokenId_lt: BigInt + tokenId_gte: BigInt + tokenId_lte: BigInt + tokenId_in: [BigInt!] + tokenId_not_in: [BigInt!] + blockNumber: BigInt + blockNumber_not: BigInt + blockNumber_gt: BigInt + blockNumber_lt: BigInt + blockNumber_gte: BigInt + blockNumber_lte: BigInt + blockNumber_in: [BigInt!] + blockNumber_not_in: [BigInt!] + blockTimestamp: BigInt + blockTimestamp_not: BigInt + blockTimestamp_gt: BigInt + blockTimestamp_lt: BigInt + blockTimestamp_gte: BigInt + blockTimestamp_lte: BigInt + blockTimestamp_in: [BigInt!] + blockTimestamp_not_in: [BigInt!] + transactionHash: Bytes + transactionHash_not: Bytes + transactionHash_gt: Bytes + transactionHash_lt: Bytes + transactionHash_gte: Bytes + transactionHash_lte: Bytes + transactionHash_in: [Bytes!] + transactionHash_not_in: [Bytes!] + transactionHash_contains: Bytes + transactionHash_not_contains: Bytes + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [Approval_filter] + or: [Approval_filter] +} + +enum Approval_orderBy { + id + owner + approved + tokenId + blockNumber + blockTimestamp + transactionHash +} + +scalar BigDecimal + +scalar BigInt + +input BlockChangedFilter { + number_gte: Int! +} + +input Block_height { + hash: Bytes + number: Int + number_gte: Int +} + +scalar Bytes + +type DeedEntity { + id: ID! + deedId: BigInt! + owner: Bytes! + assetType: Int! + isValidated: Boolean! + minter: Bytes! + uri: String! + blockNumber: BigInt! + blockTimestamp: BigInt! + transactionHash: Bytes! + deedMetadata: DeedMetadata! +} + +input DeedEntity_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + deedId: BigInt + deedId_not: BigInt + deedId_gt: BigInt + deedId_lt: BigInt + deedId_gte: BigInt + deedId_lte: BigInt + deedId_in: [BigInt!] + deedId_not_in: [BigInt!] + owner: Bytes + owner_not: Bytes + owner_gt: Bytes + owner_lt: Bytes + owner_gte: Bytes + owner_lte: Bytes + owner_in: [Bytes!] + owner_not_in: [Bytes!] + owner_contains: Bytes + owner_not_contains: Bytes + assetType: Int + assetType_not: Int + assetType_gt: Int + assetType_lt: Int + assetType_gte: Int + assetType_lte: Int + assetType_in: [Int!] + assetType_not_in: [Int!] + isValidated: Boolean + isValidated_not: Boolean + isValidated_in: [Boolean!] + isValidated_not_in: [Boolean!] + minter: Bytes + minter_not: Bytes + minter_gt: Bytes + minter_lt: Bytes + minter_gte: Bytes + minter_lte: Bytes + minter_in: [Bytes!] + minter_not_in: [Bytes!] + minter_contains: Bytes + minter_not_contains: Bytes + uri: String + uri_not: String + uri_gt: String + uri_lt: String + uri_gte: String + uri_lte: String + uri_in: [String!] + uri_not_in: [String!] + uri_contains: String + uri_contains_nocase: String + uri_not_contains: String + uri_not_contains_nocase: String + uri_starts_with: String + uri_starts_with_nocase: String + uri_not_starts_with: String + uri_not_starts_with_nocase: String + uri_ends_with: String + uri_ends_with_nocase: String + uri_not_ends_with: String + uri_not_ends_with_nocase: String + blockNumber: BigInt + blockNumber_not: BigInt + blockNumber_gt: BigInt + blockNumber_lt: BigInt + blockNumber_gte: BigInt + blockNumber_lte: BigInt + blockNumber_in: [BigInt!] + blockNumber_not_in: [BigInt!] + blockTimestamp: BigInt + blockTimestamp_not: BigInt + blockTimestamp_gt: BigInt + blockTimestamp_lt: BigInt + blockTimestamp_gte: BigInt + blockTimestamp_lte: BigInt + blockTimestamp_in: [BigInt!] + blockTimestamp_not_in: [BigInt!] + transactionHash: Bytes + transactionHash_not: Bytes + transactionHash_gt: Bytes + transactionHash_lt: Bytes + transactionHash_gte: Bytes + transactionHash_lte: Bytes + transactionHash_in: [Bytes!] + transactionHash_not_in: [Bytes!] + transactionHash_contains: Bytes + transactionHash_not_contains: Bytes + deedMetadata: String + deedMetadata_not: String + deedMetadata_gt: String + deedMetadata_lt: String + deedMetadata_gte: String + deedMetadata_lte: String + deedMetadata_in: [String!] + deedMetadata_not_in: [String!] + deedMetadata_contains: String + deedMetadata_contains_nocase: String + deedMetadata_not_contains: String + deedMetadata_not_contains_nocase: String + deedMetadata_starts_with: String + deedMetadata_starts_with_nocase: String + deedMetadata_not_starts_with: String + deedMetadata_not_starts_with_nocase: String + deedMetadata_ends_with: String + deedMetadata_ends_with_nocase: String + deedMetadata_not_ends_with: String + deedMetadata_not_ends_with_nocase: String + deedMetadata_: DeedMetadata_filter + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [DeedEntity_filter] + or: [DeedEntity_filter] +} + +enum DeedEntity_orderBy { + id + deedId + owner + assetType + isValidated + minter + uri + blockNumber + blockTimestamp + transactionHash + deedMetadata + deedMetadata__id + deedMetadata__ownerInformation_type + deedMetadata__ownerInformation_name + deedMetadata__ownerInformation_position + deedMetadata__ownerInformation_entityName + deedMetadata__ownerInformation_entityType + deedMetadata__propertyDetails_type + deedMetadata__propertyDetails_address + deedMetadata__propertyDetails_city + deedMetadata__propertyDetails_state + deedMetadata__propertyDetails_size + deedMetadata__propertyDetails_subType + deedMetadata__propertyDetails_zoning + deedMetadata__otherInformation_blockchain + deedMetadata__otherInformation_wrapper +} + +type DeedMetadata { + id: ID! + ownerInformation_type: String! + ownerInformation_name: String! + ownerInformation_position: String + ownerInformation_entityName: String + ownerInformation_entityType: String + ownerInformation_ids: FileInfo! + ownerInformation_operatingAgreement: FileInfo + ownerInformation_articleIncorporation: FileInfo! + ownerInformation_proofBill: FileInfo + ownerInformation_supportingDoc(skip: Int = 0, first: Int = 100, orderBy: FileInfo_orderBy, orderDirection: OrderDirection, where: FileInfo_filter): [FileInfo!] + propertyDetails_type: String! + propertyDetails_address: String! + propertyDetails_city: String! + propertyDetails_state: String! + propertyDetails_size: String + propertyDetails_subType: String + propertyDetails_zoning: String + propertyDetails_purchaseContract: FileInfo + propertyDetails_deedOrTitle: FileInfo! + propertyDetails_images(skip: Int = 0, first: Int = 100, orderBy: FileInfo_orderBy, orderDirection: OrderDirection, where: FileInfo_filter): [FileInfo!] + otherInformation_blockchain: String! + otherInformation_wrapper: String! +} + +input DeedMetadata_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + ownerInformation_type: String + ownerInformation_type_not: String + ownerInformation_type_gt: String + ownerInformation_type_lt: String + ownerInformation_type_gte: String + ownerInformation_type_lte: String + ownerInformation_type_in: [String!] + ownerInformation_type_not_in: [String!] + ownerInformation_type_contains: String + ownerInformation_type_contains_nocase: String + ownerInformation_type_not_contains: String + ownerInformation_type_not_contains_nocase: String + ownerInformation_type_starts_with: String + ownerInformation_type_starts_with_nocase: String + ownerInformation_type_not_starts_with: String + ownerInformation_type_not_starts_with_nocase: String + ownerInformation_type_ends_with: String + ownerInformation_type_ends_with_nocase: String + ownerInformation_type_not_ends_with: String + ownerInformation_type_not_ends_with_nocase: String + ownerInformation_name: String + ownerInformation_name_not: String + ownerInformation_name_gt: String + ownerInformation_name_lt: String + ownerInformation_name_gte: String + ownerInformation_name_lte: String + ownerInformation_name_in: [String!] + ownerInformation_name_not_in: [String!] + ownerInformation_name_contains: String + ownerInformation_name_contains_nocase: String + ownerInformation_name_not_contains: String + ownerInformation_name_not_contains_nocase: String + ownerInformation_name_starts_with: String + ownerInformation_name_starts_with_nocase: String + ownerInformation_name_not_starts_with: String + ownerInformation_name_not_starts_with_nocase: String + ownerInformation_name_ends_with: String + ownerInformation_name_ends_with_nocase: String + ownerInformation_name_not_ends_with: String + ownerInformation_name_not_ends_with_nocase: String + ownerInformation_position: String + ownerInformation_position_not: String + ownerInformation_position_gt: String + ownerInformation_position_lt: String + ownerInformation_position_gte: String + ownerInformation_position_lte: String + ownerInformation_position_in: [String!] + ownerInformation_position_not_in: [String!] + ownerInformation_position_contains: String + ownerInformation_position_contains_nocase: String + ownerInformation_position_not_contains: String + ownerInformation_position_not_contains_nocase: String + ownerInformation_position_starts_with: String + ownerInformation_position_starts_with_nocase: String + ownerInformation_position_not_starts_with: String + ownerInformation_position_not_starts_with_nocase: String + ownerInformation_position_ends_with: String + ownerInformation_position_ends_with_nocase: String + ownerInformation_position_not_ends_with: String + ownerInformation_position_not_ends_with_nocase: String + ownerInformation_entityName: String + ownerInformation_entityName_not: String + ownerInformation_entityName_gt: String + ownerInformation_entityName_lt: String + ownerInformation_entityName_gte: String + ownerInformation_entityName_lte: String + ownerInformation_entityName_in: [String!] + ownerInformation_entityName_not_in: [String!] + ownerInformation_entityName_contains: String + ownerInformation_entityName_contains_nocase: String + ownerInformation_entityName_not_contains: String + ownerInformation_entityName_not_contains_nocase: String + ownerInformation_entityName_starts_with: String + ownerInformation_entityName_starts_with_nocase: String + ownerInformation_entityName_not_starts_with: String + ownerInformation_entityName_not_starts_with_nocase: String + ownerInformation_entityName_ends_with: String + ownerInformation_entityName_ends_with_nocase: String + ownerInformation_entityName_not_ends_with: String + ownerInformation_entityName_not_ends_with_nocase: String + ownerInformation_entityType: String + ownerInformation_entityType_not: String + ownerInformation_entityType_gt: String + ownerInformation_entityType_lt: String + ownerInformation_entityType_gte: String + ownerInformation_entityType_lte: String + ownerInformation_entityType_in: [String!] + ownerInformation_entityType_not_in: [String!] + ownerInformation_entityType_contains: String + ownerInformation_entityType_contains_nocase: String + ownerInformation_entityType_not_contains: String + ownerInformation_entityType_not_contains_nocase: String + ownerInformation_entityType_starts_with: String + ownerInformation_entityType_starts_with_nocase: String + ownerInformation_entityType_not_starts_with: String + ownerInformation_entityType_not_starts_with_nocase: String + ownerInformation_entityType_ends_with: String + ownerInformation_entityType_ends_with_nocase: String + ownerInformation_entityType_not_ends_with: String + ownerInformation_entityType_not_ends_with_nocase: String + ownerInformation_ids: String + ownerInformation_ids_not: String + ownerInformation_ids_gt: String + ownerInformation_ids_lt: String + ownerInformation_ids_gte: String + ownerInformation_ids_lte: String + ownerInformation_ids_in: [String!] + ownerInformation_ids_not_in: [String!] + ownerInformation_ids_contains: String + ownerInformation_ids_contains_nocase: String + ownerInformation_ids_not_contains: String + ownerInformation_ids_not_contains_nocase: String + ownerInformation_ids_starts_with: String + ownerInformation_ids_starts_with_nocase: String + ownerInformation_ids_not_starts_with: String + ownerInformation_ids_not_starts_with_nocase: String + ownerInformation_ids_ends_with: String + ownerInformation_ids_ends_with_nocase: String + ownerInformation_ids_not_ends_with: String + ownerInformation_ids_not_ends_with_nocase: String + ownerInformation_ids_: FileInfo_filter + ownerInformation_operatingAgreement: String + ownerInformation_operatingAgreement_not: String + ownerInformation_operatingAgreement_gt: String + ownerInformation_operatingAgreement_lt: String + ownerInformation_operatingAgreement_gte: String + ownerInformation_operatingAgreement_lte: String + ownerInformation_operatingAgreement_in: [String!] + ownerInformation_operatingAgreement_not_in: [String!] + ownerInformation_operatingAgreement_contains: String + ownerInformation_operatingAgreement_contains_nocase: String + ownerInformation_operatingAgreement_not_contains: String + ownerInformation_operatingAgreement_not_contains_nocase: String + ownerInformation_operatingAgreement_starts_with: String + ownerInformation_operatingAgreement_starts_with_nocase: String + ownerInformation_operatingAgreement_not_starts_with: String + ownerInformation_operatingAgreement_not_starts_with_nocase: String + ownerInformation_operatingAgreement_ends_with: String + ownerInformation_operatingAgreement_ends_with_nocase: String + ownerInformation_operatingAgreement_not_ends_with: String + ownerInformation_operatingAgreement_not_ends_with_nocase: String + ownerInformation_operatingAgreement_: FileInfo_filter + ownerInformation_articleIncorporation: String + ownerInformation_articleIncorporation_not: String + ownerInformation_articleIncorporation_gt: String + ownerInformation_articleIncorporation_lt: String + ownerInformation_articleIncorporation_gte: String + ownerInformation_articleIncorporation_lte: String + ownerInformation_articleIncorporation_in: [String!] + ownerInformation_articleIncorporation_not_in: [String!] + ownerInformation_articleIncorporation_contains: String + ownerInformation_articleIncorporation_contains_nocase: String + ownerInformation_articleIncorporation_not_contains: String + ownerInformation_articleIncorporation_not_contains_nocase: String + ownerInformation_articleIncorporation_starts_with: String + ownerInformation_articleIncorporation_starts_with_nocase: String + ownerInformation_articleIncorporation_not_starts_with: String + ownerInformation_articleIncorporation_not_starts_with_nocase: String + ownerInformation_articleIncorporation_ends_with: String + ownerInformation_articleIncorporation_ends_with_nocase: String + ownerInformation_articleIncorporation_not_ends_with: String + ownerInformation_articleIncorporation_not_ends_with_nocase: String + ownerInformation_articleIncorporation_: FileInfo_filter + ownerInformation_proofBill: String + ownerInformation_proofBill_not: String + ownerInformation_proofBill_gt: String + ownerInformation_proofBill_lt: String + ownerInformation_proofBill_gte: String + ownerInformation_proofBill_lte: String + ownerInformation_proofBill_in: [String!] + ownerInformation_proofBill_not_in: [String!] + ownerInformation_proofBill_contains: String + ownerInformation_proofBill_contains_nocase: String + ownerInformation_proofBill_not_contains: String + ownerInformation_proofBill_not_contains_nocase: String + ownerInformation_proofBill_starts_with: String + ownerInformation_proofBill_starts_with_nocase: String + ownerInformation_proofBill_not_starts_with: String + ownerInformation_proofBill_not_starts_with_nocase: String + ownerInformation_proofBill_ends_with: String + ownerInformation_proofBill_ends_with_nocase: String + ownerInformation_proofBill_not_ends_with: String + ownerInformation_proofBill_not_ends_with_nocase: String + ownerInformation_proofBill_: FileInfo_filter + ownerInformation_supportingDoc: [String!] + ownerInformation_supportingDoc_not: [String!] + ownerInformation_supportingDoc_contains: [String!] + ownerInformation_supportingDoc_contains_nocase: [String!] + ownerInformation_supportingDoc_not_contains: [String!] + ownerInformation_supportingDoc_not_contains_nocase: [String!] + ownerInformation_supportingDoc_: FileInfo_filter + propertyDetails_type: String + propertyDetails_type_not: String + propertyDetails_type_gt: String + propertyDetails_type_lt: String + propertyDetails_type_gte: String + propertyDetails_type_lte: String + propertyDetails_type_in: [String!] + propertyDetails_type_not_in: [String!] + propertyDetails_type_contains: String + propertyDetails_type_contains_nocase: String + propertyDetails_type_not_contains: String + propertyDetails_type_not_contains_nocase: String + propertyDetails_type_starts_with: String + propertyDetails_type_starts_with_nocase: String + propertyDetails_type_not_starts_with: String + propertyDetails_type_not_starts_with_nocase: String + propertyDetails_type_ends_with: String + propertyDetails_type_ends_with_nocase: String + propertyDetails_type_not_ends_with: String + propertyDetails_type_not_ends_with_nocase: String + propertyDetails_address: String + propertyDetails_address_not: String + propertyDetails_address_gt: String + propertyDetails_address_lt: String + propertyDetails_address_gte: String + propertyDetails_address_lte: String + propertyDetails_address_in: [String!] + propertyDetails_address_not_in: [String!] + propertyDetails_address_contains: String + propertyDetails_address_contains_nocase: String + propertyDetails_address_not_contains: String + propertyDetails_address_not_contains_nocase: String + propertyDetails_address_starts_with: String + propertyDetails_address_starts_with_nocase: String + propertyDetails_address_not_starts_with: String + propertyDetails_address_not_starts_with_nocase: String + propertyDetails_address_ends_with: String + propertyDetails_address_ends_with_nocase: String + propertyDetails_address_not_ends_with: String + propertyDetails_address_not_ends_with_nocase: String + propertyDetails_city: String + propertyDetails_city_not: String + propertyDetails_city_gt: String + propertyDetails_city_lt: String + propertyDetails_city_gte: String + propertyDetails_city_lte: String + propertyDetails_city_in: [String!] + propertyDetails_city_not_in: [String!] + propertyDetails_city_contains: String + propertyDetails_city_contains_nocase: String + propertyDetails_city_not_contains: String + propertyDetails_city_not_contains_nocase: String + propertyDetails_city_starts_with: String + propertyDetails_city_starts_with_nocase: String + propertyDetails_city_not_starts_with: String + propertyDetails_city_not_starts_with_nocase: String + propertyDetails_city_ends_with: String + propertyDetails_city_ends_with_nocase: String + propertyDetails_city_not_ends_with: String + propertyDetails_city_not_ends_with_nocase: String + propertyDetails_state: String + propertyDetails_state_not: String + propertyDetails_state_gt: String + propertyDetails_state_lt: String + propertyDetails_state_gte: String + propertyDetails_state_lte: String + propertyDetails_state_in: [String!] + propertyDetails_state_not_in: [String!] + propertyDetails_state_contains: String + propertyDetails_state_contains_nocase: String + propertyDetails_state_not_contains: String + propertyDetails_state_not_contains_nocase: String + propertyDetails_state_starts_with: String + propertyDetails_state_starts_with_nocase: String + propertyDetails_state_not_starts_with: String + propertyDetails_state_not_starts_with_nocase: String + propertyDetails_state_ends_with: String + propertyDetails_state_ends_with_nocase: String + propertyDetails_state_not_ends_with: String + propertyDetails_state_not_ends_with_nocase: String + propertyDetails_size: String + propertyDetails_size_not: String + propertyDetails_size_gt: String + propertyDetails_size_lt: String + propertyDetails_size_gte: String + propertyDetails_size_lte: String + propertyDetails_size_in: [String!] + propertyDetails_size_not_in: [String!] + propertyDetails_size_contains: String + propertyDetails_size_contains_nocase: String + propertyDetails_size_not_contains: String + propertyDetails_size_not_contains_nocase: String + propertyDetails_size_starts_with: String + propertyDetails_size_starts_with_nocase: String + propertyDetails_size_not_starts_with: String + propertyDetails_size_not_starts_with_nocase: String + propertyDetails_size_ends_with: String + propertyDetails_size_ends_with_nocase: String + propertyDetails_size_not_ends_with: String + propertyDetails_size_not_ends_with_nocase: String + propertyDetails_subType: String + propertyDetails_subType_not: String + propertyDetails_subType_gt: String + propertyDetails_subType_lt: String + propertyDetails_subType_gte: String + propertyDetails_subType_lte: String + propertyDetails_subType_in: [String!] + propertyDetails_subType_not_in: [String!] + propertyDetails_subType_contains: String + propertyDetails_subType_contains_nocase: String + propertyDetails_subType_not_contains: String + propertyDetails_subType_not_contains_nocase: String + propertyDetails_subType_starts_with: String + propertyDetails_subType_starts_with_nocase: String + propertyDetails_subType_not_starts_with: String + propertyDetails_subType_not_starts_with_nocase: String + propertyDetails_subType_ends_with: String + propertyDetails_subType_ends_with_nocase: String + propertyDetails_subType_not_ends_with: String + propertyDetails_subType_not_ends_with_nocase: String + propertyDetails_zoning: String + propertyDetails_zoning_not: String + propertyDetails_zoning_gt: String + propertyDetails_zoning_lt: String + propertyDetails_zoning_gte: String + propertyDetails_zoning_lte: String + propertyDetails_zoning_in: [String!] + propertyDetails_zoning_not_in: [String!] + propertyDetails_zoning_contains: String + propertyDetails_zoning_contains_nocase: String + propertyDetails_zoning_not_contains: String + propertyDetails_zoning_not_contains_nocase: String + propertyDetails_zoning_starts_with: String + propertyDetails_zoning_starts_with_nocase: String + propertyDetails_zoning_not_starts_with: String + propertyDetails_zoning_not_starts_with_nocase: String + propertyDetails_zoning_ends_with: String + propertyDetails_zoning_ends_with_nocase: String + propertyDetails_zoning_not_ends_with: String + propertyDetails_zoning_not_ends_with_nocase: String + propertyDetails_purchaseContract: String + propertyDetails_purchaseContract_not: String + propertyDetails_purchaseContract_gt: String + propertyDetails_purchaseContract_lt: String + propertyDetails_purchaseContract_gte: String + propertyDetails_purchaseContract_lte: String + propertyDetails_purchaseContract_in: [String!] + propertyDetails_purchaseContract_not_in: [String!] + propertyDetails_purchaseContract_contains: String + propertyDetails_purchaseContract_contains_nocase: String + propertyDetails_purchaseContract_not_contains: String + propertyDetails_purchaseContract_not_contains_nocase: String + propertyDetails_purchaseContract_starts_with: String + propertyDetails_purchaseContract_starts_with_nocase: String + propertyDetails_purchaseContract_not_starts_with: String + propertyDetails_purchaseContract_not_starts_with_nocase: String + propertyDetails_purchaseContract_ends_with: String + propertyDetails_purchaseContract_ends_with_nocase: String + propertyDetails_purchaseContract_not_ends_with: String + propertyDetails_purchaseContract_not_ends_with_nocase: String + propertyDetails_purchaseContract_: FileInfo_filter + propertyDetails_deedOrTitle: String + propertyDetails_deedOrTitle_not: String + propertyDetails_deedOrTitle_gt: String + propertyDetails_deedOrTitle_lt: String + propertyDetails_deedOrTitle_gte: String + propertyDetails_deedOrTitle_lte: String + propertyDetails_deedOrTitle_in: [String!] + propertyDetails_deedOrTitle_not_in: [String!] + propertyDetails_deedOrTitle_contains: String + propertyDetails_deedOrTitle_contains_nocase: String + propertyDetails_deedOrTitle_not_contains: String + propertyDetails_deedOrTitle_not_contains_nocase: String + propertyDetails_deedOrTitle_starts_with: String + propertyDetails_deedOrTitle_starts_with_nocase: String + propertyDetails_deedOrTitle_not_starts_with: String + propertyDetails_deedOrTitle_not_starts_with_nocase: String + propertyDetails_deedOrTitle_ends_with: String + propertyDetails_deedOrTitle_ends_with_nocase: String + propertyDetails_deedOrTitle_not_ends_with: String + propertyDetails_deedOrTitle_not_ends_with_nocase: String + propertyDetails_deedOrTitle_: FileInfo_filter + propertyDetails_images: [String!] + propertyDetails_images_not: [String!] + propertyDetails_images_contains: [String!] + propertyDetails_images_contains_nocase: [String!] + propertyDetails_images_not_contains: [String!] + propertyDetails_images_not_contains_nocase: [String!] + propertyDetails_images_: FileInfo_filter + otherInformation_blockchain: String + otherInformation_blockchain_not: String + otherInformation_blockchain_gt: String + otherInformation_blockchain_lt: String + otherInformation_blockchain_gte: String + otherInformation_blockchain_lte: String + otherInformation_blockchain_in: [String!] + otherInformation_blockchain_not_in: [String!] + otherInformation_blockchain_contains: String + otherInformation_blockchain_contains_nocase: String + otherInformation_blockchain_not_contains: String + otherInformation_blockchain_not_contains_nocase: String + otherInformation_blockchain_starts_with: String + otherInformation_blockchain_starts_with_nocase: String + otherInformation_blockchain_not_starts_with: String + otherInformation_blockchain_not_starts_with_nocase: String + otherInformation_blockchain_ends_with: String + otherInformation_blockchain_ends_with_nocase: String + otherInformation_blockchain_not_ends_with: String + otherInformation_blockchain_not_ends_with_nocase: String + otherInformation_wrapper: String + otherInformation_wrapper_not: String + otherInformation_wrapper_gt: String + otherInformation_wrapper_lt: String + otherInformation_wrapper_gte: String + otherInformation_wrapper_lte: String + otherInformation_wrapper_in: [String!] + otherInformation_wrapper_not_in: [String!] + otherInformation_wrapper_contains: String + otherInformation_wrapper_contains_nocase: String + otherInformation_wrapper_not_contains: String + otherInformation_wrapper_not_contains_nocase: String + otherInformation_wrapper_starts_with: String + otherInformation_wrapper_starts_with_nocase: String + otherInformation_wrapper_not_starts_with: String + otherInformation_wrapper_not_starts_with_nocase: String + otherInformation_wrapper_ends_with: String + otherInformation_wrapper_ends_with_nocase: String + otherInformation_wrapper_not_ends_with: String + otherInformation_wrapper_not_ends_with_nocase: String + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [DeedMetadata_filter] + or: [DeedMetadata_filter] +} + +enum DeedMetadata_orderBy { + id + ownerInformation_type + ownerInformation_name + ownerInformation_position + ownerInformation_entityName + ownerInformation_entityType + ownerInformation_ids + ownerInformation_ids__id + ownerInformation_ids__name + ownerInformation_ids__size + ownerInformation_ids__type + ownerInformation_ids__timestamp + ownerInformation_operatingAgreement + ownerInformation_operatingAgreement__id + ownerInformation_operatingAgreement__name + ownerInformation_operatingAgreement__size + ownerInformation_operatingAgreement__type + ownerInformation_operatingAgreement__timestamp + ownerInformation_articleIncorporation + ownerInformation_articleIncorporation__id + ownerInformation_articleIncorporation__name + ownerInformation_articleIncorporation__size + ownerInformation_articleIncorporation__type + ownerInformation_articleIncorporation__timestamp + ownerInformation_proofBill + ownerInformation_proofBill__id + ownerInformation_proofBill__name + ownerInformation_proofBill__size + ownerInformation_proofBill__type + ownerInformation_proofBill__timestamp + ownerInformation_supportingDoc + propertyDetails_type + propertyDetails_address + propertyDetails_city + propertyDetails_state + propertyDetails_size + propertyDetails_subType + propertyDetails_zoning + propertyDetails_purchaseContract + propertyDetails_purchaseContract__id + propertyDetails_purchaseContract__name + propertyDetails_purchaseContract__size + propertyDetails_purchaseContract__type + propertyDetails_purchaseContract__timestamp + propertyDetails_deedOrTitle + propertyDetails_deedOrTitle__id + propertyDetails_deedOrTitle__name + propertyDetails_deedOrTitle__size + propertyDetails_deedOrTitle__type + propertyDetails_deedOrTitle__timestamp + propertyDetails_images + otherInformation_blockchain + otherInformation_wrapper +} + +type FileInfo { + id: ID! + name: String! + size: BigInt! + type: String! + timestamp: String! +} + +input FileInfo_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + name: String + name_not: String + name_gt: String + name_lt: String + name_gte: String + name_lte: String + name_in: [String!] + name_not_in: [String!] + name_contains: String + name_contains_nocase: String + name_not_contains: String + name_not_contains_nocase: String + name_starts_with: String + name_starts_with_nocase: String + name_not_starts_with: String + name_not_starts_with_nocase: String + name_ends_with: String + name_ends_with_nocase: String + name_not_ends_with: String + name_not_ends_with_nocase: String + size: BigInt + size_not: BigInt + size_gt: BigInt + size_lt: BigInt + size_gte: BigInt + size_lte: BigInt + size_in: [BigInt!] + size_not_in: [BigInt!] + type: String + type_not: String + type_gt: String + type_lt: String + type_gte: String + type_lte: String + type_in: [String!] + type_not_in: [String!] + type_contains: String + type_contains_nocase: String + type_not_contains: String + type_not_contains_nocase: String + type_starts_with: String + type_starts_with_nocase: String + type_not_starts_with: String + type_not_starts_with_nocase: String + type_ends_with: String + type_ends_with_nocase: String + type_not_ends_with: String + type_not_ends_with_nocase: String + timestamp: String + timestamp_not: String + timestamp_gt: String + timestamp_lt: String + timestamp_gte: String + timestamp_lte: String + timestamp_in: [String!] + timestamp_not_in: [String!] + timestamp_contains: String + timestamp_contains_nocase: String + timestamp_not_contains: String + timestamp_not_contains_nocase: String + timestamp_starts_with: String + timestamp_starts_with_nocase: String + timestamp_not_starts_with: String + timestamp_not_starts_with_nocase: String + timestamp_ends_with: String + timestamp_ends_with_nocase: String + timestamp_not_ends_with: String + timestamp_not_ends_with_nocase: String + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [FileInfo_filter] + or: [FileInfo_filter] +} + +enum FileInfo_orderBy { + id + name + size + type + timestamp +} + +""" +8 bytes signed integer + +""" +scalar Int8 + +"""Defines the order direction, either ascending or descending""" +enum OrderDirection { + asc + desc +} + +type Query { + deedEntity( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): DeedEntity + deedEntities( + skip: Int = 0 + first: Int = 100 + orderBy: DeedEntity_orderBy + orderDirection: OrderDirection + where: DeedEntity_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [DeedEntity!]! + deedMetadata( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): DeedMetadata + deedMetadata_collection( + skip: Int = 0 + first: Int = 100 + orderBy: DeedMetadata_orderBy + orderDirection: OrderDirection + where: DeedMetadata_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [DeedMetadata!]! + transfer( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Transfer + transfers( + skip: Int = 0 + first: Int = 100 + orderBy: Transfer_orderBy + orderDirection: OrderDirection + where: Transfer_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Transfer!]! + approval( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Approval + approvals( + skip: Int = 0 + first: Int = 100 + orderBy: Approval_orderBy + orderDirection: OrderDirection + where: Approval_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Approval!]! + approvalForAll( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): ApprovalForAll + approvalForAlls( + skip: Int = 0 + first: Int = 100 + orderBy: ApprovalForAll_orderBy + orderDirection: OrderDirection + where: ApprovalForAll_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [ApprovalForAll!]! + fileInfo( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): FileInfo + fileInfos( + skip: Int = 0 + first: Int = 100 + orderBy: FileInfo_orderBy + orderDirection: OrderDirection + where: FileInfo_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [FileInfo!]! + """Access to subgraph metadata""" + _meta(block: Block_height): _Meta_ +} + +type Subscription { + deedEntity( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): DeedEntity + deedEntities( + skip: Int = 0 + first: Int = 100 + orderBy: DeedEntity_orderBy + orderDirection: OrderDirection + where: DeedEntity_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [DeedEntity!]! + deedMetadata( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): DeedMetadata + deedMetadata_collection( + skip: Int = 0 + first: Int = 100 + orderBy: DeedMetadata_orderBy + orderDirection: OrderDirection + where: DeedMetadata_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [DeedMetadata!]! + transfer( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Transfer + transfers( + skip: Int = 0 + first: Int = 100 + orderBy: Transfer_orderBy + orderDirection: OrderDirection + where: Transfer_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Transfer!]! + approval( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): Approval + approvals( + skip: Int = 0 + first: Int = 100 + orderBy: Approval_orderBy + orderDirection: OrderDirection + where: Approval_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [Approval!]! + approvalForAll( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): ApprovalForAll + approvalForAlls( + skip: Int = 0 + first: Int = 100 + orderBy: ApprovalForAll_orderBy + orderDirection: OrderDirection + where: ApprovalForAll_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [ApprovalForAll!]! + fileInfo( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): FileInfo + fileInfos( + skip: Int = 0 + first: Int = 100 + orderBy: FileInfo_orderBy + orderDirection: OrderDirection + where: FileInfo_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [FileInfo!]! + """Access to subgraph metadata""" + _meta(block: Block_height): _Meta_ +} + +type Transfer { + id: Bytes! + from: Bytes! + to: Bytes! + tokenId: BigInt! + blockNumber: BigInt! + blockTimestamp: BigInt! + transactionHash: Bytes! +} + +input Transfer_filter { + id: Bytes + id_not: Bytes + id_gt: Bytes + id_lt: Bytes + id_gte: Bytes + id_lte: Bytes + id_in: [Bytes!] + id_not_in: [Bytes!] + id_contains: Bytes + id_not_contains: Bytes + from: Bytes + from_not: Bytes + from_gt: Bytes + from_lt: Bytes + from_gte: Bytes + from_lte: Bytes + from_in: [Bytes!] + from_not_in: [Bytes!] + from_contains: Bytes + from_not_contains: Bytes + to: Bytes + to_not: Bytes + to_gt: Bytes + to_lt: Bytes + to_gte: Bytes + to_lte: Bytes + to_in: [Bytes!] + to_not_in: [Bytes!] + to_contains: Bytes + to_not_contains: Bytes + tokenId: BigInt + tokenId_not: BigInt + tokenId_gt: BigInt + tokenId_lt: BigInt + tokenId_gte: BigInt + tokenId_lte: BigInt + tokenId_in: [BigInt!] + tokenId_not_in: [BigInt!] + blockNumber: BigInt + blockNumber_not: BigInt + blockNumber_gt: BigInt + blockNumber_lt: BigInt + blockNumber_gte: BigInt + blockNumber_lte: BigInt + blockNumber_in: [BigInt!] + blockNumber_not_in: [BigInt!] + blockTimestamp: BigInt + blockTimestamp_not: BigInt + blockTimestamp_gt: BigInt + blockTimestamp_lt: BigInt + blockTimestamp_gte: BigInt + blockTimestamp_lte: BigInt + blockTimestamp_in: [BigInt!] + blockTimestamp_not_in: [BigInt!] + transactionHash: Bytes + transactionHash_not: Bytes + transactionHash_gt: Bytes + transactionHash_lt: Bytes + transactionHash_gte: Bytes + transactionHash_lte: Bytes + transactionHash_in: [Bytes!] + transactionHash_not_in: [Bytes!] + transactionHash_contains: Bytes + transactionHash_not_contains: Bytes + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [Transfer_filter] + or: [Transfer_filter] +} + +enum Transfer_orderBy { + id + from + to + tokenId + blockNumber + blockTimestamp + transactionHash +} + +type _Block_ { + """The hash of the block""" + hash: Bytes + """The block number""" + number: Int! + """Integer representation of the timestamp stored in blocks for the chain""" + timestamp: Int +} + +"""The type for the top-level _meta field""" +type _Meta_ { + """ + Information about a specific subgraph block. The hash of the block + will be null if the _meta field has a block constraint that asks for + a block number. It will be filled if the _meta field has no block constraint + and therefore asks for the latest block + + """ + block: _Block_! + """The deployment ID""" + deployment: String! + """If `true`, the subgraph encountered indexing errors at some past block""" + hasIndexingErrors: Boolean! +} + +enum _SubgraphErrorPolicy_ { + """Data will be returned even if the subgraph has indexing errors""" + allow + """ + If the subgraph has indexing errors, data will be omitted. The default. + """ + deny +} \ No newline at end of file diff --git a/packages/nextjs/.graphclient/sources/Deed3-Sepolia/types.ts b/packages/nextjs/.graphclient/sources/Deed3-Sepolia/types.ts new file mode 100644 index 00000000..c1936af6 --- /dev/null +++ b/packages/nextjs/.graphclient/sources/Deed3-Sepolia/types.ts @@ -0,0 +1,1463 @@ +// @ts-nocheck + +import { InContextSdkMethod } from '@graphql-mesh/types'; +import { MeshContext } from '@graphql-mesh/runtime'; + +export namespace Deed3SepoliaTypes { + export type Maybe = T | null; +export type InputMaybe = Maybe; +export type Exact = { [K in keyof T]: T[K] }; +export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; +export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: string; + String: string; + Boolean: boolean; + Int: number; + Float: number; + BigDecimal: any; + BigInt: any; + Bytes: any; + Int8: any; +}; + +export type Aggregation_interval = + | 'hour' + | 'day'; + +export type Approval = { + id: Scalars['Bytes']; + owner: Scalars['Bytes']; + approved: Scalars['Bytes']; + tokenId: Scalars['BigInt']; + blockNumber: Scalars['BigInt']; + blockTimestamp: Scalars['BigInt']; + transactionHash: Scalars['Bytes']; +}; + +export type ApprovalForAll = { + id: Scalars['Bytes']; + owner: Scalars['Bytes']; + operator: Scalars['Bytes']; + approved: Scalars['Boolean']; + blockNumber: Scalars['BigInt']; + blockTimestamp: Scalars['BigInt']; + transactionHash: Scalars['Bytes']; +}; + +export type ApprovalForAll_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + id_contains?: InputMaybe; + id_not_contains?: InputMaybe; + owner?: InputMaybe; + owner_not?: InputMaybe; + owner_gt?: InputMaybe; + owner_lt?: InputMaybe; + owner_gte?: InputMaybe; + owner_lte?: InputMaybe; + owner_in?: InputMaybe>; + owner_not_in?: InputMaybe>; + owner_contains?: InputMaybe; + owner_not_contains?: InputMaybe; + operator?: InputMaybe; + operator_not?: InputMaybe; + operator_gt?: InputMaybe; + operator_lt?: InputMaybe; + operator_gte?: InputMaybe; + operator_lte?: InputMaybe; + operator_in?: InputMaybe>; + operator_not_in?: InputMaybe>; + operator_contains?: InputMaybe; + operator_not_contains?: InputMaybe; + approved?: InputMaybe; + approved_not?: InputMaybe; + approved_in?: InputMaybe>; + approved_not_in?: InputMaybe>; + blockNumber?: InputMaybe; + blockNumber_not?: InputMaybe; + blockNumber_gt?: InputMaybe; + blockNumber_lt?: InputMaybe; + blockNumber_gte?: InputMaybe; + blockNumber_lte?: InputMaybe; + blockNumber_in?: InputMaybe>; + blockNumber_not_in?: InputMaybe>; + blockTimestamp?: InputMaybe; + blockTimestamp_not?: InputMaybe; + blockTimestamp_gt?: InputMaybe; + blockTimestamp_lt?: InputMaybe; + blockTimestamp_gte?: InputMaybe; + blockTimestamp_lte?: InputMaybe; + blockTimestamp_in?: InputMaybe>; + blockTimestamp_not_in?: InputMaybe>; + transactionHash?: InputMaybe; + transactionHash_not?: InputMaybe; + transactionHash_gt?: InputMaybe; + transactionHash_lt?: InputMaybe; + transactionHash_gte?: InputMaybe; + transactionHash_lte?: InputMaybe; + transactionHash_in?: InputMaybe>; + transactionHash_not_in?: InputMaybe>; + transactionHash_contains?: InputMaybe; + transactionHash_not_contains?: InputMaybe; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type ApprovalForAll_orderBy = + | 'id' + | 'owner' + | 'operator' + | 'approved' + | 'blockNumber' + | 'blockTimestamp' + | 'transactionHash'; + +export type Approval_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + id_contains?: InputMaybe; + id_not_contains?: InputMaybe; + owner?: InputMaybe; + owner_not?: InputMaybe; + owner_gt?: InputMaybe; + owner_lt?: InputMaybe; + owner_gte?: InputMaybe; + owner_lte?: InputMaybe; + owner_in?: InputMaybe>; + owner_not_in?: InputMaybe>; + owner_contains?: InputMaybe; + owner_not_contains?: InputMaybe; + approved?: InputMaybe; + approved_not?: InputMaybe; + approved_gt?: InputMaybe; + approved_lt?: InputMaybe; + approved_gte?: InputMaybe; + approved_lte?: InputMaybe; + approved_in?: InputMaybe>; + approved_not_in?: InputMaybe>; + approved_contains?: InputMaybe; + approved_not_contains?: InputMaybe; + tokenId?: InputMaybe; + tokenId_not?: InputMaybe; + tokenId_gt?: InputMaybe; + tokenId_lt?: InputMaybe; + tokenId_gte?: InputMaybe; + tokenId_lte?: InputMaybe; + tokenId_in?: InputMaybe>; + tokenId_not_in?: InputMaybe>; + blockNumber?: InputMaybe; + blockNumber_not?: InputMaybe; + blockNumber_gt?: InputMaybe; + blockNumber_lt?: InputMaybe; + blockNumber_gte?: InputMaybe; + blockNumber_lte?: InputMaybe; + blockNumber_in?: InputMaybe>; + blockNumber_not_in?: InputMaybe>; + blockTimestamp?: InputMaybe; + blockTimestamp_not?: InputMaybe; + blockTimestamp_gt?: InputMaybe; + blockTimestamp_lt?: InputMaybe; + blockTimestamp_gte?: InputMaybe; + blockTimestamp_lte?: InputMaybe; + blockTimestamp_in?: InputMaybe>; + blockTimestamp_not_in?: InputMaybe>; + transactionHash?: InputMaybe; + transactionHash_not?: InputMaybe; + transactionHash_gt?: InputMaybe; + transactionHash_lt?: InputMaybe; + transactionHash_gte?: InputMaybe; + transactionHash_lte?: InputMaybe; + transactionHash_in?: InputMaybe>; + transactionHash_not_in?: InputMaybe>; + transactionHash_contains?: InputMaybe; + transactionHash_not_contains?: InputMaybe; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type Approval_orderBy = + | 'id' + | 'owner' + | 'approved' + | 'tokenId' + | 'blockNumber' + | 'blockTimestamp' + | 'transactionHash'; + +export type BlockChangedFilter = { + number_gte: Scalars['Int']; +}; + +export type Block_height = { + hash?: InputMaybe; + number?: InputMaybe; + number_gte?: InputMaybe; +}; + +export type DeedEntity = { + id: Scalars['ID']; + deedId: Scalars['BigInt']; + owner: Scalars['Bytes']; + assetType: Scalars['Int']; + isValidated: Scalars['Boolean']; + minter: Scalars['Bytes']; + uri: Scalars['String']; + blockNumber: Scalars['BigInt']; + blockTimestamp: Scalars['BigInt']; + transactionHash: Scalars['Bytes']; + deedMetadata: DeedMetadata; +}; + +export type DeedEntity_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + deedId?: InputMaybe; + deedId_not?: InputMaybe; + deedId_gt?: InputMaybe; + deedId_lt?: InputMaybe; + deedId_gte?: InputMaybe; + deedId_lte?: InputMaybe; + deedId_in?: InputMaybe>; + deedId_not_in?: InputMaybe>; + owner?: InputMaybe; + owner_not?: InputMaybe; + owner_gt?: InputMaybe; + owner_lt?: InputMaybe; + owner_gte?: InputMaybe; + owner_lte?: InputMaybe; + owner_in?: InputMaybe>; + owner_not_in?: InputMaybe>; + owner_contains?: InputMaybe; + owner_not_contains?: InputMaybe; + assetType?: InputMaybe; + assetType_not?: InputMaybe; + assetType_gt?: InputMaybe; + assetType_lt?: InputMaybe; + assetType_gte?: InputMaybe; + assetType_lte?: InputMaybe; + assetType_in?: InputMaybe>; + assetType_not_in?: InputMaybe>; + isValidated?: InputMaybe; + isValidated_not?: InputMaybe; + isValidated_in?: InputMaybe>; + isValidated_not_in?: InputMaybe>; + minter?: InputMaybe; + minter_not?: InputMaybe; + minter_gt?: InputMaybe; + minter_lt?: InputMaybe; + minter_gte?: InputMaybe; + minter_lte?: InputMaybe; + minter_in?: InputMaybe>; + minter_not_in?: InputMaybe>; + minter_contains?: InputMaybe; + minter_not_contains?: InputMaybe; + uri?: InputMaybe; + uri_not?: InputMaybe; + uri_gt?: InputMaybe; + uri_lt?: InputMaybe; + uri_gte?: InputMaybe; + uri_lte?: InputMaybe; + uri_in?: InputMaybe>; + uri_not_in?: InputMaybe>; + uri_contains?: InputMaybe; + uri_contains_nocase?: InputMaybe; + uri_not_contains?: InputMaybe; + uri_not_contains_nocase?: InputMaybe; + uri_starts_with?: InputMaybe; + uri_starts_with_nocase?: InputMaybe; + uri_not_starts_with?: InputMaybe; + uri_not_starts_with_nocase?: InputMaybe; + uri_ends_with?: InputMaybe; + uri_ends_with_nocase?: InputMaybe; + uri_not_ends_with?: InputMaybe; + uri_not_ends_with_nocase?: InputMaybe; + blockNumber?: InputMaybe; + blockNumber_not?: InputMaybe; + blockNumber_gt?: InputMaybe; + blockNumber_lt?: InputMaybe; + blockNumber_gte?: InputMaybe; + blockNumber_lte?: InputMaybe; + blockNumber_in?: InputMaybe>; + blockNumber_not_in?: InputMaybe>; + blockTimestamp?: InputMaybe; + blockTimestamp_not?: InputMaybe; + blockTimestamp_gt?: InputMaybe; + blockTimestamp_lt?: InputMaybe; + blockTimestamp_gte?: InputMaybe; + blockTimestamp_lte?: InputMaybe; + blockTimestamp_in?: InputMaybe>; + blockTimestamp_not_in?: InputMaybe>; + transactionHash?: InputMaybe; + transactionHash_not?: InputMaybe; + transactionHash_gt?: InputMaybe; + transactionHash_lt?: InputMaybe; + transactionHash_gte?: InputMaybe; + transactionHash_lte?: InputMaybe; + transactionHash_in?: InputMaybe>; + transactionHash_not_in?: InputMaybe>; + transactionHash_contains?: InputMaybe; + transactionHash_not_contains?: InputMaybe; + deedMetadata?: InputMaybe; + deedMetadata_not?: InputMaybe; + deedMetadata_gt?: InputMaybe; + deedMetadata_lt?: InputMaybe; + deedMetadata_gte?: InputMaybe; + deedMetadata_lte?: InputMaybe; + deedMetadata_in?: InputMaybe>; + deedMetadata_not_in?: InputMaybe>; + deedMetadata_contains?: InputMaybe; + deedMetadata_contains_nocase?: InputMaybe; + deedMetadata_not_contains?: InputMaybe; + deedMetadata_not_contains_nocase?: InputMaybe; + deedMetadata_starts_with?: InputMaybe; + deedMetadata_starts_with_nocase?: InputMaybe; + deedMetadata_not_starts_with?: InputMaybe; + deedMetadata_not_starts_with_nocase?: InputMaybe; + deedMetadata_ends_with?: InputMaybe; + deedMetadata_ends_with_nocase?: InputMaybe; + deedMetadata_not_ends_with?: InputMaybe; + deedMetadata_not_ends_with_nocase?: InputMaybe; + deedMetadata_?: InputMaybe; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type DeedEntity_orderBy = + | 'id' + | 'deedId' + | 'owner' + | 'assetType' + | 'isValidated' + | 'minter' + | 'uri' + | 'blockNumber' + | 'blockTimestamp' + | 'transactionHash' + | 'deedMetadata' + | 'deedMetadata__id' + | 'deedMetadata__ownerInformation_type' + | 'deedMetadata__ownerInformation_name' + | 'deedMetadata__ownerInformation_position' + | 'deedMetadata__ownerInformation_entityName' + | 'deedMetadata__ownerInformation_entityType' + | 'deedMetadata__propertyDetails_type' + | 'deedMetadata__propertyDetails_address' + | 'deedMetadata__propertyDetails_city' + | 'deedMetadata__propertyDetails_state' + | 'deedMetadata__propertyDetails_size' + | 'deedMetadata__propertyDetails_subType' + | 'deedMetadata__propertyDetails_zoning' + | 'deedMetadata__otherInformation_blockchain' + | 'deedMetadata__otherInformation_wrapper'; + +export type DeedMetadata = { + id: Scalars['ID']; + ownerInformation_type: Scalars['String']; + ownerInformation_name: Scalars['String']; + ownerInformation_position?: Maybe; + ownerInformation_entityName?: Maybe; + ownerInformation_entityType?: Maybe; + ownerInformation_ids: FileInfo; + ownerInformation_operatingAgreement?: Maybe; + ownerInformation_articleIncorporation: FileInfo; + ownerInformation_proofBill?: Maybe; + ownerInformation_supportingDoc?: Maybe>; + propertyDetails_type: Scalars['String']; + propertyDetails_address: Scalars['String']; + propertyDetails_city: Scalars['String']; + propertyDetails_state: Scalars['String']; + propertyDetails_size?: Maybe; + propertyDetails_subType?: Maybe; + propertyDetails_zoning?: Maybe; + propertyDetails_purchaseContract?: Maybe; + propertyDetails_deedOrTitle: FileInfo; + propertyDetails_images?: Maybe>; + otherInformation_blockchain: Scalars['String']; + otherInformation_wrapper: Scalars['String']; +}; + + +export type DeedMetadataownerInformation_supportingDocArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; +}; + + +export type DeedMetadatapropertyDetails_imagesArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; +}; + +export type DeedMetadata_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + ownerInformation_type?: InputMaybe; + ownerInformation_type_not?: InputMaybe; + ownerInformation_type_gt?: InputMaybe; + ownerInformation_type_lt?: InputMaybe; + ownerInformation_type_gte?: InputMaybe; + ownerInformation_type_lte?: InputMaybe; + ownerInformation_type_in?: InputMaybe>; + ownerInformation_type_not_in?: InputMaybe>; + ownerInformation_type_contains?: InputMaybe; + ownerInformation_type_contains_nocase?: InputMaybe; + ownerInformation_type_not_contains?: InputMaybe; + ownerInformation_type_not_contains_nocase?: InputMaybe; + ownerInformation_type_starts_with?: InputMaybe; + ownerInformation_type_starts_with_nocase?: InputMaybe; + ownerInformation_type_not_starts_with?: InputMaybe; + ownerInformation_type_not_starts_with_nocase?: InputMaybe; + ownerInformation_type_ends_with?: InputMaybe; + ownerInformation_type_ends_with_nocase?: InputMaybe; + ownerInformation_type_not_ends_with?: InputMaybe; + ownerInformation_type_not_ends_with_nocase?: InputMaybe; + ownerInformation_name?: InputMaybe; + ownerInformation_name_not?: InputMaybe; + ownerInformation_name_gt?: InputMaybe; + ownerInformation_name_lt?: InputMaybe; + ownerInformation_name_gte?: InputMaybe; + ownerInformation_name_lte?: InputMaybe; + ownerInformation_name_in?: InputMaybe>; + ownerInformation_name_not_in?: InputMaybe>; + ownerInformation_name_contains?: InputMaybe; + ownerInformation_name_contains_nocase?: InputMaybe; + ownerInformation_name_not_contains?: InputMaybe; + ownerInformation_name_not_contains_nocase?: InputMaybe; + ownerInformation_name_starts_with?: InputMaybe; + ownerInformation_name_starts_with_nocase?: InputMaybe; + ownerInformation_name_not_starts_with?: InputMaybe; + ownerInformation_name_not_starts_with_nocase?: InputMaybe; + ownerInformation_name_ends_with?: InputMaybe; + ownerInformation_name_ends_with_nocase?: InputMaybe; + ownerInformation_name_not_ends_with?: InputMaybe; + ownerInformation_name_not_ends_with_nocase?: InputMaybe; + ownerInformation_position?: InputMaybe; + ownerInformation_position_not?: InputMaybe; + ownerInformation_position_gt?: InputMaybe; + ownerInformation_position_lt?: InputMaybe; + ownerInformation_position_gte?: InputMaybe; + ownerInformation_position_lte?: InputMaybe; + ownerInformation_position_in?: InputMaybe>; + ownerInformation_position_not_in?: InputMaybe>; + ownerInformation_position_contains?: InputMaybe; + ownerInformation_position_contains_nocase?: InputMaybe; + ownerInformation_position_not_contains?: InputMaybe; + ownerInformation_position_not_contains_nocase?: InputMaybe; + ownerInformation_position_starts_with?: InputMaybe; + ownerInformation_position_starts_with_nocase?: InputMaybe; + ownerInformation_position_not_starts_with?: InputMaybe; + ownerInformation_position_not_starts_with_nocase?: InputMaybe; + ownerInformation_position_ends_with?: InputMaybe; + ownerInformation_position_ends_with_nocase?: InputMaybe; + ownerInformation_position_not_ends_with?: InputMaybe; + ownerInformation_position_not_ends_with_nocase?: InputMaybe; + ownerInformation_entityName?: InputMaybe; + ownerInformation_entityName_not?: InputMaybe; + ownerInformation_entityName_gt?: InputMaybe; + ownerInformation_entityName_lt?: InputMaybe; + ownerInformation_entityName_gte?: InputMaybe; + ownerInformation_entityName_lte?: InputMaybe; + ownerInformation_entityName_in?: InputMaybe>; + ownerInformation_entityName_not_in?: InputMaybe>; + ownerInformation_entityName_contains?: InputMaybe; + ownerInformation_entityName_contains_nocase?: InputMaybe; + ownerInformation_entityName_not_contains?: InputMaybe; + ownerInformation_entityName_not_contains_nocase?: InputMaybe; + ownerInformation_entityName_starts_with?: InputMaybe; + ownerInformation_entityName_starts_with_nocase?: InputMaybe; + ownerInformation_entityName_not_starts_with?: InputMaybe; + ownerInformation_entityName_not_starts_with_nocase?: InputMaybe; + ownerInformation_entityName_ends_with?: InputMaybe; + ownerInformation_entityName_ends_with_nocase?: InputMaybe; + ownerInformation_entityName_not_ends_with?: InputMaybe; + ownerInformation_entityName_not_ends_with_nocase?: InputMaybe; + ownerInformation_entityType?: InputMaybe; + ownerInformation_entityType_not?: InputMaybe; + ownerInformation_entityType_gt?: InputMaybe; + ownerInformation_entityType_lt?: InputMaybe; + ownerInformation_entityType_gte?: InputMaybe; + ownerInformation_entityType_lte?: InputMaybe; + ownerInformation_entityType_in?: InputMaybe>; + ownerInformation_entityType_not_in?: InputMaybe>; + ownerInformation_entityType_contains?: InputMaybe; + ownerInformation_entityType_contains_nocase?: InputMaybe; + ownerInformation_entityType_not_contains?: InputMaybe; + ownerInformation_entityType_not_contains_nocase?: InputMaybe; + ownerInformation_entityType_starts_with?: InputMaybe; + ownerInformation_entityType_starts_with_nocase?: InputMaybe; + ownerInformation_entityType_not_starts_with?: InputMaybe; + ownerInformation_entityType_not_starts_with_nocase?: InputMaybe; + ownerInformation_entityType_ends_with?: InputMaybe; + ownerInformation_entityType_ends_with_nocase?: InputMaybe; + ownerInformation_entityType_not_ends_with?: InputMaybe; + ownerInformation_entityType_not_ends_with_nocase?: InputMaybe; + ownerInformation_ids?: InputMaybe; + ownerInformation_ids_not?: InputMaybe; + ownerInformation_ids_gt?: InputMaybe; + ownerInformation_ids_lt?: InputMaybe; + ownerInformation_ids_gte?: InputMaybe; + ownerInformation_ids_lte?: InputMaybe; + ownerInformation_ids_in?: InputMaybe>; + ownerInformation_ids_not_in?: InputMaybe>; + ownerInformation_ids_contains?: InputMaybe; + ownerInformation_ids_contains_nocase?: InputMaybe; + ownerInformation_ids_not_contains?: InputMaybe; + ownerInformation_ids_not_contains_nocase?: InputMaybe; + ownerInformation_ids_starts_with?: InputMaybe; + ownerInformation_ids_starts_with_nocase?: InputMaybe; + ownerInformation_ids_not_starts_with?: InputMaybe; + ownerInformation_ids_not_starts_with_nocase?: InputMaybe; + ownerInformation_ids_ends_with?: InputMaybe; + ownerInformation_ids_ends_with_nocase?: InputMaybe; + ownerInformation_ids_not_ends_with?: InputMaybe; + ownerInformation_ids_not_ends_with_nocase?: InputMaybe; + ownerInformation_ids_?: InputMaybe; + ownerInformation_operatingAgreement?: InputMaybe; + ownerInformation_operatingAgreement_not?: InputMaybe; + ownerInformation_operatingAgreement_gt?: InputMaybe; + ownerInformation_operatingAgreement_lt?: InputMaybe; + ownerInformation_operatingAgreement_gte?: InputMaybe; + ownerInformation_operatingAgreement_lte?: InputMaybe; + ownerInformation_operatingAgreement_in?: InputMaybe>; + ownerInformation_operatingAgreement_not_in?: InputMaybe>; + ownerInformation_operatingAgreement_contains?: InputMaybe; + ownerInformation_operatingAgreement_contains_nocase?: InputMaybe; + ownerInformation_operatingAgreement_not_contains?: InputMaybe; + ownerInformation_operatingAgreement_not_contains_nocase?: InputMaybe; + ownerInformation_operatingAgreement_starts_with?: InputMaybe; + ownerInformation_operatingAgreement_starts_with_nocase?: InputMaybe; + ownerInformation_operatingAgreement_not_starts_with?: InputMaybe; + ownerInformation_operatingAgreement_not_starts_with_nocase?: InputMaybe; + ownerInformation_operatingAgreement_ends_with?: InputMaybe; + ownerInformation_operatingAgreement_ends_with_nocase?: InputMaybe; + ownerInformation_operatingAgreement_not_ends_with?: InputMaybe; + ownerInformation_operatingAgreement_not_ends_with_nocase?: InputMaybe; + ownerInformation_operatingAgreement_?: InputMaybe; + ownerInformation_articleIncorporation?: InputMaybe; + ownerInformation_articleIncorporation_not?: InputMaybe; + ownerInformation_articleIncorporation_gt?: InputMaybe; + ownerInformation_articleIncorporation_lt?: InputMaybe; + ownerInformation_articleIncorporation_gte?: InputMaybe; + ownerInformation_articleIncorporation_lte?: InputMaybe; + ownerInformation_articleIncorporation_in?: InputMaybe>; + ownerInformation_articleIncorporation_not_in?: InputMaybe>; + ownerInformation_articleIncorporation_contains?: InputMaybe; + ownerInformation_articleIncorporation_contains_nocase?: InputMaybe; + ownerInformation_articleIncorporation_not_contains?: InputMaybe; + ownerInformation_articleIncorporation_not_contains_nocase?: InputMaybe; + ownerInformation_articleIncorporation_starts_with?: InputMaybe; + ownerInformation_articleIncorporation_starts_with_nocase?: InputMaybe; + ownerInformation_articleIncorporation_not_starts_with?: InputMaybe; + ownerInformation_articleIncorporation_not_starts_with_nocase?: InputMaybe; + ownerInformation_articleIncorporation_ends_with?: InputMaybe; + ownerInformation_articleIncorporation_ends_with_nocase?: InputMaybe; + ownerInformation_articleIncorporation_not_ends_with?: InputMaybe; + ownerInformation_articleIncorporation_not_ends_with_nocase?: InputMaybe; + ownerInformation_articleIncorporation_?: InputMaybe; + ownerInformation_proofBill?: InputMaybe; + ownerInformation_proofBill_not?: InputMaybe; + ownerInformation_proofBill_gt?: InputMaybe; + ownerInformation_proofBill_lt?: InputMaybe; + ownerInformation_proofBill_gte?: InputMaybe; + ownerInformation_proofBill_lte?: InputMaybe; + ownerInformation_proofBill_in?: InputMaybe>; + ownerInformation_proofBill_not_in?: InputMaybe>; + ownerInformation_proofBill_contains?: InputMaybe; + ownerInformation_proofBill_contains_nocase?: InputMaybe; + ownerInformation_proofBill_not_contains?: InputMaybe; + ownerInformation_proofBill_not_contains_nocase?: InputMaybe; + ownerInformation_proofBill_starts_with?: InputMaybe; + ownerInformation_proofBill_starts_with_nocase?: InputMaybe; + ownerInformation_proofBill_not_starts_with?: InputMaybe; + ownerInformation_proofBill_not_starts_with_nocase?: InputMaybe; + ownerInformation_proofBill_ends_with?: InputMaybe; + ownerInformation_proofBill_ends_with_nocase?: InputMaybe; + ownerInformation_proofBill_not_ends_with?: InputMaybe; + ownerInformation_proofBill_not_ends_with_nocase?: InputMaybe; + ownerInformation_proofBill_?: InputMaybe; + ownerInformation_supportingDoc?: InputMaybe>; + ownerInformation_supportingDoc_not?: InputMaybe>; + ownerInformation_supportingDoc_contains?: InputMaybe>; + ownerInformation_supportingDoc_contains_nocase?: InputMaybe>; + ownerInformation_supportingDoc_not_contains?: InputMaybe>; + ownerInformation_supportingDoc_not_contains_nocase?: InputMaybe>; + ownerInformation_supportingDoc_?: InputMaybe; + propertyDetails_type?: InputMaybe; + propertyDetails_type_not?: InputMaybe; + propertyDetails_type_gt?: InputMaybe; + propertyDetails_type_lt?: InputMaybe; + propertyDetails_type_gte?: InputMaybe; + propertyDetails_type_lte?: InputMaybe; + propertyDetails_type_in?: InputMaybe>; + propertyDetails_type_not_in?: InputMaybe>; + propertyDetails_type_contains?: InputMaybe; + propertyDetails_type_contains_nocase?: InputMaybe; + propertyDetails_type_not_contains?: InputMaybe; + propertyDetails_type_not_contains_nocase?: InputMaybe; + propertyDetails_type_starts_with?: InputMaybe; + propertyDetails_type_starts_with_nocase?: InputMaybe; + propertyDetails_type_not_starts_with?: InputMaybe; + propertyDetails_type_not_starts_with_nocase?: InputMaybe; + propertyDetails_type_ends_with?: InputMaybe; + propertyDetails_type_ends_with_nocase?: InputMaybe; + propertyDetails_type_not_ends_with?: InputMaybe; + propertyDetails_type_not_ends_with_nocase?: InputMaybe; + propertyDetails_address?: InputMaybe; + propertyDetails_address_not?: InputMaybe; + propertyDetails_address_gt?: InputMaybe; + propertyDetails_address_lt?: InputMaybe; + propertyDetails_address_gte?: InputMaybe; + propertyDetails_address_lte?: InputMaybe; + propertyDetails_address_in?: InputMaybe>; + propertyDetails_address_not_in?: InputMaybe>; + propertyDetails_address_contains?: InputMaybe; + propertyDetails_address_contains_nocase?: InputMaybe; + propertyDetails_address_not_contains?: InputMaybe; + propertyDetails_address_not_contains_nocase?: InputMaybe; + propertyDetails_address_starts_with?: InputMaybe; + propertyDetails_address_starts_with_nocase?: InputMaybe; + propertyDetails_address_not_starts_with?: InputMaybe; + propertyDetails_address_not_starts_with_nocase?: InputMaybe; + propertyDetails_address_ends_with?: InputMaybe; + propertyDetails_address_ends_with_nocase?: InputMaybe; + propertyDetails_address_not_ends_with?: InputMaybe; + propertyDetails_address_not_ends_with_nocase?: InputMaybe; + propertyDetails_city?: InputMaybe; + propertyDetails_city_not?: InputMaybe; + propertyDetails_city_gt?: InputMaybe; + propertyDetails_city_lt?: InputMaybe; + propertyDetails_city_gte?: InputMaybe; + propertyDetails_city_lte?: InputMaybe; + propertyDetails_city_in?: InputMaybe>; + propertyDetails_city_not_in?: InputMaybe>; + propertyDetails_city_contains?: InputMaybe; + propertyDetails_city_contains_nocase?: InputMaybe; + propertyDetails_city_not_contains?: InputMaybe; + propertyDetails_city_not_contains_nocase?: InputMaybe; + propertyDetails_city_starts_with?: InputMaybe; + propertyDetails_city_starts_with_nocase?: InputMaybe; + propertyDetails_city_not_starts_with?: InputMaybe; + propertyDetails_city_not_starts_with_nocase?: InputMaybe; + propertyDetails_city_ends_with?: InputMaybe; + propertyDetails_city_ends_with_nocase?: InputMaybe; + propertyDetails_city_not_ends_with?: InputMaybe; + propertyDetails_city_not_ends_with_nocase?: InputMaybe; + propertyDetails_state?: InputMaybe; + propertyDetails_state_not?: InputMaybe; + propertyDetails_state_gt?: InputMaybe; + propertyDetails_state_lt?: InputMaybe; + propertyDetails_state_gte?: InputMaybe; + propertyDetails_state_lte?: InputMaybe; + propertyDetails_state_in?: InputMaybe>; + propertyDetails_state_not_in?: InputMaybe>; + propertyDetails_state_contains?: InputMaybe; + propertyDetails_state_contains_nocase?: InputMaybe; + propertyDetails_state_not_contains?: InputMaybe; + propertyDetails_state_not_contains_nocase?: InputMaybe; + propertyDetails_state_starts_with?: InputMaybe; + propertyDetails_state_starts_with_nocase?: InputMaybe; + propertyDetails_state_not_starts_with?: InputMaybe; + propertyDetails_state_not_starts_with_nocase?: InputMaybe; + propertyDetails_state_ends_with?: InputMaybe; + propertyDetails_state_ends_with_nocase?: InputMaybe; + propertyDetails_state_not_ends_with?: InputMaybe; + propertyDetails_state_not_ends_with_nocase?: InputMaybe; + propertyDetails_size?: InputMaybe; + propertyDetails_size_not?: InputMaybe; + propertyDetails_size_gt?: InputMaybe; + propertyDetails_size_lt?: InputMaybe; + propertyDetails_size_gte?: InputMaybe; + propertyDetails_size_lte?: InputMaybe; + propertyDetails_size_in?: InputMaybe>; + propertyDetails_size_not_in?: InputMaybe>; + propertyDetails_size_contains?: InputMaybe; + propertyDetails_size_contains_nocase?: InputMaybe; + propertyDetails_size_not_contains?: InputMaybe; + propertyDetails_size_not_contains_nocase?: InputMaybe; + propertyDetails_size_starts_with?: InputMaybe; + propertyDetails_size_starts_with_nocase?: InputMaybe; + propertyDetails_size_not_starts_with?: InputMaybe; + propertyDetails_size_not_starts_with_nocase?: InputMaybe; + propertyDetails_size_ends_with?: InputMaybe; + propertyDetails_size_ends_with_nocase?: InputMaybe; + propertyDetails_size_not_ends_with?: InputMaybe; + propertyDetails_size_not_ends_with_nocase?: InputMaybe; + propertyDetails_subType?: InputMaybe; + propertyDetails_subType_not?: InputMaybe; + propertyDetails_subType_gt?: InputMaybe; + propertyDetails_subType_lt?: InputMaybe; + propertyDetails_subType_gte?: InputMaybe; + propertyDetails_subType_lte?: InputMaybe; + propertyDetails_subType_in?: InputMaybe>; + propertyDetails_subType_not_in?: InputMaybe>; + propertyDetails_subType_contains?: InputMaybe; + propertyDetails_subType_contains_nocase?: InputMaybe; + propertyDetails_subType_not_contains?: InputMaybe; + propertyDetails_subType_not_contains_nocase?: InputMaybe; + propertyDetails_subType_starts_with?: InputMaybe; + propertyDetails_subType_starts_with_nocase?: InputMaybe; + propertyDetails_subType_not_starts_with?: InputMaybe; + propertyDetails_subType_not_starts_with_nocase?: InputMaybe; + propertyDetails_subType_ends_with?: InputMaybe; + propertyDetails_subType_ends_with_nocase?: InputMaybe; + propertyDetails_subType_not_ends_with?: InputMaybe; + propertyDetails_subType_not_ends_with_nocase?: InputMaybe; + propertyDetails_zoning?: InputMaybe; + propertyDetails_zoning_not?: InputMaybe; + propertyDetails_zoning_gt?: InputMaybe; + propertyDetails_zoning_lt?: InputMaybe; + propertyDetails_zoning_gte?: InputMaybe; + propertyDetails_zoning_lte?: InputMaybe; + propertyDetails_zoning_in?: InputMaybe>; + propertyDetails_zoning_not_in?: InputMaybe>; + propertyDetails_zoning_contains?: InputMaybe; + propertyDetails_zoning_contains_nocase?: InputMaybe; + propertyDetails_zoning_not_contains?: InputMaybe; + propertyDetails_zoning_not_contains_nocase?: InputMaybe; + propertyDetails_zoning_starts_with?: InputMaybe; + propertyDetails_zoning_starts_with_nocase?: InputMaybe; + propertyDetails_zoning_not_starts_with?: InputMaybe; + propertyDetails_zoning_not_starts_with_nocase?: InputMaybe; + propertyDetails_zoning_ends_with?: InputMaybe; + propertyDetails_zoning_ends_with_nocase?: InputMaybe; + propertyDetails_zoning_not_ends_with?: InputMaybe; + propertyDetails_zoning_not_ends_with_nocase?: InputMaybe; + propertyDetails_purchaseContract?: InputMaybe; + propertyDetails_purchaseContract_not?: InputMaybe; + propertyDetails_purchaseContract_gt?: InputMaybe; + propertyDetails_purchaseContract_lt?: InputMaybe; + propertyDetails_purchaseContract_gte?: InputMaybe; + propertyDetails_purchaseContract_lte?: InputMaybe; + propertyDetails_purchaseContract_in?: InputMaybe>; + propertyDetails_purchaseContract_not_in?: InputMaybe>; + propertyDetails_purchaseContract_contains?: InputMaybe; + propertyDetails_purchaseContract_contains_nocase?: InputMaybe; + propertyDetails_purchaseContract_not_contains?: InputMaybe; + propertyDetails_purchaseContract_not_contains_nocase?: InputMaybe; + propertyDetails_purchaseContract_starts_with?: InputMaybe; + propertyDetails_purchaseContract_starts_with_nocase?: InputMaybe; + propertyDetails_purchaseContract_not_starts_with?: InputMaybe; + propertyDetails_purchaseContract_not_starts_with_nocase?: InputMaybe; + propertyDetails_purchaseContract_ends_with?: InputMaybe; + propertyDetails_purchaseContract_ends_with_nocase?: InputMaybe; + propertyDetails_purchaseContract_not_ends_with?: InputMaybe; + propertyDetails_purchaseContract_not_ends_with_nocase?: InputMaybe; + propertyDetails_purchaseContract_?: InputMaybe; + propertyDetails_deedOrTitle?: InputMaybe; + propertyDetails_deedOrTitle_not?: InputMaybe; + propertyDetails_deedOrTitle_gt?: InputMaybe; + propertyDetails_deedOrTitle_lt?: InputMaybe; + propertyDetails_deedOrTitle_gte?: InputMaybe; + propertyDetails_deedOrTitle_lte?: InputMaybe; + propertyDetails_deedOrTitle_in?: InputMaybe>; + propertyDetails_deedOrTitle_not_in?: InputMaybe>; + propertyDetails_deedOrTitle_contains?: InputMaybe; + propertyDetails_deedOrTitle_contains_nocase?: InputMaybe; + propertyDetails_deedOrTitle_not_contains?: InputMaybe; + propertyDetails_deedOrTitle_not_contains_nocase?: InputMaybe; + propertyDetails_deedOrTitle_starts_with?: InputMaybe; + propertyDetails_deedOrTitle_starts_with_nocase?: InputMaybe; + propertyDetails_deedOrTitle_not_starts_with?: InputMaybe; + propertyDetails_deedOrTitle_not_starts_with_nocase?: InputMaybe; + propertyDetails_deedOrTitle_ends_with?: InputMaybe; + propertyDetails_deedOrTitle_ends_with_nocase?: InputMaybe; + propertyDetails_deedOrTitle_not_ends_with?: InputMaybe; + propertyDetails_deedOrTitle_not_ends_with_nocase?: InputMaybe; + propertyDetails_deedOrTitle_?: InputMaybe; + propertyDetails_images?: InputMaybe>; + propertyDetails_images_not?: InputMaybe>; + propertyDetails_images_contains?: InputMaybe>; + propertyDetails_images_contains_nocase?: InputMaybe>; + propertyDetails_images_not_contains?: InputMaybe>; + propertyDetails_images_not_contains_nocase?: InputMaybe>; + propertyDetails_images_?: InputMaybe; + otherInformation_blockchain?: InputMaybe; + otherInformation_blockchain_not?: InputMaybe; + otherInformation_blockchain_gt?: InputMaybe; + otherInformation_blockchain_lt?: InputMaybe; + otherInformation_blockchain_gte?: InputMaybe; + otherInformation_blockchain_lte?: InputMaybe; + otherInformation_blockchain_in?: InputMaybe>; + otherInformation_blockchain_not_in?: InputMaybe>; + otherInformation_blockchain_contains?: InputMaybe; + otherInformation_blockchain_contains_nocase?: InputMaybe; + otherInformation_blockchain_not_contains?: InputMaybe; + otherInformation_blockchain_not_contains_nocase?: InputMaybe; + otherInformation_blockchain_starts_with?: InputMaybe; + otherInformation_blockchain_starts_with_nocase?: InputMaybe; + otherInformation_blockchain_not_starts_with?: InputMaybe; + otherInformation_blockchain_not_starts_with_nocase?: InputMaybe; + otherInformation_blockchain_ends_with?: InputMaybe; + otherInformation_blockchain_ends_with_nocase?: InputMaybe; + otherInformation_blockchain_not_ends_with?: InputMaybe; + otherInformation_blockchain_not_ends_with_nocase?: InputMaybe; + otherInformation_wrapper?: InputMaybe; + otherInformation_wrapper_not?: InputMaybe; + otherInformation_wrapper_gt?: InputMaybe; + otherInformation_wrapper_lt?: InputMaybe; + otherInformation_wrapper_gte?: InputMaybe; + otherInformation_wrapper_lte?: InputMaybe; + otherInformation_wrapper_in?: InputMaybe>; + otherInformation_wrapper_not_in?: InputMaybe>; + otherInformation_wrapper_contains?: InputMaybe; + otherInformation_wrapper_contains_nocase?: InputMaybe; + otherInformation_wrapper_not_contains?: InputMaybe; + otherInformation_wrapper_not_contains_nocase?: InputMaybe; + otherInformation_wrapper_starts_with?: InputMaybe; + otherInformation_wrapper_starts_with_nocase?: InputMaybe; + otherInformation_wrapper_not_starts_with?: InputMaybe; + otherInformation_wrapper_not_starts_with_nocase?: InputMaybe; + otherInformation_wrapper_ends_with?: InputMaybe; + otherInformation_wrapper_ends_with_nocase?: InputMaybe; + otherInformation_wrapper_not_ends_with?: InputMaybe; + otherInformation_wrapper_not_ends_with_nocase?: InputMaybe; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type DeedMetadata_orderBy = + | 'id' + | 'ownerInformation_type' + | 'ownerInformation_name' + | 'ownerInformation_position' + | 'ownerInformation_entityName' + | 'ownerInformation_entityType' + | 'ownerInformation_ids' + | 'ownerInformation_ids__id' + | 'ownerInformation_ids__name' + | 'ownerInformation_ids__size' + | 'ownerInformation_ids__type' + | 'ownerInformation_ids__timestamp' + | 'ownerInformation_operatingAgreement' + | 'ownerInformation_operatingAgreement__id' + | 'ownerInformation_operatingAgreement__name' + | 'ownerInformation_operatingAgreement__size' + | 'ownerInformation_operatingAgreement__type' + | 'ownerInformation_operatingAgreement__timestamp' + | 'ownerInformation_articleIncorporation' + | 'ownerInformation_articleIncorporation__id' + | 'ownerInformation_articleIncorporation__name' + | 'ownerInformation_articleIncorporation__size' + | 'ownerInformation_articleIncorporation__type' + | 'ownerInformation_articleIncorporation__timestamp' + | 'ownerInformation_proofBill' + | 'ownerInformation_proofBill__id' + | 'ownerInformation_proofBill__name' + | 'ownerInformation_proofBill__size' + | 'ownerInformation_proofBill__type' + | 'ownerInformation_proofBill__timestamp' + | 'ownerInformation_supportingDoc' + | 'propertyDetails_type' + | 'propertyDetails_address' + | 'propertyDetails_city' + | 'propertyDetails_state' + | 'propertyDetails_size' + | 'propertyDetails_subType' + | 'propertyDetails_zoning' + | 'propertyDetails_purchaseContract' + | 'propertyDetails_purchaseContract__id' + | 'propertyDetails_purchaseContract__name' + | 'propertyDetails_purchaseContract__size' + | 'propertyDetails_purchaseContract__type' + | 'propertyDetails_purchaseContract__timestamp' + | 'propertyDetails_deedOrTitle' + | 'propertyDetails_deedOrTitle__id' + | 'propertyDetails_deedOrTitle__name' + | 'propertyDetails_deedOrTitle__size' + | 'propertyDetails_deedOrTitle__type' + | 'propertyDetails_deedOrTitle__timestamp' + | 'propertyDetails_images' + | 'otherInformation_blockchain' + | 'otherInformation_wrapper'; + +export type FileInfo = { + id: Scalars['ID']; + name: Scalars['String']; + size: Scalars['BigInt']; + type: Scalars['String']; + timestamp: Scalars['String']; +}; + +export type FileInfo_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + name?: InputMaybe; + name_not?: InputMaybe; + name_gt?: InputMaybe; + name_lt?: InputMaybe; + name_gte?: InputMaybe; + name_lte?: InputMaybe; + name_in?: InputMaybe>; + name_not_in?: InputMaybe>; + name_contains?: InputMaybe; + name_contains_nocase?: InputMaybe; + name_not_contains?: InputMaybe; + name_not_contains_nocase?: InputMaybe; + name_starts_with?: InputMaybe; + name_starts_with_nocase?: InputMaybe; + name_not_starts_with?: InputMaybe; + name_not_starts_with_nocase?: InputMaybe; + name_ends_with?: InputMaybe; + name_ends_with_nocase?: InputMaybe; + name_not_ends_with?: InputMaybe; + name_not_ends_with_nocase?: InputMaybe; + size?: InputMaybe; + size_not?: InputMaybe; + size_gt?: InputMaybe; + size_lt?: InputMaybe; + size_gte?: InputMaybe; + size_lte?: InputMaybe; + size_in?: InputMaybe>; + size_not_in?: InputMaybe>; + type?: InputMaybe; + type_not?: InputMaybe; + type_gt?: InputMaybe; + type_lt?: InputMaybe; + type_gte?: InputMaybe; + type_lte?: InputMaybe; + type_in?: InputMaybe>; + type_not_in?: InputMaybe>; + type_contains?: InputMaybe; + type_contains_nocase?: InputMaybe; + type_not_contains?: InputMaybe; + type_not_contains_nocase?: InputMaybe; + type_starts_with?: InputMaybe; + type_starts_with_nocase?: InputMaybe; + type_not_starts_with?: InputMaybe; + type_not_starts_with_nocase?: InputMaybe; + type_ends_with?: InputMaybe; + type_ends_with_nocase?: InputMaybe; + type_not_ends_with?: InputMaybe; + type_not_ends_with_nocase?: InputMaybe; + timestamp?: InputMaybe; + timestamp_not?: InputMaybe; + timestamp_gt?: InputMaybe; + timestamp_lt?: InputMaybe; + timestamp_gte?: InputMaybe; + timestamp_lte?: InputMaybe; + timestamp_in?: InputMaybe>; + timestamp_not_in?: InputMaybe>; + timestamp_contains?: InputMaybe; + timestamp_contains_nocase?: InputMaybe; + timestamp_not_contains?: InputMaybe; + timestamp_not_contains_nocase?: InputMaybe; + timestamp_starts_with?: InputMaybe; + timestamp_starts_with_nocase?: InputMaybe; + timestamp_not_starts_with?: InputMaybe; + timestamp_not_starts_with_nocase?: InputMaybe; + timestamp_ends_with?: InputMaybe; + timestamp_ends_with_nocase?: InputMaybe; + timestamp_not_ends_with?: InputMaybe; + timestamp_not_ends_with_nocase?: InputMaybe; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type FileInfo_orderBy = + | 'id' + | 'name' + | 'size' + | 'type' + | 'timestamp'; + +/** Defines the order direction, either ascending or descending */ +export type OrderDirection = + | 'asc' + | 'desc'; + +export type Query = { + deedEntity?: Maybe; + deedEntities: Array; + deedMetadata?: Maybe; + deedMetadata_collection: Array; + transfer?: Maybe; + transfers: Array; + approval?: Maybe; + approvals: Array; + approvalForAll?: Maybe; + approvalForAlls: Array; + fileInfo?: Maybe; + fileInfos: Array; + /** Access to subgraph metadata */ + _meta?: Maybe<_Meta_>; +}; + + +export type QuerydeedEntityArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerydeedEntitiesArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerydeedMetadataArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerydeedMetadata_collectionArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerytransferArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerytransfersArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryapprovalArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryapprovalsArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryapprovalForAllArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryapprovalForAllsArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryfileInfoArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QueryfileInfosArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type Query_metaArgs = { + block?: InputMaybe; +}; + +export type Subscription = { + deedEntity?: Maybe; + deedEntities: Array; + deedMetadata?: Maybe; + deedMetadata_collection: Array; + transfer?: Maybe; + transfers: Array; + approval?: Maybe; + approvals: Array; + approvalForAll?: Maybe; + approvalForAlls: Array; + fileInfo?: Maybe; + fileInfos: Array; + /** Access to subgraph metadata */ + _meta?: Maybe<_Meta_>; +}; + + +export type SubscriptiondeedEntityArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptiondeedEntitiesArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptiondeedMetadataArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptiondeedMetadata_collectionArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptiontransferArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptiontransfersArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionapprovalArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionapprovalsArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionapprovalForAllArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionapprovalForAllsArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionfileInfoArgs = { + id: Scalars['ID']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionfileInfosArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type Subscription_metaArgs = { + block?: InputMaybe; +}; + +export type Transfer = { + id: Scalars['Bytes']; + from: Scalars['Bytes']; + to: Scalars['Bytes']; + tokenId: Scalars['BigInt']; + blockNumber: Scalars['BigInt']; + blockTimestamp: Scalars['BigInt']; + transactionHash: Scalars['Bytes']; +}; + +export type Transfer_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + id_contains?: InputMaybe; + id_not_contains?: InputMaybe; + from?: InputMaybe; + from_not?: InputMaybe; + from_gt?: InputMaybe; + from_lt?: InputMaybe; + from_gte?: InputMaybe; + from_lte?: InputMaybe; + from_in?: InputMaybe>; + from_not_in?: InputMaybe>; + from_contains?: InputMaybe; + from_not_contains?: InputMaybe; + to?: InputMaybe; + to_not?: InputMaybe; + to_gt?: InputMaybe; + to_lt?: InputMaybe; + to_gte?: InputMaybe; + to_lte?: InputMaybe; + to_in?: InputMaybe>; + to_not_in?: InputMaybe>; + to_contains?: InputMaybe; + to_not_contains?: InputMaybe; + tokenId?: InputMaybe; + tokenId_not?: InputMaybe; + tokenId_gt?: InputMaybe; + tokenId_lt?: InputMaybe; + tokenId_gte?: InputMaybe; + tokenId_lte?: InputMaybe; + tokenId_in?: InputMaybe>; + tokenId_not_in?: InputMaybe>; + blockNumber?: InputMaybe; + blockNumber_not?: InputMaybe; + blockNumber_gt?: InputMaybe; + blockNumber_lt?: InputMaybe; + blockNumber_gte?: InputMaybe; + blockNumber_lte?: InputMaybe; + blockNumber_in?: InputMaybe>; + blockNumber_not_in?: InputMaybe>; + blockTimestamp?: InputMaybe; + blockTimestamp_not?: InputMaybe; + blockTimestamp_gt?: InputMaybe; + blockTimestamp_lt?: InputMaybe; + blockTimestamp_gte?: InputMaybe; + blockTimestamp_lte?: InputMaybe; + blockTimestamp_in?: InputMaybe>; + blockTimestamp_not_in?: InputMaybe>; + transactionHash?: InputMaybe; + transactionHash_not?: InputMaybe; + transactionHash_gt?: InputMaybe; + transactionHash_lt?: InputMaybe; + transactionHash_gte?: InputMaybe; + transactionHash_lte?: InputMaybe; + transactionHash_in?: InputMaybe>; + transactionHash_not_in?: InputMaybe>; + transactionHash_contains?: InputMaybe; + transactionHash_not_contains?: InputMaybe; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type Transfer_orderBy = + | 'id' + | 'from' + | 'to' + | 'tokenId' + | 'blockNumber' + | 'blockTimestamp' + | 'transactionHash'; + +export type _Block_ = { + /** The hash of the block */ + hash?: Maybe; + /** The block number */ + number: Scalars['Int']; + /** Integer representation of the timestamp stored in blocks for the chain */ + timestamp?: Maybe; +}; + +/** The type for the top-level _meta field */ +export type _Meta_ = { + /** + * Information about a specific subgraph block. The hash of the block + * will be null if the _meta field has a block constraint that asks for + * a block number. It will be filled if the _meta field has no block constraint + * and therefore asks for the latest block + * + */ + block: _Block_; + /** The deployment ID */ + deployment: Scalars['String']; + /** If `true`, the subgraph encountered indexing errors at some past block */ + hasIndexingErrors: Scalars['Boolean']; +}; + +export type _SubgraphErrorPolicy_ = + /** Data will be returned even if the subgraph has indexing errors */ + | 'allow' + /** If the subgraph has indexing errors, data will be omitted. The default. */ + | 'deny'; + + export type QuerySdk = { + /** null **/ + deedEntity: InContextSdkMethod, + /** null **/ + deedEntities: InContextSdkMethod, + /** null **/ + deedMetadata: InContextSdkMethod, + /** null **/ + deedMetadata_collection: InContextSdkMethod, + /** null **/ + transfer: InContextSdkMethod, + /** null **/ + transfers: InContextSdkMethod, + /** null **/ + approval: InContextSdkMethod, + /** null **/ + approvals: InContextSdkMethod, + /** null **/ + approvalForAll: InContextSdkMethod, + /** null **/ + approvalForAlls: InContextSdkMethod, + /** null **/ + fileInfo: InContextSdkMethod, + /** null **/ + fileInfos: InContextSdkMethod, + /** Access to subgraph metadata **/ + _meta: InContextSdkMethod + }; + + export type MutationSdk = { + + }; + + export type SubscriptionSdk = { + /** null **/ + deedEntity: InContextSdkMethod, + /** null **/ + deedEntities: InContextSdkMethod, + /** null **/ + deedMetadata: InContextSdkMethod, + /** null **/ + deedMetadata_collection: InContextSdkMethod, + /** null **/ + transfer: InContextSdkMethod, + /** null **/ + transfers: InContextSdkMethod, + /** null **/ + approval: InContextSdkMethod, + /** null **/ + approvals: InContextSdkMethod, + /** null **/ + approvalForAll: InContextSdkMethod, + /** null **/ + approvalForAlls: InContextSdkMethod, + /** null **/ + fileInfo: InContextSdkMethod, + /** null **/ + fileInfos: InContextSdkMethod, + /** Access to subgraph metadata **/ + _meta: InContextSdkMethod + }; + + export type Context = { + ["Deed3-Sepolia"]: { Query: QuerySdk, Mutation: MutationSdk, Subscription: SubscriptionSdk }, + + }; +} diff --git a/packages/nextjs/.graphclientrc.yml b/packages/nextjs/.graphclientrc.yml new file mode 100644 index 00000000..cd889a27 --- /dev/null +++ b/packages/nextjs/.graphclientrc.yml @@ -0,0 +1,5 @@ +sources: + - name: Deed3-Sepolia + handler: + graphql: + endpoint: https://api.studio.thegraph.com/query/56229/deed3-sepolia/version/latest diff --git a/packages/nextjs/.vscode/settings.json b/packages/nextjs/.vscode/settings.json index 042ff998..05ab40c7 100644 --- a/packages/nextjs/.vscode/settings.json +++ b/packages/nextjs/.vscode/settings.json @@ -5,4 +5,6 @@ }, "editor.formatOnSave": true, "javascript.format.enable": false, + "typescript.tsdk": "node_modules/typescript/lib", + "typescript.enablePromptUseWorkspaceTsdk": true } \ No newline at end of file diff --git a/packages/nextjs/.well-known/walletconnect.txt b/packages/nextjs/.well-known/walletconnect.txt new file mode 100644 index 00000000..ac7f05af --- /dev/null +++ b/packages/nextjs/.well-known/walletconnect.txt @@ -0,0 +1 @@ +0x0ab22d2726f0A858A5e644CB36FFc90A5A3cedA0 \ No newline at end of file diff --git a/packages/nextjs/clients/deed3.query.ts b/packages/nextjs/clients/deed3.query.ts new file mode 100644 index 00000000..5f758476 --- /dev/null +++ b/packages/nextjs/clients/deed3.query.ts @@ -0,0 +1,74 @@ +const Deed3Query = ` + query FetchDeedEntities( + $PROPERTY_ADDRESS: String + $PROPERTY_CITY: String + $PROPERTY_STATE: String + $PROPERTY_TYPE: String + ) { + deedEntities( + where: { + and: [ + { + deedMetadata_: { + and: [ + { + or: [ + { propertyDetails_address_contains_nocase: $PROPERTY_ADDRESS } + { propertyDetails_city_contains_nocase: $PROPERTY_CITY } + { propertyDetails_state_contains_nocase: $PROPERTY_STATE } + ] + } + { propertyDetails_type: $PROPERTY_TYPE } + ] + } + } + { isValidated: true } + ] + } + ) { + id + deedId + owner + assetType + deedMetadata { + ownerInformation_type + ownerInformation_name + ownerInformation_position + ownerInformation_entityName + ownerInformation_entityType + ownerInformation_ids { + id + } + ownerInformation_operatingAgreement { + id + } + ownerInformation_proofBill { + id + } + ownerInformation_supportingDoc { + id + } + propertyDetails_type + propertyDetails_address + propertyDetails_city + propertyDetails_size + propertyDetails_state + propertyDetails_zoning + propertyDetails_images { + id + } + propertyDetails_subType + propertyDetails_deedOrTitle { + id + } + propertyDetails_purchaseContract { + id + } + otherInformation_wrapper + otherInformation_blockchain + } + } + } +`; + +export default Deed3Query; diff --git a/packages/nextjs/clients/file.client.ts b/packages/nextjs/clients/file.client.ts index 3dd7de50..e56dd56c 100644 --- a/packages/nextjs/clients/file.client.ts +++ b/packages/nextjs/clients/file.client.ts @@ -7,30 +7,41 @@ import { notification } from "~~/utils/scaffold-eth"; // LINK ../pages/api/files.api.ts export class FileClient extends HttpClient { - public async downloadFile(fileId: string, name: string) { + public async getFile(fileId: string, name: string, download: boolean = false) { + const toastId = notification.loading(download ? "Downloading file ..." : "Opening file ..."); const fileInfo = await this.getFileInfo(fileId); if (!fileInfo) { notification.error("Error downloading file " + name); + notification.remove(toastId); return; } - const url = `/api/files?download=true&fileId=${fileId}&chainId=${this.chainId}`; - const toastId = notification.loading("Downloading file ..."); - const response = await fetch(url, { - headers: [["authorization", this.authorizationToken ?? ""]], - }); - notification.remove(toastId); - if (response.status !== 200) { - notification.error("Error downloading file " + name); - logger.error({ message: "Error downloading file", details: await response.text() }); - return; + const url = `/api/files?download=${download}&fileId=${fileId}&chainId=${this.chainId}`; + + if (download) { + const response = await fetch(url, { + headers: [["authorization", this.authorizationToken ?? ""]], + }); + notification.remove(toastId); + if (response.status !== 200) { + notification.error("Error downloading file " + name); + logger.error({ message: "Error downloading file", details: await response.text() }); + return; + } + const blob = await response.blob(); + const blobUrl = URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = blobUrl; + link.download = fileInfo.fileName; + link.click(); + URL.revokeObjectURL(blobUrl); + } else { + const urlObj = new URL(url, window.location.href); + if (this.authorizationToken) { + urlObj.searchParams.append("authorization", this.authorizationToken); + } + window.open(urlObj.toString(), "_blank"); + notification.remove(toastId); } - const blob = await response.blob(); - const blobUrl = URL.createObjectURL(blob); - const link = document.createElement("a"); - link.href = blobUrl; - link.download = fileInfo.fileName; - link.click(); - URL.revokeObjectURL(blobUrl); } public async uploadFile(file: FileModel, fieldLabel: string) { diff --git a/packages/nextjs/clients/registrations.client.ts b/packages/nextjs/clients/registrations.client.ts index c9c04162..fe008e80 100644 --- a/packages/nextjs/clients/registrations.client.ts +++ b/packages/nextjs/clients/registrations.client.ts @@ -1,6 +1,5 @@ import useHttpClient, { HttpClient } from "./base.client"; import { DeedInfoModel } from "~~/models/deed-info.model"; -import { fetchFileInfos } from "~~/services/file.service"; import logger from "~~/services/logger.service"; import { notification } from "~~/utils/scaffold-eth"; @@ -20,18 +19,13 @@ export class RegistrationClient extends HttpClient { } async getRegistration(id: string, isRestricted: boolean = false) { - if (isRestricted && !this.authorizationToken) { - notification.error("Please connect"); - return { status: 401, error: "Unauthorized", value: undefined, ok: false }; - } + // if (isRestricted && !this.authorizationToken) { + // notification.error("Please connect"); + // return { status: 401, error: "Unauthorized", value: undefined, ok: false }; + // } const result = await this.get( `/api/registrations?id=${id}&isRestricted=${isRestricted}`, ); - if (result.value === undefined || !result.ok) { - logger.error({ message: "Error getting registration with id " + id, status: result.status }); - } else { - result.value = await fetchFileInfos(result.value, this.authorizationToken); - } return result; } diff --git a/packages/nextjs/pages/agent-explorer/AgentCard.tsx b/packages/nextjs/components/AgentCard.tsx similarity index 98% rename from packages/nextjs/pages/agent-explorer/AgentCard.tsx rename to packages/nextjs/components/AgentCard.tsx index 60784693..b994e680 100644 --- a/packages/nextjs/pages/agent-explorer/AgentCard.tsx +++ b/packages/nextjs/components/AgentCard.tsx @@ -27,7 +27,7 @@ const AgentCard = ({ agent }: Props) => { <> {agent && (
{ public state: State = { hasError: false, + currentNotifError: undefined, }; public static getDerivedStateFromError(_: Error): State { @@ -23,7 +25,10 @@ class ErrorBoundary extends Component { } public componentDidCatch(error: Error, errorInfo: ErrorInfo) { - notification.error("An error occured"); + if (this.state.currentNotifError) { + notification.remove(this.state.currentNotifError); + } + // this.setState({ currentNotifError: notification.error("An error occured") }); logger.error({ error, errorInfo }); } diff --git a/packages/nextjs/components/ExplorerLinks.tsx b/packages/nextjs/components/ExplorerLinks.tsx new file mode 100644 index 00000000..efa2535d --- /dev/null +++ b/packages/nextjs/components/ExplorerLinks.tsx @@ -0,0 +1,40 @@ +import { usePathname, useSearchParams } from "next/dist/client/components/navigation"; +import Link from "next/link"; + +const ExplorerLinks = () => { + const searchParams = useSearchParams(); + const pathname = usePathname(); + const type = searchParams.get("type"); + return ( +
+ + All + + + For Sale + + + For Lease + + + Agent Directory + +
+ ); +}; + +export default ExplorerLinks; diff --git a/packages/nextjs/components/FileValidation.tsx b/packages/nextjs/components/FileValidation.tsx new file mode 100644 index 00000000..9b860412 --- /dev/null +++ b/packages/nextjs/components/FileValidation.tsx @@ -0,0 +1,215 @@ +import React, { useEffect, useMemo, useState } from "react"; +import { useDynamicContext } from "@dynamic-labs/sdk-react-core"; +import { isArray } from "lodash-es"; +import useFileClient from "~~/clients/file.client"; +import { FileUploaderInput } from "~~/components/inputs/FileUploaderInput"; +import { DeedInfoModel } from "~~/models/deed-info.model"; +import { FileFieldKeyLabel, FileModel, FileValidationState } from "~~/models/file.model"; +import { LightChangeEvent } from "~~/models/light-change-event"; +import { notification } from "~~/utils/scaffold-eth"; + +interface Props { + id: string; + fileLabels?: string[]; + label: string; + description?: string; + button?: React.ReactNode; + deedData: DeedInfoModel; + supportedFiles: Map; + onSave: (deed: DeedInfoModel) => Promise; + onRefresh: () => void; + onStateChanged?: (id: string, state: FileValidationState) => void; +} +const FileValidation = ({ + id, + fileLabels, + label, + description, + supportedFiles, + button, + onStateChanged, + onSave, + onRefresh, + deedData, +}: Props) => { + const { authToken } = useDynamicContext(); + const fileClient = useFileClient(); + const [isBadgeEdit, setIsBadgeEdit] = useState(false); + const [allFiles, setAllFiles] = useState<(FileFieldKeyLabel & { files?: FileModel[] })[]>([]); + + const state = useMemo(() => { + const validationEntry = deedData.validations?.find(x => x[0] === id); + return validationEntry?.[1]; + }, [deedData.validations, id]); + + const stateBadge = useMemo(() => { + switch (state) { + case "Completed": + return "success"; + case "Needs Review": + return "error"; + case "Processing": + return "warning"; + case "Not started": + default: + return "neutral"; + } + }, [state]); + + useEffect(() => { + if (fileLabels && supportedFiles) { + const files: typeof allFiles = []; + fileLabels.forEach(label => { + const x = supportedFiles.get(label)!; + if (!x) return; + files.push({ ...x, files: x?.getFile(deedData) }); + }); + setAllFiles(files); + } + }, [fileLabels, supportedFiles]); + + const handleFileUpload = async ( + files: LightChangeEvent, + field: (typeof allFiles)[number], + ) => { + if (!isArray(files.value)) { + files.value = [files.value]; + } + const toastId = notification.loading("Uploading documents..."); + await Promise.all( + files.value.map(async (file: FileModel, index: number) => { + const fileId = await fileClient.authentify(authToken ?? "").uploadFile(file, field.label); + files.value.fileId = fileId; + if (!field.key[1]) { + if (field.multiple) { + // @ts-ignore + if (!deedData[field.key[0]]) deedData[field.key[0]] = []; + // @ts-ignore + deedData[field.key[0]][index] = file; + } else { + // @ts-ignore + deedData[field.key[0]] = file; + } + } else { + if (field.multiple) { + // @ts-ignore + if (!deedData[field.key[0]][field.key[1]]) deedData[field.key[0]][field.key[1]] = []; + // @ts-ignore + deedData[field.key[0]][field.key[1]][index] = file; + } else { + // @ts-ignore + deedData[field.key[0]][field.key[1]] = file; + } + } + }), + ) + .catch(() => { + notification.error("Error uploading documents"); + }) + .finally(() => { + notification.remove(toastId); + }); + + onSave(deedData); + }; + + const openFile = async (file: FileModel) => { + await fileClient.authentify(authToken ?? "").getFile(file.fileId, file.fileName, false); + }; + + const handleStateChanged = (ev: any) => { + const newState = ev.target.value as FileValidationState; + onStateChanged?.(id, newState); + setIsBadgeEdit(false); + }; + + return ( +
+
+
{label}
+
{description}
+
+
+ {stateBadge && isBadgeEdit ? ( + + ) : ( +
setIsBadgeEdit(x => !x)} + > + {state ?? "Not started"} +
+ )} + {button ? ( + button + ) : ( +
+
+ View documents +
+
    + {allFiles.map(field => ( +
  • +
    {field.label}
    +
    + {field.files?.map(file => + file ? ( + + ) : ( + + No file + + ), + )} +
    + handleFileUpload(newFile as FileModel, field)} + > +
    +
    +
  • + ))} +
+
+ )} +
+
+ ); +}; + +export default FileValidation; diff --git a/packages/nextjs/components/Header.tsx b/packages/nextjs/components/Header.tsx index d3165257..b9b7f9fd 100644 --- a/packages/nextjs/components/Header.tsx +++ b/packages/nextjs/components/Header.tsx @@ -1,5 +1,4 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; -import Image from "next/image"; import Link from "next/link"; import { useRouter } from "next/router"; import { DynamicWidget, useDynamicContext } from "@dynamic-labs/sdk-react-core"; @@ -55,27 +54,31 @@ export const Header = () => { onChange={() => setSearch(searchRef.current?.value)} value={search} /> - + /
Register Explore - Docs + + Docs + {/* About */} ), @@ -84,7 +87,7 @@ export const Header = () => { return ( <> -
+
-
- SE2 logo -
-
- Deed3.0 - {/* Decentralized real estate */} -
+ + +
-
+
{nav}
diff --git a/packages/nextjs/components/Layout.tsx b/packages/nextjs/components/Layout.tsx new file mode 100644 index 00000000..7ad39594 --- /dev/null +++ b/packages/nextjs/components/Layout.tsx @@ -0,0 +1,51 @@ +import { AppProps } from "next/app"; +import { DynamicWidget } from "@dynamic-labs/sdk-react-core"; +import { Toaster } from "react-hot-toast"; +import { BackToTop } from "~~/components/BackToTop"; +import ErrorBoundary from "~~/components/ErrorBoundary"; +import { Footer } from "~~/components/Footer"; +import { Header } from "~~/components/Header"; + +const Layout = ({ pageProps, Component }: AppProps) => { + // const connectBtnRef = useRef(null); + // useEffect(() => { + // setInterval(() => { + // const connected = document + // .querySelector("#dynamic-widget") + // ?.shadowRoot?.querySelector('[data-testid="AccountControl"]'); + // if (connected) return; + // const modal = document + // .querySelector('[data-testid="dynamic-modal-shadow"]') + // ?.shadowRoot?.querySelector(".modal"); + // if (modal) return; + // const el = + // connectBtnRef?.current?.children[0]?.shadowRoot?.querySelector("button"); + // if (el) { + // el.click(); + // } + // }, 500); + // }, []); + return ( + <> +
+
+
+ + + +
+
+
+ + +
+ Connect
} + /> +
+ + ); +}; + +export default Layout; diff --git a/packages/nextjs/components/Map.tsx b/packages/nextjs/components/Map.tsx index 4c7c22f5..af1ca95f 100644 --- a/packages/nextjs/components/Map.tsx +++ b/packages/nextjs/components/Map.tsx @@ -1,57 +1,73 @@ "use client"; -import { useEffect } from "react"; -import { DivIcon } from "leaflet"; -import "leaflet/dist/leaflet.css"; -import { MapContainer, Marker, Popup, TileLayer } from "react-leaflet"; -import { IMarker } from "~~/models/marker.model"; +import { useState } from "react"; +import classes from "./Page.module.css"; +import "mapbox-gl/dist/mapbox-gl.css"; +import Mapbox, { Marker } from "react-map-gl"; + +const mapboxToken = + "pk.eyJ1IjoiY29yYW50aW4iLCJhIjoiY2xtdjZiZTV4MGlibDJsbXM5ZzM1dHg0OCJ9.cv78ncZxEq8TE2exs5vvIA"; interface Props { - markers: IMarker[]; + markers: Array; } -const defaultIcon = new DivIcon({ - className: "property-icon", - html: `
`, - iconSize: [30, 42], - iconAnchor: [15, 42], - popupAnchor: [-3, -76], -}); +interface Marker { + id: string; + lat: number; + lng: number; +} const Map = ({ markers }: Props) => { - useEffect(() => { - console.log(window); - const map = document.getElementById("map"); - // Scroll only if needed - if (map && window.scrollY + map.offsetTop + map.offsetHeight >= window.screen.height) { - window.scrollTo({ top: map.offsetTop, behavior: "smooth" }); - } - }, []); + const [resolvedMarkers, setResolvedMarkers] = useState(); + + // useEffect(() => { + // (async () => { + // setResolvedMarkers( + // await Promise.all( + // markers.map(async marker => { + // const response = await fetch( + // `https://api.mapbox.com/geocoding/v5/mapbox.places/${encodeURI( + // marker, + // )}.json?access_token=${mapboxToken}`, + // ); + // if (!response.ok) throw new Error("Failed to fetch"); + // const data = await response.json(); + + // const markerData = data.features[0]; + // return { + // id: markerData.id, + // lat: markerData.geometry.coordinates[1], + // lng: markerData.geometry.coordinates[0], + // }; + // }), + // ), + // ); + // })().catch(err => { + // logger.error(err); + // }); + // }, [markers]); + return ( - <> - + {/* {resolvedMarkers?.length && ( */} + - - {markers.map(marker => ( - - {marker.popupContent && {marker.popupContent}} - - ))} - - + {/* {resolvedMarkers?.map(marker => ( + + ))} */} + + {/* )} */} + ); }; diff --git a/packages/nextjs/components/Navbar.tsx b/packages/nextjs/components/Navbar.tsx index a5d42cb1..bfd702da 100644 --- a/packages/nextjs/components/Navbar.tsx +++ b/packages/nextjs/components/Navbar.tsx @@ -8,7 +8,7 @@ const Navbar = () => { const type = searchParams.get("type"); return ( -
+
) => void; + readOnly?: boolean; +} + +const OtherInformations = ({ value, onChange, readOnly }: Props) => { + const handleChange = (ev: LightChangeEvent) => { + const updatedValue = { ...value, [ev.name]: ev.value }; + onChange?.({ name: "otherInformation", value: updatedValue }); + }; + return ( +
+
+ 3. Other Information +
+ + + Learn more + +  about each Wrapper type. + + } + options={WrapperOptions(["$225.00", "$450.00"])} + optionsClassName="w-full" + value={value?.wrapper} + onChange={handleChange} + readOnly={readOnly} + /> +
+ ); +}; + +export default OtherInformations; diff --git a/packages/nextjs/pages/registration/OwnerInformation.tsx b/packages/nextjs/components/OwnerInformation.tsx similarity index 63% rename from packages/nextjs/pages/registration/OwnerInformation.tsx rename to packages/nextjs/components/OwnerInformation.tsx index 2950fe9e..2d93d493 100644 --- a/packages/nextjs/pages/registration/OwnerInformation.tsx +++ b/packages/nextjs/components/OwnerInformation.tsx @@ -21,14 +21,28 @@ const OwnerInformation = ({ value, onChange, readOnly }: Props) => { }; return ( -
-
1. Owner Information
+
+
+ 1. Owner Information +
+ + How do you currently hold this property? -  + + Learn more + + + } + options={OwnerTypeOptions} + optionsClassName="w-[180px] h-[180px]" onChange={handleChange} value={value?.ownerType} readOnly={readOnly} @@ -87,14 +101,13 @@ const OwnerInformation = ({ value, onChange, readOnly }: Props) => { )}
-
+
@@ -122,54 +135,55 @@ const OwnerInformation = ({ value, onChange, readOnly }: Props) => { isRestricted={true} />
-
- -
- - Learn more - -  about Entity Verification. + {value?.ownerType === "legal" && ( +
+ +
+ + Learn more + +  about Entity Verification. +
+ + +
- - - -
+ )}
); }; diff --git a/packages/nextjs/components/Page.module.css b/packages/nextjs/components/Page.module.css new file mode 100644 index 00000000..1afa6784 --- /dev/null +++ b/packages/nextjs/components/Page.module.css @@ -0,0 +1,30 @@ +.mainStyle { + max-width: 100%; + height: 320px; +} +.mapStyle { + width: 100%; + height: 100%; +} +.popupTitle { + background-color: #87bd41; + font-weight: 700; + font-size: medium; + color: ivory; + padding: 10px; +} +.popupInfo { + font-weight: 400; + font-size: 14px; + padding: 10px; +} +.popupLabel { + font-weight: bold; +} +.popupWebUrl { + color: dodgerblue; +} +.popupWebUrl:active, +.popupWebUrl:focus { + outline: 0; +} diff --git a/packages/nextjs/components/PaymentInformation.tsx b/packages/nextjs/components/PaymentInformation.tsx new file mode 100644 index 00000000..fa0216e5 --- /dev/null +++ b/packages/nextjs/components/PaymentInformation.tsx @@ -0,0 +1,47 @@ +import React from "react"; +import Link from "next/link"; +import { RadioBoxesInput } from "~~/components/inputs/RadioBoxesInput"; +import { PaymentOptions } from "~~/constants"; +import { DeedInfoModel, PaymentInformationModel } from "~~/models/deed-info.model"; +import { LightChangeEvent } from "~~/models/light-change-event"; + +interface Props { + value?: PaymentInformationModel; + onChange?: (ev: LightChangeEvent) => void; +} + +const PaymentInformation = ({ value, onChange }: Props) => { + const handleChange = (ev: LightChangeEvent) => { + const updatedValue = { ...value, [ev.name]: ev.value }; + onChange?.({ name: "paymentInformation", value: updatedValue }); + }; + return ( +
+
+ 4. Payment Information +
+ + + Learn more + +   about our Payment Options. + + } + options={PaymentOptions} + optionsClassName="w-[180px] h-[220px]" + value={value?.paymentType} + onChange={handleChange} + /> +
+ ); +}; + +export default PaymentInformation; diff --git a/packages/nextjs/pages/property-explorer/PropertyCard.tsx b/packages/nextjs/components/PropertyCard.tsx similarity index 82% rename from packages/nextjs/pages/property-explorer/PropertyCard.tsx rename to packages/nextjs/components/PropertyCard.tsx index e425eb6c..e069cacb 100644 --- a/packages/nextjs/pages/property-explorer/PropertyCard.tsx +++ b/packages/nextjs/components/PropertyCard.tsx @@ -8,13 +8,17 @@ interface Props { } const PropertyCard = ({ property }: Props) => { + // const propertyTypeLabel = useMemo( + // () => PropertyTypeOptions.find(x => x.value === property?.type)?.title, + // [property.type], + // ); return ( <> {property && ( - -
+ +
Picture { })}
-
+ {/*
TYPE
{property.type}
-
+
*/}
ZONING
Residential
diff --git a/packages/nextjs/components/PropertyDetails.tsx b/packages/nextjs/components/PropertyDetails.tsx new file mode 100644 index 00000000..f64071cc --- /dev/null +++ b/packages/nextjs/components/PropertyDetails.tsx @@ -0,0 +1,249 @@ +import { useState } from "react"; +import { CheckIcon, PencilIcon } from "@heroicons/react/24/outline"; +import TextInput from "~~/components/inputs/TextInput"; +import { DeedInfoModel, PropertyDetailsModel } from "~~/models/deed-info.model"; +import { LightChangeEvent } from "~~/models/light-change-event"; + +interface Props { + propertyDetail: PropertyDetailsModel; + isOwner?: boolean; + onChange?: (ev: LightChangeEvent) => void; + refresh: () => void; + onSave: () => void; +} + +const PropertyDetails = ({ propertyDetail, isOwner, onChange, refresh, onSave }: Props) => { + const [viewMode, setViewMode] = useState(true); + const handleChange = (ev: LightChangeEvent) => { + const updatedValue = { ...propertyDetail, [ev.name]: ev.value }; + onChange?.({ + name: "propertyDetails", + value: updatedValue, + }); + }; + + const handleViewModeToggle = () => { + setViewMode(isViewMode => { + if (!isViewMode) { + onSave(); + } + return !isViewMode; + }); + }; + + return ( + <> + {propertyDetail && ( +
+
+
Property Details
+ {/* {isOwner && ( */} + + {/* )} */} +
+
+ {/* First col */} +
+
+
Bed / Bath:
+
+ {viewMode ? ( + <> + + + ) : ( +
+ + +
+ )} +
+
+
+
Lot size:
+ +
+
+
Square footage:
+ +
+
+
+
+
Build Year:
+ +
+
+
Location:
+ +
+
+
Property Type:
+ +
+
+
+
+ + + + +
+
+ )} + + ); +}; + +export default PropertyDetails; diff --git a/packages/nextjs/pages/property-explorer/PropertyFilters.tsx b/packages/nextjs/components/PropertyFilters.tsx similarity index 96% rename from packages/nextjs/pages/property-explorer/PropertyFilters.tsx rename to packages/nextjs/components/PropertyFilters.tsx index 43455667..097fe210 100644 --- a/packages/nextjs/pages/property-explorer/PropertyFilters.tsx +++ b/packages/nextjs/components/PropertyFilters.tsx @@ -8,8 +8,9 @@ import { AdjustmentsHorizontalIcon } from "@heroicons/react/24/solid"; import { PropertyTypeOptions } from "~~/constants"; import useDebouncer from "~~/hooks/useDebouncer"; import { useKeyboardShortcut } from "~~/hooks/useKeyboardShortcut"; +import { PropertyType } from "~~/models/deed-info.model"; import { PropertiesFilterModel } from "~~/models/properties-filter.model"; -import { ListingType, PropertyModel, PropertyType } from "~~/models/property.model"; +import { ListingType, PropertyModel } from "~~/models/property.model"; interface Props { properties: PropertyModel[]; @@ -90,7 +91,7 @@ const PropertyFilters = ({ properties, onFilter }: Props) => {
setAdvancedPlan(ev.target.value === "true")} + /> + + SUBSCRIBE TODAY TO + SAVE 50% ON + LISTINGS. + +
+
+ +
+ + Pricing information + +
+ + + +
+ + + +
+ Add to your order +
+
+
+ Appraisal and inspection + + {USDollar.format(quoteDetails.appraisalAndInspectionFees)} + +
+ +
+
+ + ) : ( + + ))} +
+
+ +
+ {deedData && deedData.id ? ( + <> + {(isValidator || isOwner) && ( +
+ Status:{" "} + + {deedData.isValidated ? "Verified" : "Waiting for validation"} + +
+ )} + {isValidator && (isDev() || !isOwner) && ( + <> +
+
Payment information:
+
    +
  • +
    + Type: + {deedData.paymentInformation?.paymentType === "crypto" ? ( + Crypto + ) : ( + Fiat + )} +
    +
  • + {deedData.paymentInformation?.paymentType === "crypto" ? ( + <> +
  • +
    Coin:
    +
    +
  • +
  • +
    Transaction:
    + {deedData.paymentInformation.receipt ? ( + + ) : ( + No receipt + )} +
  • + + ) : ( + <> +
  • +
    Receipt:
    + {deedData.paymentInformation.receipt ? ( + + + Open in stripe + + ) : ( + No receipt + )} +
  • + + )} +
+
+ {isDraft ? ( + + ) : ( + + )} + + )} + {deedData.owner === primaryWallet?.address && ( + <> + + {/* {!deedData.paymentInformation.receipt && deedData?.id && ( + + )} */} + + )} + + ) : ( + + )} +
+ +
+
+ Powered by  + Deed3Labs +
+
|
+
+ + TERMS + + + PRIVACY POLICY + +
+
+
+
+ ); +}; +export default SidePanel; diff --git a/packages/nextjs/components/ValidationProcedures.tsx b/packages/nextjs/components/ValidationProcedures.tsx new file mode 100644 index 00000000..8017691f --- /dev/null +++ b/packages/nextjs/components/ValidationProcedures.tsx @@ -0,0 +1,259 @@ +import { useEffect, useState } from "react"; +import FileValidation from "./FileValidation"; +import { useSignMessage } from "wagmi"; +import { DeedInfoModel } from "~~/models/deed-info.model"; +import { FileFieldKeyLabel, FileValidationState } from "~~/models/file.model"; +import { getSupportedFiles } from "~~/services/file.service"; +import { notification } from "~~/utils/scaffold-eth"; + +interface Props { + deedData: DeedInfoModel; + onSave: (deed: DeedInfoModel) => Promise; + onRefresh: () => void; +} + +const ValidationProcedures = ({ deedData, onSave, onRefresh }: Props) => { + const [supportedFiles, setSupportedFiles] = useState>(); + const { data: signMessageData, signMessageAsync, error, isLoading, variables } = useSignMessage(); + + useEffect(() => { + const map = new Map(); + getSupportedFiles(deedData, undefined, false, true, true).forEach(x => { + map.set(x.label, x); + }); + setSupportedFiles(map); + }, [deedData]); + + useEffect(() => { + if (signMessageData) { + deedData.signatureTx = signMessageData; + onSave(deedData); + } + }, [signMessageData]); + + const handleStateChange = (id: string, state: FileValidationState) => { + if (!deedData.validations) deedData.validations = []; + const validationEntry = deedData.validations.find(x => x[0] === id); + + if (!validationEntry) { + deedData.validations.push([id, state]); + } else { + validationEntry[1] = state; + } + onSave(deedData).then(onRefresh); + }; + + const handleSign = async () => { + await signMessageAsync({ + message: "Please sign this message to confirm that you agree to tokenize your asset.", + }); + }; + + return ( + + + + + + + {supportedFiles && ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + )} +
+
+ + + +
Validation Procedures
+
+
+
01
+
+
Property validation
+
+
+ +
+
+
+ +
+
+
+ +
+
+
02
+
+
PREP, FILING & NOTARIZATION
+
+
+ + View Agreements + + } + supportedFiles={supportedFiles} + onStateChanged={handleStateChange} + deedData={deedData} + onSave={onSave} + onRefresh={onRefresh} + > +
+
+
+ handleStateChange("DocumentNotorization", "Processing")} + > + Begin Process + + } + supportedFiles={supportedFiles} + onStateChanged={handleStateChange} + deedData={deedData} + onSave={onSave} + onRefresh={onRefresh} + > +
+
+
+ +
+
+
03
+
+
Confirmation & Minting
+
+
+ + Click to sign + + } + onStateChanged={handleStateChange} + supportedFiles={supportedFiles} + deedData={deedData} + onSave={onSave} + onRefresh={onRefresh} + > +
+
+ ); +}; + +export default ValidationProcedures; diff --git a/packages/nextjs/components/assets/Downloadicon.tsx b/packages/nextjs/components/assets/Downloadicon.tsx index e8f39bc6..252b7cf2 100644 --- a/packages/nextjs/components/assets/Downloadicon.tsx +++ b/packages/nextjs/components/assets/Downloadicon.tsx @@ -6,7 +6,7 @@ export const DownloadLogo = () => { viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" - className="w-6 h-6" + className="w-5 h-5" > { label: string; name: keyof TParent; - subtitle: string; + subtitle?: string; optional?: boolean; className?: string; value?: FileModel | FileModel[]; @@ -18,6 +18,7 @@ interface Props { maxFileSizeKb?: number; readOnly?: boolean; isRestricted?: boolean; + inline?: boolean; onChange?: (file: LightChangeEvent) => void; } @@ -27,6 +28,7 @@ export const FileUploaderInput = ({ subtitle, optional, className, + inline, onChange, multiple, value, @@ -36,17 +38,19 @@ export const FileUploaderInput = ({ }: Props) => { const fileClient = useFileClient(); const { authToken, primaryWallet } = useDynamicContext(); - const files = useMemo(() => { - if (value) { - return Array.isArray(value) ? value : [value]; - } - return []; - }, [value]); - + const [files, setFiles] = useState([]); const isValidator = useIsValidator(); - const inputRef = useRef(null); + useEffect(() => { + if (value) { + const values = Array.isArray(value) ? value : [value]; + setFiles([...values]); + } else { + setFiles([]); + } + }, [value, authToken]); + const handleKeyDown = (ev: React.KeyboardEvent) => { if (ev.key === "Enter") { inputRef.current?.click(); @@ -55,14 +59,13 @@ export const FileUploaderInput = ({ const handleFileChange = (files: FileList | null) => { if (files) { - const newValues = Array.from(files).map( - x => - ({ - fileName: x.name, - restricted: isRestricted, - metadata: x, - } satisfies Omit), - ); + const newValues = Array.from(files).map(x => ({ + fileName: x.name, + restricted: isRestricted, + size: x.size, + mimetype: x.type, + metadata: x, + })); // If multiple files are allowed, convert the FileList to an array onChange?.({ @@ -73,7 +76,11 @@ export const FileUploaderInput = ({ }; const download = async (hash: string) => { - await fileClient.authentify(authToken ?? "").downloadFile(hash, name.toString()); + await fileClient.authentify(authToken ?? "").getFile(hash, name.toString(), true); + }; + + const openFile = async (hash: string) => { + await fileClient.authentify(authToken ?? "").getFile(hash, name.toString(), false); }; const handleDrop = (ev: React.DragEvent) => { @@ -103,94 +110,108 @@ export const FileUploaderInput = ({ }; return ( -
-