@xyo-network/crypto-nft-collection-witness-plugin 2.78.2 → 2.78.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/dist/browser/Plugin.d.cts +2 -0
  2. package/dist/browser/Plugin.d.cts.map +1 -1
  3. package/dist/browser/Plugin.d.mts +2 -0
  4. package/dist/browser/Plugin.d.mts.map +1 -1
  5. package/dist/browser/Plugin.d.ts +2 -0
  6. package/dist/browser/Plugin.d.ts.map +1 -1
  7. package/dist/browser/Witness.d.cts +6 -1
  8. package/dist/browser/Witness.d.cts.map +1 -1
  9. package/dist/browser/Witness.d.mts +6 -1
  10. package/dist/browser/Witness.d.mts.map +1 -1
  11. package/dist/browser/Witness.d.ts +6 -1
  12. package/dist/browser/Witness.d.ts.map +1 -1
  13. package/dist/browser/index.cjs +96 -87
  14. package/dist/browser/index.cjs.map +1 -1
  15. package/dist/browser/index.js +94 -85
  16. package/dist/browser/index.js.map +1 -1
  17. package/dist/browser/lib/getNftCollectionNfts.d.cts +3 -2
  18. package/dist/browser/lib/getNftCollectionNfts.d.cts.map +1 -1
  19. package/dist/browser/lib/getNftCollectionNfts.d.mts +3 -2
  20. package/dist/browser/lib/getNftCollectionNfts.d.mts.map +1 -1
  21. package/dist/browser/lib/getNftCollectionNfts.d.ts +3 -2
  22. package/dist/browser/lib/getNftCollectionNfts.d.ts.map +1 -1
  23. package/dist/browser/lib/{getProvider.d.cts → getProviderFromEnv.d.cts} +1 -1
  24. package/dist/browser/lib/getProviderFromEnv.d.cts.map +1 -0
  25. package/dist/browser/lib/{getProvider.d.mts → getProviderFromEnv.d.mts} +1 -1
  26. package/dist/browser/lib/getProviderFromEnv.d.mts.map +1 -0
  27. package/dist/browser/lib/{getProvider.d.ts → getProviderFromEnv.d.ts} +1 -1
  28. package/dist/browser/lib/getProviderFromEnv.d.ts.map +1 -0
  29. package/dist/browser/lib/index.d.cts +2 -2
  30. package/dist/browser/lib/index.d.cts.map +1 -1
  31. package/dist/browser/lib/index.d.mts +2 -2
  32. package/dist/browser/lib/index.d.mts.map +1 -1
  33. package/dist/browser/lib/index.d.ts +2 -2
  34. package/dist/browser/lib/index.d.ts.map +1 -1
  35. package/dist/browser/lib/tokenTypes.d.cts +8 -0
  36. package/dist/browser/lib/tokenTypes.d.cts.map +1 -0
  37. package/dist/browser/lib/tokenTypes.d.mts +8 -0
  38. package/dist/browser/lib/tokenTypes.d.mts.map +1 -0
  39. package/dist/browser/lib/tokenTypes.d.ts +8 -0
  40. package/dist/browser/lib/tokenTypes.d.ts.map +1 -0
  41. package/dist/node/Plugin.d.cts +2 -0
  42. package/dist/node/Plugin.d.cts.map +1 -1
  43. package/dist/node/Plugin.d.mts +2 -0
  44. package/dist/node/Plugin.d.mts.map +1 -1
  45. package/dist/node/Plugin.d.ts +2 -0
  46. package/dist/node/Plugin.d.ts.map +1 -1
  47. package/dist/node/Witness.d.cts +6 -1
  48. package/dist/node/Witness.d.cts.map +1 -1
  49. package/dist/node/Witness.d.mts +6 -1
  50. package/dist/node/Witness.d.mts.map +1 -1
  51. package/dist/node/Witness.d.ts +6 -1
  52. package/dist/node/Witness.d.ts.map +1 -1
  53. package/dist/node/index.js +102 -91
  54. package/dist/node/index.js.map +1 -1
  55. package/dist/node/index.mjs +94 -85
  56. package/dist/node/index.mjs.map +1 -1
  57. package/dist/node/lib/getNftCollectionNfts.d.cts +3 -2
  58. package/dist/node/lib/getNftCollectionNfts.d.cts.map +1 -1
  59. package/dist/node/lib/getNftCollectionNfts.d.mts +3 -2
  60. package/dist/node/lib/getNftCollectionNfts.d.mts.map +1 -1
  61. package/dist/node/lib/getNftCollectionNfts.d.ts +3 -2
  62. package/dist/node/lib/getNftCollectionNfts.d.ts.map +1 -1
  63. package/dist/node/lib/{getProvider.d.cts → getProviderFromEnv.d.cts} +1 -1
  64. package/dist/node/lib/getProviderFromEnv.d.cts.map +1 -0
  65. package/dist/node/lib/getProviderFromEnv.d.mts +3 -0
  66. package/dist/node/lib/getProviderFromEnv.d.mts.map +1 -0
  67. package/dist/node/lib/getProviderFromEnv.d.ts +3 -0
  68. package/dist/node/lib/getProviderFromEnv.d.ts.map +1 -0
  69. package/dist/node/lib/index.d.cts +2 -2
  70. package/dist/node/lib/index.d.cts.map +1 -1
  71. package/dist/node/lib/index.d.mts +2 -2
  72. package/dist/node/lib/index.d.mts.map +1 -1
  73. package/dist/node/lib/index.d.ts +2 -2
  74. package/dist/node/lib/index.d.ts.map +1 -1
  75. package/dist/node/lib/tokenTypes.d.cts +8 -0
  76. package/dist/node/lib/tokenTypes.d.cts.map +1 -0
  77. package/dist/node/lib/tokenTypes.d.mts +8 -0
  78. package/dist/node/lib/tokenTypes.d.mts.map +1 -0
  79. package/dist/node/lib/tokenTypes.d.ts +8 -0
  80. package/dist/node/lib/tokenTypes.d.ts.map +1 -0
  81. package/package.json +15 -11
  82. package/src/Witness.ts +51 -9
  83. package/src/lib/getNftCollectionNfts.ts +11 -9
  84. package/src/lib/index.ts +2 -2
  85. package/src/lib/tokenTypes.ts +36 -0
  86. package/dist/browser/lib/getNftCollectionCount.d.cts +0 -2
  87. package/dist/browser/lib/getNftCollectionCount.d.cts.map +0 -1
  88. package/dist/browser/lib/getNftCollectionCount.d.mts +0 -2
  89. package/dist/browser/lib/getNftCollectionCount.d.mts.map +0 -1
  90. package/dist/browser/lib/getNftCollectionCount.d.ts +0 -2
  91. package/dist/browser/lib/getNftCollectionCount.d.ts.map +0 -1
  92. package/dist/browser/lib/getNftCollectionMetadata.d.cts +0 -5
  93. package/dist/browser/lib/getNftCollectionMetadata.d.cts.map +0 -1
  94. package/dist/browser/lib/getNftCollectionMetadata.d.mts +0 -5
  95. package/dist/browser/lib/getNftCollectionMetadata.d.mts.map +0 -1
  96. package/dist/browser/lib/getNftCollectionMetadata.d.ts +0 -5
  97. package/dist/browser/lib/getNftCollectionMetadata.d.ts.map +0 -1
  98. package/dist/browser/lib/getProvider.d.cts.map +0 -1
  99. package/dist/browser/lib/getProvider.d.mts.map +0 -1
  100. package/dist/browser/lib/getProvider.d.ts.map +0 -1
  101. package/dist/node/lib/getNftCollectionCount.d.cts +0 -2
  102. package/dist/node/lib/getNftCollectionCount.d.cts.map +0 -1
  103. package/dist/node/lib/getNftCollectionCount.d.mts +0 -2
  104. package/dist/node/lib/getNftCollectionCount.d.mts.map +0 -1
  105. package/dist/node/lib/getNftCollectionCount.d.ts +0 -2
  106. package/dist/node/lib/getNftCollectionCount.d.ts.map +0 -1
  107. package/dist/node/lib/getNftCollectionMetadata.d.cts +0 -5
  108. package/dist/node/lib/getNftCollectionMetadata.d.cts.map +0 -1
  109. package/dist/node/lib/getNftCollectionMetadata.d.mts +0 -5
  110. package/dist/node/lib/getNftCollectionMetadata.d.mts.map +0 -1
  111. package/dist/node/lib/getNftCollectionMetadata.d.ts +0 -5
  112. package/dist/node/lib/getNftCollectionMetadata.d.ts.map +0 -1
  113. package/dist/node/lib/getProvider.d.cts.map +0 -1
  114. package/dist/node/lib/getProvider.d.mts +0 -3
  115. package/dist/node/lib/getProvider.d.mts.map +0 -1
  116. package/dist/node/lib/getProvider.d.ts +0 -3
  117. package/dist/node/lib/getProvider.d.ts.map +0 -1
  118. package/src/lib/getNftCollectionCount.ts +0 -22
  119. package/src/lib/getNftCollectionMetadata.ts +0 -58
  120. /package/src/lib/{getProvider.ts → getProviderFromEnv.ts} +0 -0
@@ -13,6 +13,7 @@ import {
13
13
  NftCollectionSchema,
14
14
  NftCollectionWitnessConfigSchema
15
15
  } from "@xyo-network/crypto-nft-collection-payload-plugin";
16
+ import { ERC721Enumerable__factory as ERC721Enumerable__factory2 } from "@xyo-network/open-zeppelin-typechain";
16
17
 
17
18
  // src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts
18
19
  var calculateAllPropertiesDistribution = (array) => {
@@ -71,23 +72,10 @@ var getNftCollectionMetrics = (nfts) => {
71
72
  return { metadata: { attributes } };
72
73
  };
73
74
 
74
- // src/lib/getNftCollectionCount.ts
75
- import { ERC721Enumerable__factory } from "@xyo-network/open-zeppelin-typechain";
76
-
77
- // src/lib/getProvider.ts
78
- import { InfuraProvider, WebSocketProvider } from "@ethersproject/providers";
79
- var getProviderFromEnv = (chainId = "homestead") => {
80
- const infuraWssUri = process.env.INFURA_WSS_URI;
81
- const infuraProvider = new InfuraProvider("homestead", {
82
- projectId: process.env.INFURA_PROJECT_ID,
83
- projectSecret: process.env.INFURA_PROJECT_SECRET
84
- });
85
- const infuraWebsocketProvider = infuraWssUri ? new WebSocketProvider(infuraWssUri, chainId) : void 0;
86
- const quickNodeUri = process.env.QUICKNODE_WSS_URI;
87
- const quickNodeProvider = quickNodeUri ? new WebSocketProvider(quickNodeUri, chainId) : void 0;
88
- const provider = infuraWebsocketProvider ?? infuraProvider ?? infuraWebsocketProvider ?? quickNodeProvider ?? infuraProvider;
89
- return provider;
90
- };
75
+ // src/lib/getNftCollectionNfts.ts
76
+ import { AxiosJson } from "@xyo-network/axios";
77
+ import { NftSchema, toTokenType } from "@xyo-network/crypto-nft-payload-plugin";
78
+ import { ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory } from "@xyo-network/open-zeppelin-typechain";
91
79
 
92
80
  // src/lib/nonEvaluableContractAddresses.ts
93
81
  var nonEvaluableContractAddresses = [
@@ -95,63 +83,38 @@ var nonEvaluableContractAddresses = [
95
83
  "0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72"
96
84
  ].map((address) => address.toUpperCase());
97
85
 
98
- // src/lib/getNftCollectionCount.ts
99
- var getNftCollectionCount = async (contractAddress, chainId) => {
100
- if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {
101
- throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`);
102
- }
103
- const provider = getProviderFromEnv(chainId);
104
- const contract = ERC721Enumerable__factory.connect(contractAddress, provider);
105
- return (await contract.totalSupply()).toNumber();
86
+ // src/lib/tokenTypes.ts
87
+ import { ERC1155URIStorage__factory, IERC721Metadata__factory } from "@xyo-network/open-zeppelin-typechain";
88
+ var isErc1155 = async (contract) => {
89
+ return await hasFunctions(contract, ERC1155URIStorage__factory.createInterface(), ["uri"]);
106
90
  };
107
-
108
- // src/lib/getNftCollectionMetadata.ts
109
- import { ERC721Enumerable__factory as ERC721Enumerable__factory2, ERC1155__factory } from "@xyo-network/open-zeppelin-typechain";
110
- import { constants } from "ethers";
111
- function getInterfaceID(contractInterface) {
112
- let interfaceID = constants.Zero;
113
- const functions = Object.keys(contractInterface.functions);
114
- for (let i = 0; i < functions.length; i++) {
115
- interfaceID = interfaceID.xor(contractInterface.getSighash(functions[i]));
116
- }
117
- return interfaceID.toHexString();
118
- }
119
- var getNftCollectionMetadata = async (contractAddress, chainId) => {
120
- if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {
121
- throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`);
122
- }
123
- const provider = getProviderFromEnv(chainId);
124
- const contract721 = ERC721Enumerable__factory2.connect(contractAddress, provider);
125
- const contract1155 = ERC1155__factory.connect(contractAddress, provider);
126
- let name = "";
127
- try {
128
- name = await contract721.name();
129
- } catch (ex) {
130
- const error = ex;
131
- console.log(`name: ${error.message}`);
91
+ var isErc721 = async (contract) => {
92
+ return await hasFunctions(contract, IERC721Metadata__factory.createInterface(), ["name", "symbol", "tokenURI"]);
93
+ };
94
+ var hasFunctions = async (contract, contractInterface, functionNames) => {
95
+ const bytecode = await contract.provider.getCode(contract.address);
96
+ for (let i = 0; i < functionNames.length; i++) {
97
+ const nameSig = contractInterface.getSighash(functionNames[i]).substring(2);
98
+ if (!bytecode.includes(nameSig)) {
99
+ return false;
100
+ }
101
+ return true;
132
102
  }
133
- let symbol = "";
134
- try {
135
- symbol = await contract721.symbol();
136
- } catch (ex) {
137
- const error = ex;
138
- console.log(`symbol: ${error.message}`);
103
+ return false;
104
+ };
105
+ var tokenTypes = async (contract) => {
106
+ const [erc721, erc1155] = await Promise.all([isErc721(contract), isErc1155(contract)]);
107
+ const result = [];
108
+ if (erc721) {
109
+ result.push("ERC721");
139
110
  }
140
- let is1155 = false;
141
- try {
142
- is1155 = await contract1155.supportsInterface(getInterfaceID(ERC1155__factory.getInterface(ERC1155__factory.abi)));
143
- } catch (ex) {
144
- const error = ex;
145
- console.log(`is1155: ${error.message}`);
146
- is1155 = false;
111
+ if (erc1155) {
112
+ result.push("ERC1155");
147
113
  }
148
- return { address: contractAddress, chainId, name, symbol, type: is1155 ? "ERC1155" : "ERC721" };
114
+ return result;
149
115
  };
150
116
 
151
117
  // src/lib/getNftCollectionNfts.ts
152
- import { AxiosJson } from "@xyo-network/axios";
153
- import { NftSchema, toTokenType } from "@xyo-network/crypto-nft-payload-plugin";
154
- import { ERC721Enumerable__factory as ERC721Enumerable__factory3, ERC721URIStorage__factory, ERC1155Supply__factory } from "@xyo-network/open-zeppelin-typechain";
155
118
  var ipfsGateway = "5d7b6582.beta.decentralnetworkservices.com";
156
119
  var checkIpfsUrl = (urlToCheck, ipfsGateway2) => {
157
120
  const url = new URL(urlToCheck);
@@ -169,20 +132,20 @@ var checkIpfsUrl = (urlToCheck, ipfsGateway2) => {
169
132
  return urlToCheck;
170
133
  }
171
134
  };
172
- var getNftCollectionNfts = async (contractAddress, chainId, maxNfts = 100) => {
135
+ var getNftCollectionNfts = async (contractAddress, provider, types, maxNfts = 100) => {
173
136
  if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {
174
137
  throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`);
175
138
  }
176
139
  const axios = new AxiosJson({ timeout: 2e3 });
177
- const provider = getProviderFromEnv(chainId);
178
- const enumerable = ERC721Enumerable__factory3.connect(contractAddress, provider);
140
+ const enumerable = ERC721Enumerable__factory.connect(contractAddress, provider);
179
141
  const storage = ERC721URIStorage__factory.connect(contractAddress, provider);
180
142
  const supply1155 = ERC1155Supply__factory.connect(contractAddress, provider);
143
+ const finalTypes = types ?? await tokenTypes(enumerable);
181
144
  const result = [];
182
- const { type: nftType } = await getNftCollectionMetadata(contractAddress, chainId);
183
145
  for (let i = 0; i < maxNfts; i++) {
146
+ console.log(`Getting Token [${i}]`);
184
147
  const tokenId = (await enumerable.tokenByIndex(i)).toHexString();
185
- const supply = nftType === toTokenType("ERC11155") ? (await supply1155.totalSupply(tokenId)).toHexString() : "0x01";
148
+ const supply = finalTypes.includes(toTokenType("ERC1155")) ? (await supply1155.totalSupply(tokenId)).toHexString() : "0x01";
186
149
  const metadataUri = await storage.tokenURI(tokenId);
187
150
  const checkedMetaDataUri = checkIpfsUrl(metadataUri, ipfsGateway);
188
151
  let metadata = void 0;
@@ -194,49 +157,93 @@ var getNftCollectionNfts = async (contractAddress, chainId, maxNfts = 100) => {
194
157
  }
195
158
  const info = {
196
159
  address: contractAddress,
197
- chainId,
160
+ chainId: provider.network.chainId,
198
161
  metadata,
199
162
  metadataUri,
200
163
  schema: NftSchema,
201
164
  supply,
202
165
  tokenId,
203
- type: nftType
166
+ type: finalTypes.at(0),
167
+ types
204
168
  };
205
169
  result.push(info);
206
170
  }
207
171
  return result;
208
172
  };
209
173
 
174
+ // src/lib/getProviderFromEnv.ts
175
+ import { InfuraProvider, WebSocketProvider } from "@ethersproject/providers";
176
+ var getProviderFromEnv = (chainId = "homestead") => {
177
+ const infuraWssUri = process.env.INFURA_WSS_URI;
178
+ const infuraProvider = new InfuraProvider("homestead", {
179
+ projectId: process.env.INFURA_PROJECT_ID,
180
+ projectSecret: process.env.INFURA_PROJECT_SECRET
181
+ });
182
+ const infuraWebsocketProvider = infuraWssUri ? new WebSocketProvider(infuraWssUri, chainId) : void 0;
183
+ const quickNodeUri = process.env.QUICKNODE_WSS_URI;
184
+ const quickNodeProvider = quickNodeUri ? new WebSocketProvider(quickNodeUri, chainId) : void 0;
185
+ const provider = infuraWebsocketProvider ?? infuraProvider ?? infuraWebsocketProvider ?? quickNodeProvider ?? infuraProvider;
186
+ return provider;
187
+ };
188
+
210
189
  // src/Witness.ts
211
190
  var defaultMaxNfts = 100;
212
191
  var NoOp = Promise.resolve();
192
+ function resolvedValue(settled, assert) {
193
+ if (assert && settled.status === "rejected") {
194
+ throw settled.reason;
195
+ }
196
+ return settled.status === "fulfilled" ? settled.value : void 0;
197
+ }
213
198
  var CryptoNftCollectionWitness = class extends AbstractWitness {
214
199
  static configSchemas = [NftCollectionWitnessConfigSchema];
200
+ providers = {};
201
+ getProvider(chainId) {
202
+ this.providers[chainId] = this.providers[chainId] ?? getProviderFromEnv(chainId);
203
+ return this.providers[chainId];
204
+ }
215
205
  async observeHandler(payloads) {
216
206
  await this.started("throw");
217
207
  const queries = payloads?.filter(isNftCollectionWitnessQuery) ?? [];
218
208
  const observations = await Promise.all(
219
209
  queries.map(async (query) => {
210
+ const chainId = assertEx(query?.chainId || this.config.chainId, "params.chainId is required");
211
+ const provider = this.getProvider(chainId);
220
212
  const address = assertEx(
221
213
  EthAddress.parse(assertEx(query?.address || this.config.address, "params.address is required")),
222
214
  "Failed to parse params.address"
223
215
  ).toString();
224
- const chainId = assertEx(query?.chainId || this.config.chainId, "params.chainId is required");
216
+ const erc721Enumerable = ERC721Enumerable__factory2.connect(address, provider);
225
217
  const maxNfts = query?.maxNfts || defaultMaxNfts;
226
- const [info, total, nfts, archivist] = await Promise.all([
227
- getNftCollectionMetadata(address, chainId),
228
- getNftCollectionCount(address, chainId),
229
- getNftCollectionNfts(address, chainId, maxNfts),
230
- this.writeArchivist()
218
+ const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([
219
+ await erc721Enumerable.name(),
220
+ await erc721Enumerable.symbol(),
221
+ (await erc721Enumerable.totalSupply()).toNumber(),
222
+ await tokenTypes(erc721Enumerable),
223
+ await this.writeArchivist()
231
224
  ]);
225
+ const types = resolvedValue(typesSettled, true);
226
+ const nfts = await getNftCollectionNfts(address, provider, types, maxNfts);
232
227
  const metrics = getNftCollectionMetrics(nfts);
228
+ const archivist = resolvedValue(archivistSettled);
233
229
  const [sources] = await Promise.all([
234
230
  // Hash all the payloads
235
231
  Promise.all(nfts.map((nft) => PayloadHasher.hashAsync(nft))),
236
232
  // Insert them into the archivist if we have one
237
233
  archivist ? archivist.insert(nfts) : NoOp
238
234
  ]);
239
- const payload = { ...info, metrics, schema: NftCollectionSchema, sources, total };
235
+ const payload = {
236
+ address,
237
+ chainId,
238
+ metrics,
239
+ name: resolvedValue(name, true),
240
+ schema: NftCollectionSchema,
241
+ sources,
242
+ symbol: resolvedValue(symbol, true),
243
+ total: resolvedValue(total, true),
244
+ type: types.at(0),
245
+ types
246
+ };
240
247
  return payload;
241
248
  })
242
249
  );
@@ -262,10 +269,12 @@ export {
262
269
  CryptoNftCollectionWitnessPlugin,
263
270
  checkIpfsUrl,
264
271
  src_default as default,
265
- getInterfaceID,
266
- getNftCollectionCount,
267
- getNftCollectionMetadata,
268
272
  getNftCollectionMetrics,
269
- getNftCollectionNfts
273
+ getNftCollectionNfts,
274
+ getProviderFromEnv,
275
+ hasFunctions,
276
+ isErc1155,
277
+ isErc721,
278
+ tokenTypes
270
279
  };
271
280
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Plugin.ts","../../src/Witness.ts","../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts","../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts","../../src/lib/collectionMetrics/getNftCollectionMetrics.ts","../../src/lib/getNftCollectionCount.ts","../../src/lib/getProvider.ts","../../src/lib/nonEvaluableContractAddresses.ts","../../src/lib/getNftCollectionMetadata.ts","../../src/lib/getNftCollectionNfts.ts","../../src/index.ts"],"sourcesContent":["import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { CryptoNftCollectionWitness } from './Witness'\n\nexport const CryptoNftCollectionWitnessPlugin = () =>\n createPayloadSetWitnessPlugin<CryptoNftCollectionWitness>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await CryptoNftCollectionWitness.create(params)\n return result\n },\n },\n )\n","import { assertEx } from '@xylabs/assert'\nimport { EthAddress } from '@xylabs/eth-address'\nimport { AbstractWitness } from '@xyo-network/abstract-witness'\nimport { PayloadHasher } from '@xyo-network/core'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionInfo,\n NftCollectionSchema,\n NftCollectionWitnessConfig,\n NftCollectionWitnessConfigSchema,\n NftCollectionWitnessQuery,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { AnyConfigSchema } from '@xyo-network/module-model'\nimport { WitnessParams } from '@xyo-network/witness-model'\n\nimport { getNftCollectionCount, getNftCollectionMetadata, getNftCollectionMetrics, getNftCollectionNfts } from './lib'\n\nexport type CryptoNftCollectionWitnessParams = WitnessParams<AnyConfigSchema<NftCollectionWitnessConfig>>\n\nconst defaultMaxNfts = 100\n\n/**\n * A \"no operation\" Promise to be used\n * when no action is desired but a Promise\n * is required to be returned\n */\nconst NoOp = Promise.resolve()\n\nexport class CryptoNftCollectionWitness<TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams> extends AbstractWitness<\n TParams,\n NftCollectionWitnessQuery,\n NftCollectionInfo\n> {\n static override configSchemas = [NftCollectionWitnessConfigSchema]\n\n protected override async observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]> {\n await this.started('throw')\n const queries = payloads?.filter(isNftCollectionWitnessQuery) ?? []\n const observations = await Promise.all(\n queries.map<Promise<NftCollectionInfo>>(async (query) => {\n const address = assertEx(\n EthAddress.parse(assertEx(query?.address || this.config.address, 'params.address is required')),\n 'Failed to parse params.address',\n ).toString()\n const chainId = assertEx(query?.chainId || this.config.chainId, 'params.chainId is required')\n const maxNfts = query?.maxNfts || defaultMaxNfts\n const [info, total, nfts, archivist] = await Promise.all([\n getNftCollectionMetadata(address, chainId),\n getNftCollectionCount(address, chainId),\n getNftCollectionNfts(address, chainId, maxNfts),\n this.writeArchivist(),\n ])\n const metrics = getNftCollectionMetrics(nfts)\n const [sources] = await Promise.all([\n // Hash all the payloads\n Promise.all(nfts.map((nft) => PayloadHasher.hashAsync(nft))),\n // Insert them into the archivist if we have one\n archivist ? archivist.insert(nfts) : NoOp,\n ])\n const payload: NftCollectionInfo = { ...info, metrics, schema: NftCollectionSchema, sources, total }\n return payload\n }),\n )\n return observations.flat()\n }\n}\n","import { Distribution } from './distribution'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n array.forEach((item) => {\n for (const property in item) {\n if (Object.prototype.hasOwnProperty.call(item, property)) {\n const value = item[property as keyof T]\n if (value !== undefined && value !== null) {\n const valueString = value.toString()\n if (!distribution[property]) {\n distribution[property] = { [valueString]: 1 }\n } else if (!distribution[property]![valueString]) {\n ;(distribution[property] as Record<string, number>)[valueString] = 1\n } else {\n ;(distribution[property] as Record<string, number>)[valueString] += 1\n }\n }\n }\n }\n })\n\n return distribution\n}\n","import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin'\n\n/**\n * Calculates the parameters of a binomial distribution given the number of trials and success probability\n * @param n Number of trials\n * @param p Success probability\n * @returns The binomial distribution parameters\n */\nexport const calculateBinomialParamsFromProbability = (n: number, p: number): BinomialDistributionParameters => {\n // Mean (µ)\n const mean = n * p\n\n // Variance (σ^2)\n const variance = n * p * (1 - p)\n\n // Standard Deviation (σ)\n const stdDev = Math.sqrt(variance)\n\n return { mean, p, stdDev, variance }\n}\n","import { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib'\n\ntype TraitDistributionEntry = [string, { [key: string]: number }]\n\nexport const getNftCollectionMetrics = (nfts: NftInfoFields[]): NftCollectionMetrics => {\n const traits = nfts\n .map((nft) => nft?.metadata?.attributes as OpenSeaNftAttribute[] | undefined)\n .filter((v): v is OpenSeaNftAttribute[] => v !== undefined)\n .map((attributes) => {\n return Object.fromEntries(attributes.map((attribute) => [attribute.trait_type, attribute.value]))\n })\n const distribution = calculateAllPropertiesDistribution(traits)\n const n = nfts.length\n const attributes = Object.fromEntries(\n Object.entries(distribution)\n .filter((v): v is TraitDistributionEntry => v[1] !== undefined)\n .map(([trait, entries]) => {\n const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0)\n const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n)\n const values = Object.fromEntries(\n Object.entries(entries).map(([value, traitValueCount]) => {\n const { p } = calculateBinomialParamsFromProbability(n, traitValueCount / n)\n const metrics: NftTraitMetrics = { binomial: { p }, count: traitValueCount }\n return [value, metrics]\n }),\n )\n return [trait, { metrics: { binomial: { p }, count: traitCount }, values }]\n }),\n )\n return { metadata: { attributes } }\n}\n","import { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'\n\nimport { getProviderFromEnv } from './getProvider'\nimport { nonEvaluableContractAddresses } from './nonEvaluableContractAddresses'\n\nexport const getNftCollectionCount = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: string,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n chainId: number,\n): Promise<number> => {\n if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {\n throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`)\n }\n const provider = getProviderFromEnv(chainId)\n const contract = ERC721Enumerable__factory.connect(contractAddress, provider)\n return (await contract.totalSupply()).toNumber()\n}\n","import { InfuraProvider, WebSocketProvider } from '@ethersproject/providers'\n\nexport const getProviderFromEnv = (chainId: string | number = 'homestead') => {\n const infuraWssUri = process.env.INFURA_WSS_URI\n const infuraProvider = new InfuraProvider('homestead', {\n projectId: process.env.INFURA_PROJECT_ID,\n projectSecret: process.env.INFURA_PROJECT_SECRET,\n })\n\n const infuraWebsocketProvider = infuraWssUri ? new WebSocketProvider(infuraWssUri, chainId) : undefined\n\n const quickNodeUri = process.env.QUICKNODE_WSS_URI\n const quickNodeProvider = quickNodeUri ? new WebSocketProvider(quickNodeUri, chainId) : undefined\n\n const provider = infuraWebsocketProvider ?? infuraProvider ?? infuraWebsocketProvider ?? quickNodeProvider ?? infuraProvider\n return provider\n}\n","/**\n * These contracts are not evaluable for some\n * reason (too large, nonsensical, etc.)\n */\nexport const nonEvaluableContractAddresses = [\n // ENS\n '0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72',\n].map((address) => address.toUpperCase())\n","import { Interface } from '@ethersproject/abi'\nimport { NftCollectionMetadata } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { ERC721Enumerable__factory, ERC1155__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { constants } from 'ethers'\n\nimport { getProviderFromEnv } from './getProvider'\nimport { nonEvaluableContractAddresses } from './nonEvaluableContractAddresses'\n\nexport function getInterfaceID(contractInterface: Interface) {\n let interfaceID = constants.Zero\n const functions: string[] = Object.keys(contractInterface.functions)\n for (let i = 0; i < functions.length; i++) {\n interfaceID = interfaceID.xor(contractInterface.getSighash(functions[i]))\n }\n\n return interfaceID.toHexString()\n}\n\nexport const getNftCollectionMetadata = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: string,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n chainId: number,\n): Promise<Omit<NftCollectionMetadata, 'total'>> => {\n if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {\n throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`)\n }\n const provider = getProviderFromEnv(chainId)\n const contract721 = ERC721Enumerable__factory.connect(contractAddress, provider)\n const contract1155 = ERC1155__factory.connect(contractAddress, provider)\n let name: string = ''\n try {\n name = await contract721.name()\n } catch (ex) {\n const error = ex as Error\n console.log(`name: ${error.message}`)\n }\n let symbol: string = ''\n try {\n symbol = await contract721.symbol()\n } catch (ex) {\n const error = ex as Error\n console.log(`symbol: ${error.message}`)\n }\n let is1155: boolean = false\n try {\n is1155 = await contract1155.supportsInterface(getInterfaceID(ERC1155__factory.getInterface(ERC1155__factory.abi)))\n } catch (ex) {\n const error = ex as Error\n console.log(`is1155: ${error.message}`)\n is1155 = false\n }\n return { address: contractAddress, chainId, name, symbol, type: is1155 ? 'ERC1155' : 'ERC721' }\n}\n","import { AxiosJson } from '@xyo-network/axios'\nimport { NftInfo, NftMetadata, NftSchema, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory } from '@xyo-network/open-zeppelin-typechain'\n\nimport { getNftCollectionMetadata } from './getNftCollectionMetadata'\nimport { getProviderFromEnv } from './getProvider'\nimport { nonEvaluableContractAddresses } from './nonEvaluableContractAddresses'\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\n/**\n * Returns the equivalent IPFS gateway URL for the supplied URL.\n * @param urlToCheck The URL to check\n * @returns If the supplied URL is an IPFS URL, it converts the URL to the\n * equivalent IPFS gateway URL. Otherwise, returns the original URL.\n */\nexport const checkIpfsUrl = (urlToCheck: string, ipfsGateway: string) => {\n const url = new URL(urlToCheck)\n let protocol = url.protocol\n let host = url.host\n let path = url.pathname\n const query = url.search\n if (protocol === 'ipfs:') {\n protocol = 'https:'\n host = ipfsGateway\n path = url.host === 'ipfs' ? `ipfs${path}` : `ipfs/${url.host}${path}`\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else {\n return urlToCheck\n }\n}\n\nexport const getNftCollectionNfts = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: string,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n chainId: number,\n /**\n * The maximum number of NFTs to return. Configurable to prevent\n * large wallets from exhausting Infura API credits. Ideally a\n * multiple of 100 as that appears to be the default page size.\n */\n maxNfts = 100,\n): Promise<NftInfo[]> => {\n if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {\n throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`)\n }\n const axios = new AxiosJson({ timeout: 2000 })\n const provider = getProviderFromEnv(chainId)\n const enumerable = ERC721Enumerable__factory.connect(contractAddress, provider)\n const storage = ERC721URIStorage__factory.connect(contractAddress, provider)\n const supply1155 = ERC1155Supply__factory.connect(contractAddress, provider)\n const result: NftInfo[] = []\n const { type: nftType } = await getNftCollectionMetadata(contractAddress, chainId)\n\n for (let i = 0; i < maxNfts; i++) {\n const tokenId = (await enumerable.tokenByIndex(i)).toHexString()\n const supply = nftType === toTokenType('ERC11155') ? (await supply1155.totalSupply(tokenId)).toHexString() : '0x01'\n const metadataUri = await storage.tokenURI(tokenId)\n const checkedMetaDataUri = checkIpfsUrl(metadataUri, ipfsGateway)\n let metadata: NftMetadata | undefined = undefined\n try {\n metadata = (await axios.get(checkedMetaDataUri)).data\n } catch (ex) {\n const error = ex as Error\n console.error(error.message)\n }\n\n const info: NftInfo = {\n address: contractAddress,\n chainId,\n metadata,\n metadataUri,\n schema: NftSchema,\n supply,\n tokenId,\n type: nftType,\n }\n result.push(info)\n }\n return result\n}\n","import { CryptoNftCollectionWitnessPlugin } from './Plugin'\n\nexport * from './lib'\nexport * from './Witness'\n\nexport { CryptoNftCollectionWitnessPlugin }\n\n// eslint-disable-next-line import/no-default-export\nexport default CryptoNftCollectionWitnessPlugin\n"],"mappings":"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","names":["NftSchema","attributes","p","ERC721Enumerable__factory","ERC721Enumerable__factory","ERC721Enumerable__factory","ipfsGateway","ERC721Enumerable__factory","NftSchema"]}
1
+ {"version":3,"sources":["../../src/Plugin.ts","../../src/Witness.ts","../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts","../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts","../../src/lib/collectionMetrics/getNftCollectionMetrics.ts","../../src/lib/getNftCollectionNfts.ts","../../src/lib/nonEvaluableContractAddresses.ts","../../src/lib/tokenTypes.ts","../../src/lib/getProviderFromEnv.ts","../../src/index.ts"],"sourcesContent":["import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { CryptoNftCollectionWitness } from './Witness'\n\nexport const CryptoNftCollectionWitnessPlugin = () =>\n createPayloadSetWitnessPlugin<CryptoNftCollectionWitness>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await CryptoNftCollectionWitness.create(params)\n return result\n },\n },\n )\n","import { InfuraProvider, Provider, WebSocketProvider } from '@ethersproject/providers'\nimport { assertEx } from '@xylabs/assert'\nimport { EthAddress } from '@xylabs/eth-address'\nimport { AbstractWitness } from '@xyo-network/abstract-witness'\nimport { PayloadHasher } from '@xyo-network/core'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionInfo,\n NftCollectionSchema,\n NftCollectionWitnessConfig,\n NftCollectionWitnessConfigSchema,\n NftCollectionWitnessQuery,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { AnyConfigSchema } from '@xyo-network/module-model'\nimport { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { WitnessParams } from '@xyo-network/witness-model'\n\nimport { getNftCollectionMetrics, getNftCollectionNfts, getProviderFromEnv, tokenTypes } from './lib'\n\nexport type CryptoNftCollectionWitnessParams = WitnessParams<\n AnyConfigSchema<NftCollectionWitnessConfig>,\n {\n provider: Provider\n }\n>\n\nconst defaultMaxNfts = 100\n\n/**\n * A \"no operation\" Promise to be used\n * when no action is desired but a Promise\n * is required to be returned\n */\nconst NoOp = Promise.resolve()\n\nfunction resolvedValue<T>(settled: PromiseSettledResult<T>, assert: true): T\nfunction resolvedValue<T>(settled: PromiseSettledResult<T>, assert?: false): T | undefined\nfunction resolvedValue<T>(settled: PromiseSettledResult<T>, assert?: boolean) {\n if (assert && settled.status === 'rejected') {\n throw settled.reason\n }\n return settled.status === 'fulfilled' ? settled.value : undefined\n}\n\nexport class CryptoNftCollectionWitness<TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams> extends AbstractWitness<\n TParams,\n NftCollectionWitnessQuery,\n NftCollectionInfo\n> {\n static override configSchemas = [NftCollectionWitnessConfigSchema]\n\n protected providers: Record<number, WebSocketProvider | InfuraProvider> = {}\n\n protected getProvider(chainId: number) {\n this.providers[chainId] = this.providers[chainId] ?? getProviderFromEnv(chainId)\n return this.providers[chainId]\n }\n\n protected override async observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]> {\n await this.started('throw')\n const queries = payloads?.filter(isNftCollectionWitnessQuery) ?? []\n const observations = await Promise.all(\n queries.map<Promise<NftCollectionInfo>>(async (query) => {\n const chainId = assertEx(query?.chainId || this.config.chainId, 'params.chainId is required')\n const provider = this.getProvider(chainId)\n const address = assertEx(\n EthAddress.parse(assertEx(query?.address || this.config.address, 'params.address is required')),\n 'Failed to parse params.address',\n ).toString()\n\n const erc721Enumerable = ERC721Enumerable__factory.connect(address, provider)\n\n const maxNfts = query?.maxNfts || defaultMaxNfts\n const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([\n await erc721Enumerable.name(),\n await erc721Enumerable.symbol(),\n (await erc721Enumerable.totalSupply()).toNumber(),\n await tokenTypes(erc721Enumerable),\n await this.writeArchivist(),\n ])\n const types = resolvedValue(typesSettled, true)\n const nfts = await getNftCollectionNfts(address, provider, types, maxNfts)\n const metrics = getNftCollectionMetrics(nfts)\n const archivist = resolvedValue(archivistSettled)\n const [sources] = await Promise.all([\n // Hash all the payloads\n Promise.all(nfts.map((nft) => PayloadHasher.hashAsync(nft))),\n // Insert them into the archivist if we have one\n archivist ? archivist.insert(nfts) : NoOp,\n ])\n const payload: NftCollectionInfo = {\n address,\n chainId,\n metrics,\n name: resolvedValue(name, true),\n schema: NftCollectionSchema,\n sources,\n symbol: resolvedValue(symbol, true),\n total: resolvedValue(total, true),\n type: types.at(0),\n types,\n }\n return payload\n }),\n )\n return observations.flat()\n }\n}\n","import { Distribution } from './distribution'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n array.forEach((item) => {\n for (const property in item) {\n if (Object.prototype.hasOwnProperty.call(item, property)) {\n const value = item[property as keyof T]\n if (value !== undefined && value !== null) {\n const valueString = value.toString()\n if (!distribution[property]) {\n distribution[property] = { [valueString]: 1 }\n } else if (!distribution[property]![valueString]) {\n ;(distribution[property] as Record<string, number>)[valueString] = 1\n } else {\n ;(distribution[property] as Record<string, number>)[valueString] += 1\n }\n }\n }\n }\n })\n\n return distribution\n}\n","import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin'\n\n/**\n * Calculates the parameters of a binomial distribution given the number of trials and success probability\n * @param n Number of trials\n * @param p Success probability\n * @returns The binomial distribution parameters\n */\nexport const calculateBinomialParamsFromProbability = (n: number, p: number): BinomialDistributionParameters => {\n // Mean (µ)\n const mean = n * p\n\n // Variance (σ^2)\n const variance = n * p * (1 - p)\n\n // Standard Deviation (σ)\n const stdDev = Math.sqrt(variance)\n\n return { mean, p, stdDev, variance }\n}\n","import { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib'\n\ntype TraitDistributionEntry = [string, { [key: string]: number }]\n\nexport const getNftCollectionMetrics = (nfts: NftInfoFields[]): NftCollectionMetrics => {\n const traits = nfts\n .map((nft) => nft?.metadata?.attributes as OpenSeaNftAttribute[] | undefined)\n .filter((v): v is OpenSeaNftAttribute[] => v !== undefined)\n .map((attributes) => {\n return Object.fromEntries(attributes.map((attribute) => [attribute.trait_type, attribute.value]))\n })\n const distribution = calculateAllPropertiesDistribution(traits)\n const n = nfts.length\n const attributes = Object.fromEntries(\n Object.entries(distribution)\n .filter((v): v is TraitDistributionEntry => v[1] !== undefined)\n .map(([trait, entries]) => {\n const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0)\n const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n)\n const values = Object.fromEntries(\n Object.entries(entries).map(([value, traitValueCount]) => {\n const { p } = calculateBinomialParamsFromProbability(n, traitValueCount / n)\n const metrics: NftTraitMetrics = { binomial: { p }, count: traitValueCount }\n return [value, metrics]\n }),\n )\n return [trait, { metrics: { binomial: { p }, count: traitCount }, values }]\n }),\n )\n return { metadata: { attributes } }\n}\n","import { JsonRpcProvider } from '@ethersproject/providers'\nimport { AxiosJson } from '@xyo-network/axios'\nimport { NftInfo, NftMetadata, NftSchema, TokenType, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory } from '@xyo-network/open-zeppelin-typechain'\n\nimport { nonEvaluableContractAddresses } from './nonEvaluableContractAddresses'\nimport { tokenTypes } from './tokenTypes'\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\n/**\n * Returns the equivalent IPFS gateway URL for the supplied URL.\n * @param urlToCheck The URL to check\n * @returns If the supplied URL is an IPFS URL, it converts the URL to the\n * equivalent IPFS gateway URL. Otherwise, returns the original URL.\n */\nexport const checkIpfsUrl = (urlToCheck: string, ipfsGateway: string) => {\n const url = new URL(urlToCheck)\n let protocol = url.protocol\n let host = url.host\n let path = url.pathname\n const query = url.search\n if (protocol === 'ipfs:') {\n protocol = 'https:'\n host = ipfsGateway\n path = url.host === 'ipfs' ? `ipfs${path}` : `ipfs/${url.host}${path}`\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else {\n return urlToCheck\n }\n}\n\nexport const getNftCollectionNfts = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: string,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: JsonRpcProvider,\n types?: TokenType[],\n /**\n * The maximum number of NFTs to return. Configurable to prevent\n * large wallets from exhausting Infura API credits. Ideally a\n * multiple of 100 as that appears to be the default page size.\n */\n maxNfts = 100,\n): Promise<NftInfo[]> => {\n if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {\n throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`)\n }\n const axios = new AxiosJson({ timeout: 2000 })\n const enumerable = ERC721Enumerable__factory.connect(contractAddress, provider)\n const storage = ERC721URIStorage__factory.connect(contractAddress, provider)\n const supply1155 = ERC1155Supply__factory.connect(contractAddress, provider)\n const finalTypes = types ?? (await tokenTypes(enumerable))\n const result: NftInfo[] = []\n\n for (let i = 0; i < maxNfts; i++) {\n console.log(`Getting Token [${i}]`)\n const tokenId = (await enumerable.tokenByIndex(i)).toHexString()\n const supply = finalTypes.includes(toTokenType('ERC1155')) ? (await supply1155.totalSupply(tokenId)).toHexString() : '0x01'\n const metadataUri = await storage.tokenURI(tokenId)\n const checkedMetaDataUri = checkIpfsUrl(metadataUri, ipfsGateway)\n let metadata: NftMetadata | undefined = undefined\n try {\n metadata = (await axios.get(checkedMetaDataUri)).data\n } catch (ex) {\n const error = ex as Error\n console.error(error.message)\n }\n\n const info: NftInfo = {\n address: contractAddress,\n chainId: provider.network.chainId,\n metadata,\n metadataUri,\n schema: NftSchema,\n supply,\n tokenId,\n type: finalTypes.at(0),\n types,\n }\n result.push(info)\n }\n return result\n}\n","/**\n * These contracts are not evaluable for some\n * reason (too large, nonsensical, etc.)\n */\nexport const nonEvaluableContractAddresses = [\n // ENS\n '0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72',\n].map((address) => address.toUpperCase())\n","import { Interface } from '@ethersproject/abi'\nimport { Contract } from '@ethersproject/contracts'\nimport { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC1155URIStorage__factory, IERC721Metadata__factory } from '@xyo-network/open-zeppelin-typechain'\n\nexport const isErc1155 = async (contract: Contract) => {\n return await hasFunctions(contract, ERC1155URIStorage__factory.createInterface(), ['uri'])\n}\n\nexport const isErc721 = async (contract: Contract) => {\n return await hasFunctions(contract, IERC721Metadata__factory.createInterface(), ['name', 'symbol', 'tokenURI'])\n}\n\nexport const hasFunctions = async (contract: Contract, contractInterface: Interface, functionNames: string[]) => {\n const bytecode = await contract.provider.getCode(contract.address)\n for (let i = 0; i < functionNames.length; i++) {\n const nameSig = contractInterface.getSighash(functionNames[i]).substring(2)\n if (!bytecode.includes(nameSig)) {\n return false\n }\n return true\n }\n return false\n}\n\nexport const tokenTypes = async (contract: Contract) => {\n const [erc721, erc1155] = await Promise.all([isErc721(contract), isErc1155(contract)])\n const result: TokenType[] = []\n if (erc721) {\n result.push('ERC721')\n }\n if (erc1155) {\n result.push('ERC1155')\n }\n return result\n}\n","import { InfuraProvider, WebSocketProvider } from '@ethersproject/providers'\n\nexport const getProviderFromEnv = (chainId: string | number = 'homestead') => {\n const infuraWssUri = process.env.INFURA_WSS_URI\n const infuraProvider = new InfuraProvider('homestead', {\n projectId: process.env.INFURA_PROJECT_ID,\n projectSecret: process.env.INFURA_PROJECT_SECRET,\n })\n\n const infuraWebsocketProvider = infuraWssUri ? new WebSocketProvider(infuraWssUri, chainId) : undefined\n\n const quickNodeUri = process.env.QUICKNODE_WSS_URI\n const quickNodeProvider = quickNodeUri ? new WebSocketProvider(quickNodeUri, chainId) : undefined\n\n const provider = infuraWebsocketProvider ?? infuraProvider ?? infuraWebsocketProvider ?? quickNodeProvider ?? infuraProvider\n return provider\n}\n","import { CryptoNftCollectionWitnessPlugin } from './Plugin'\n\nexport * from './lib'\nexport * from './Witness'\n\nexport { CryptoNftCollectionWitnessPlugin }\n\n// eslint-disable-next-line import/no-default-export\nexport default CryptoNftCollectionWitnessPlugin\n"],"mappings":"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","names":["NftSchema","ERC721Enumerable__factory","attributes","p","ipfsGateway","ERC721Enumerable__factory","NftSchema"]}
@@ -1,4 +1,5 @@
1
- import { NftInfo } from '@xyo-network/crypto-nft-payload-plugin';
1
+ import { JsonRpcProvider } from '@ethersproject/providers';
2
+ import { NftInfo, TokenType } from '@xyo-network/crypto-nft-payload-plugin';
2
3
  /**
3
4
  * Returns the equivalent IPFS gateway URL for the supplied URL.
4
5
  * @param urlToCheck The URL to check
@@ -6,5 +7,5 @@ import { NftInfo } from '@xyo-network/crypto-nft-payload-plugin';
6
7
  * equivalent IPFS gateway URL. Otherwise, returns the original URL.
7
8
  */
8
9
  export declare const checkIpfsUrl: (urlToCheck: string, ipfsGateway: string) => string;
9
- export declare const getNftCollectionNfts: (contractAddress: string, chainId: number, maxNfts?: number) => Promise<NftInfo[]>;
10
+ export declare const getNftCollectionNfts: (contractAddress: string, provider: JsonRpcProvider, types?: TokenType[], maxNfts?: number) => Promise<NftInfo[]>;
10
11
  //# sourceMappingURL=getNftCollectionNfts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getNftCollectionNfts.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionNfts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAuC,MAAM,wCAAwC,CAAA;AASrG;;;;;GAKG;AACH,eAAO,MAAM,YAAY,eAAgB,MAAM,eAAe,MAAM,WAenE,CAAA;AAED,eAAO,MAAM,oBAAoB,oBAId,MAAM,WAId,MAAM,uBAOd,QAAQ,OAAO,EAAE,CAsCnB,CAAA"}
1
+ {"version":3,"file":"getNftCollectionNfts.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionNfts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE1D,OAAO,EAAE,OAAO,EAA0B,SAAS,EAAe,MAAM,wCAAwC,CAAA;AAQhH;;;;;GAKG;AACH,eAAO,MAAM,YAAY,eAAgB,MAAM,eAAe,MAAM,WAenE,CAAA;AAED,eAAO,MAAM,oBAAoB,oBAId,MAAM,YAIb,eAAe,UACjB,SAAS,EAAE,uBAOlB,QAAQ,OAAO,EAAE,CAuCnB,CAAA"}
@@ -1,4 +1,5 @@
1
- import { NftInfo } from '@xyo-network/crypto-nft-payload-plugin';
1
+ import { JsonRpcProvider } from '@ethersproject/providers';
2
+ import { NftInfo, TokenType } from '@xyo-network/crypto-nft-payload-plugin';
2
3
  /**
3
4
  * Returns the equivalent IPFS gateway URL for the supplied URL.
4
5
  * @param urlToCheck The URL to check
@@ -6,5 +7,5 @@ import { NftInfo } from '@xyo-network/crypto-nft-payload-plugin';
6
7
  * equivalent IPFS gateway URL. Otherwise, returns the original URL.
7
8
  */
8
9
  export declare const checkIpfsUrl: (urlToCheck: string, ipfsGateway: string) => string;
9
- export declare const getNftCollectionNfts: (contractAddress: string, chainId: number, maxNfts?: number) => Promise<NftInfo[]>;
10
+ export declare const getNftCollectionNfts: (contractAddress: string, provider: JsonRpcProvider, types?: TokenType[], maxNfts?: number) => Promise<NftInfo[]>;
10
11
  //# sourceMappingURL=getNftCollectionNfts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getNftCollectionNfts.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionNfts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAuC,MAAM,wCAAwC,CAAA;AASrG;;;;;GAKG;AACH,eAAO,MAAM,YAAY,eAAgB,MAAM,eAAe,MAAM,WAenE,CAAA;AAED,eAAO,MAAM,oBAAoB,oBAId,MAAM,WAId,MAAM,uBAOd,QAAQ,OAAO,EAAE,CAsCnB,CAAA"}
1
+ {"version":3,"file":"getNftCollectionNfts.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionNfts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE1D,OAAO,EAAE,OAAO,EAA0B,SAAS,EAAe,MAAM,wCAAwC,CAAA;AAQhH;;;;;GAKG;AACH,eAAO,MAAM,YAAY,eAAgB,MAAM,eAAe,MAAM,WAenE,CAAA;AAED,eAAO,MAAM,oBAAoB,oBAId,MAAM,YAIb,eAAe,UACjB,SAAS,EAAE,uBAOlB,QAAQ,OAAO,EAAE,CAuCnB,CAAA"}
@@ -1,4 +1,5 @@
1
- import { NftInfo } from '@xyo-network/crypto-nft-payload-plugin';
1
+ import { JsonRpcProvider } from '@ethersproject/providers';
2
+ import { NftInfo, TokenType } from '@xyo-network/crypto-nft-payload-plugin';
2
3
  /**
3
4
  * Returns the equivalent IPFS gateway URL for the supplied URL.
4
5
  * @param urlToCheck The URL to check
@@ -6,5 +7,5 @@ import { NftInfo } from '@xyo-network/crypto-nft-payload-plugin';
6
7
  * equivalent IPFS gateway URL. Otherwise, returns the original URL.
7
8
  */
8
9
  export declare const checkIpfsUrl: (urlToCheck: string, ipfsGateway: string) => string;
9
- export declare const getNftCollectionNfts: (contractAddress: string, chainId: number, maxNfts?: number) => Promise<NftInfo[]>;
10
+ export declare const getNftCollectionNfts: (contractAddress: string, provider: JsonRpcProvider, types?: TokenType[], maxNfts?: number) => Promise<NftInfo[]>;
10
11
  //# sourceMappingURL=getNftCollectionNfts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getNftCollectionNfts.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionNfts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAuC,MAAM,wCAAwC,CAAA;AASrG;;;;;GAKG;AACH,eAAO,MAAM,YAAY,eAAgB,MAAM,eAAe,MAAM,WAenE,CAAA;AAED,eAAO,MAAM,oBAAoB,oBAId,MAAM,WAId,MAAM,uBAOd,QAAQ,OAAO,EAAE,CAsCnB,CAAA"}
1
+ {"version":3,"file":"getNftCollectionNfts.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionNfts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE1D,OAAO,EAAE,OAAO,EAA0B,SAAS,EAAe,MAAM,wCAAwC,CAAA;AAQhH;;;;;GAKG;AACH,eAAO,MAAM,YAAY,eAAgB,MAAM,eAAe,MAAM,WAenE,CAAA;AAED,eAAO,MAAM,oBAAoB,oBAId,MAAM,YAIb,eAAe,UACjB,SAAS,EAAE,uBAOlB,QAAQ,OAAO,EAAE,CAuCnB,CAAA"}
@@ -1,3 +1,3 @@
1
1
  import { InfuraProvider, WebSocketProvider } from '@ethersproject/providers';
2
2
  export declare const getProviderFromEnv: (chainId?: string | number) => WebSocketProvider | InfuraProvider;
3
- //# sourceMappingURL=getProvider.d.ts.map
3
+ //# sourceMappingURL=getProviderFromEnv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getProviderFromEnv.d.ts","sourceRoot":"","sources":["../../../src/lib/getProviderFromEnv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5E,eAAO,MAAM,kBAAkB,aAAa,MAAM,GAAG,MAAM,uCAc1D,CAAA"}
@@ -1,3 +1,3 @@
1
1
  import { InfuraProvider, WebSocketProvider } from '@ethersproject/providers';
2
2
  export declare const getProviderFromEnv: (chainId?: string | number) => WebSocketProvider | InfuraProvider;
3
- //# sourceMappingURL=getProvider.d.ts.map
3
+ //# sourceMappingURL=getProviderFromEnv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getProviderFromEnv.d.ts","sourceRoot":"","sources":["../../../src/lib/getProviderFromEnv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5E,eAAO,MAAM,kBAAkB,aAAa,MAAM,GAAG,MAAM,uCAc1D,CAAA"}
@@ -1,3 +1,3 @@
1
1
  import { InfuraProvider, WebSocketProvider } from '@ethersproject/providers';
2
2
  export declare const getProviderFromEnv: (chainId?: string | number) => WebSocketProvider | InfuraProvider;
3
- //# sourceMappingURL=getProvider.d.ts.map
3
+ //# sourceMappingURL=getProviderFromEnv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getProviderFromEnv.d.ts","sourceRoot":"","sources":["../../../src/lib/getProviderFromEnv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5E,eAAO,MAAM,kBAAkB,aAAa,MAAM,GAAG,MAAM,uCAc1D,CAAA"}
@@ -1,5 +1,5 @@
1
1
  export * from './collectionMetrics';
2
- export * from './getNftCollectionCount';
3
- export * from './getNftCollectionMetadata';
4
2
  export * from './getNftCollectionNfts';
3
+ export * from './getProviderFromEnv';
4
+ export * from './tokenTypes';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,wBAAwB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA"}
@@ -1,5 +1,5 @@
1
1
  export * from './collectionMetrics';
2
- export * from './getNftCollectionCount';
3
- export * from './getNftCollectionMetadata';
4
2
  export * from './getNftCollectionNfts';
3
+ export * from './getProviderFromEnv';
4
+ export * from './tokenTypes';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,wBAAwB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA"}
@@ -1,5 +1,5 @@
1
1
  export * from './collectionMetrics';
2
- export * from './getNftCollectionCount';
3
- export * from './getNftCollectionMetadata';
4
2
  export * from './getNftCollectionNfts';
3
+ export * from './getProviderFromEnv';
4
+ export * from './tokenTypes';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,wBAAwB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { Interface } from '@ethersproject/abi';
2
+ import { Contract } from '@ethersproject/contracts';
3
+ import { TokenType } from '@xyo-network/crypto-nft-payload-plugin';
4
+ export declare const isErc1155: (contract: Contract) => Promise<boolean>;
5
+ export declare const isErc721: (contract: Contract) => Promise<boolean>;
6
+ export declare const hasFunctions: (contract: Contract, contractInterface: Interface, functionNames: string[]) => Promise<boolean>;
7
+ export declare const tokenTypes: (contract: Contract) => Promise<TokenType[]>;
8
+ //# sourceMappingURL=tokenTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenTypes.d.ts","sourceRoot":"","sources":["../../../src/lib/tokenTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAGlE,eAAO,MAAM,SAAS,aAAoB,QAAQ,qBAEjD,CAAA;AAED,eAAO,MAAM,QAAQ,aAAoB,QAAQ,qBAEhD,CAAA;AAED,eAAO,MAAM,YAAY,aAAoB,QAAQ,qBAAqB,SAAS,iBAAiB,MAAM,EAAE,qBAU3G,CAAA;AAED,eAAO,MAAM,UAAU,aAAoB,QAAQ,yBAUlD,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { Interface } from '@ethersproject/abi';
2
+ import { Contract } from '@ethersproject/contracts';
3
+ import { TokenType } from '@xyo-network/crypto-nft-payload-plugin';
4
+ export declare const isErc1155: (contract: Contract) => Promise<boolean>;
5
+ export declare const isErc721: (contract: Contract) => Promise<boolean>;
6
+ export declare const hasFunctions: (contract: Contract, contractInterface: Interface, functionNames: string[]) => Promise<boolean>;
7
+ export declare const tokenTypes: (contract: Contract) => Promise<TokenType[]>;
8
+ //# sourceMappingURL=tokenTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenTypes.d.ts","sourceRoot":"","sources":["../../../src/lib/tokenTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAGlE,eAAO,MAAM,SAAS,aAAoB,QAAQ,qBAEjD,CAAA;AAED,eAAO,MAAM,QAAQ,aAAoB,QAAQ,qBAEhD,CAAA;AAED,eAAO,MAAM,YAAY,aAAoB,QAAQ,qBAAqB,SAAS,iBAAiB,MAAM,EAAE,qBAU3G,CAAA;AAED,eAAO,MAAM,UAAU,aAAoB,QAAQ,yBAUlD,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { Interface } from '@ethersproject/abi';
2
+ import { Contract } from '@ethersproject/contracts';
3
+ import { TokenType } from '@xyo-network/crypto-nft-payload-plugin';
4
+ export declare const isErc1155: (contract: Contract) => Promise<boolean>;
5
+ export declare const isErc721: (contract: Contract) => Promise<boolean>;
6
+ export declare const hasFunctions: (contract: Contract, contractInterface: Interface, functionNames: string[]) => Promise<boolean>;
7
+ export declare const tokenTypes: (contract: Contract) => Promise<TokenType[]>;
8
+ //# sourceMappingURL=tokenTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenTypes.d.ts","sourceRoot":"","sources":["../../../src/lib/tokenTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAGlE,eAAO,MAAM,SAAS,aAAoB,QAAQ,qBAEjD,CAAA;AAED,eAAO,MAAM,QAAQ,aAAoB,QAAQ,qBAEhD,CAAA;AAED,eAAO,MAAM,YAAY,aAAoB,QAAQ,qBAAqB,SAAS,iBAAiB,MAAM,EAAE,qBAU3G,CAAA;AAED,eAAO,MAAM,UAAU,aAAoB,QAAQ,yBAUlD,CAAA"}
@@ -52,5 +52,7 @@ export declare const CryptoNftCollectionWitnessPlugin: () => import("@xyo-networ
52
52
  };
53
53
  ephemeralQueryAccountEnabled?: boolean | undefined;
54
54
  wallet?: import("@xyo-network/wallet-model").WalletInstance | undefined;
55
+ } & {
56
+ provider: import("@ethersproject/abstract-provider").Provider;
55
57
  }>>;
56
58
  //# sourceMappingURL=Plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAA;AAEtD,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAS1C,CAAA"}
1
+ {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAA;AAEtD,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAS1C,CAAA"}
@@ -52,5 +52,7 @@ export declare const CryptoNftCollectionWitnessPlugin: () => import("@xyo-networ
52
52
  };
53
53
  ephemeralQueryAccountEnabled?: boolean | undefined;
54
54
  wallet?: import("@xyo-network/wallet-model").WalletInstance | undefined;
55
+ } & {
56
+ provider: import("@ethersproject/abstract-provider").Provider;
55
57
  }>>;
56
58
  //# sourceMappingURL=Plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAA;AAEtD,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAS1C,CAAA"}
1
+ {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAA;AAEtD,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAS1C,CAAA"}
@@ -52,5 +52,7 @@ export declare const CryptoNftCollectionWitnessPlugin: () => import("@xyo-networ
52
52
  };
53
53
  ephemeralQueryAccountEnabled?: boolean | undefined;
54
54
  wallet?: import("@xyo-network/wallet-model").WalletInstance | undefined;
55
+ } & {
56
+ provider: import("@ethersproject/abstract-provider").Provider;
55
57
  }>>;
56
58
  //# sourceMappingURL=Plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAA;AAEtD,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAS1C,CAAA"}
1
+ {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAA;AAEtD,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAS1C,CAAA"}