@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) => {
@@ -74,23 +75,10 @@ var getNftCollectionMetrics = (nfts) => {
74
75
  return { metadata: { attributes } };
75
76
  };
76
77
 
77
- // src/lib/getNftCollectionCount.ts
78
- import { ERC721Enumerable__factory } from "@xyo-network/open-zeppelin-typechain";
79
-
80
- // src/lib/getProvider.ts
81
- import { InfuraProvider, WebSocketProvider } from "@ethersproject/providers";
82
- var getProviderFromEnv = (chainId = "homestead") => {
83
- const infuraWssUri = process.env.INFURA_WSS_URI;
84
- const infuraProvider = new InfuraProvider("homestead", {
85
- projectId: process.env.INFURA_PROJECT_ID,
86
- projectSecret: process.env.INFURA_PROJECT_SECRET
87
- });
88
- const infuraWebsocketProvider = infuraWssUri ? new WebSocketProvider(infuraWssUri, chainId) : void 0;
89
- const quickNodeUri = process.env.QUICKNODE_WSS_URI;
90
- const quickNodeProvider = quickNodeUri ? new WebSocketProvider(quickNodeUri, chainId) : void 0;
91
- const provider = infuraWebsocketProvider ?? infuraProvider ?? infuraWebsocketProvider ?? quickNodeProvider ?? infuraProvider;
92
- return provider;
93
- };
78
+ // src/lib/getNftCollectionNfts.ts
79
+ import { AxiosJson } from "@xyo-network/axios";
80
+ import { NftSchema, toTokenType } from "@xyo-network/crypto-nft-payload-plugin";
81
+ import { ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory } from "@xyo-network/open-zeppelin-typechain";
94
82
 
95
83
  // src/lib/nonEvaluableContractAddresses.ts
96
84
  var nonEvaluableContractAddresses = [
@@ -98,63 +86,38 @@ var nonEvaluableContractAddresses = [
98
86
  "0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72"
99
87
  ].map((address) => address.toUpperCase());
100
88
 
101
- // src/lib/getNftCollectionCount.ts
102
- var getNftCollectionCount = async (contractAddress, chainId) => {
103
- if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {
104
- throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`);
105
- }
106
- const provider = getProviderFromEnv(chainId);
107
- const contract = ERC721Enumerable__factory.connect(contractAddress, provider);
108
- return (await contract.totalSupply()).toNumber();
89
+ // src/lib/tokenTypes.ts
90
+ import { ERC1155URIStorage__factory, IERC721Metadata__factory } from "@xyo-network/open-zeppelin-typechain";
91
+ var isErc1155 = async (contract) => {
92
+ return await hasFunctions(contract, ERC1155URIStorage__factory.createInterface(), ["uri"]);
109
93
  };
110
-
111
- // src/lib/getNftCollectionMetadata.ts
112
- import { ERC721Enumerable__factory as ERC721Enumerable__factory2, ERC1155__factory } from "@xyo-network/open-zeppelin-typechain";
113
- import { constants } from "ethers";
114
- function getInterfaceID(contractInterface) {
115
- let interfaceID = constants.Zero;
116
- const functions = Object.keys(contractInterface.functions);
117
- for (let i = 0; i < functions.length; i++) {
118
- interfaceID = interfaceID.xor(contractInterface.getSighash(functions[i]));
119
- }
120
- return interfaceID.toHexString();
121
- }
122
- var getNftCollectionMetadata = async (contractAddress, chainId) => {
123
- if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {
124
- throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`);
125
- }
126
- const provider = getProviderFromEnv(chainId);
127
- const contract721 = ERC721Enumerable__factory2.connect(contractAddress, provider);
128
- const contract1155 = ERC1155__factory.connect(contractAddress, provider);
129
- let name = "";
130
- try {
131
- name = await contract721.name();
132
- } catch (ex) {
133
- const error = ex;
134
- console.log(`name: ${error.message}`);
94
+ var isErc721 = async (contract) => {
95
+ return await hasFunctions(contract, IERC721Metadata__factory.createInterface(), ["name", "symbol", "tokenURI"]);
96
+ };
97
+ var hasFunctions = async (contract, contractInterface, functionNames) => {
98
+ const bytecode = await contract.provider.getCode(contract.address);
99
+ for (let i = 0; i < functionNames.length; i++) {
100
+ const nameSig = contractInterface.getSighash(functionNames[i]).substring(2);
101
+ if (!bytecode.includes(nameSig)) {
102
+ return false;
103
+ }
104
+ return true;
135
105
  }
136
- let symbol = "";
137
- try {
138
- symbol = await contract721.symbol();
139
- } catch (ex) {
140
- const error = ex;
141
- console.log(`symbol: ${error.message}`);
106
+ return false;
107
+ };
108
+ var tokenTypes = async (contract) => {
109
+ const [erc721, erc1155] = await Promise.all([isErc721(contract), isErc1155(contract)]);
110
+ const result = [];
111
+ if (erc721) {
112
+ result.push("ERC721");
142
113
  }
143
- let is1155 = false;
144
- try {
145
- is1155 = await contract1155.supportsInterface(getInterfaceID(ERC1155__factory.getInterface(ERC1155__factory.abi)));
146
- } catch (ex) {
147
- const error = ex;
148
- console.log(`is1155: ${error.message}`);
149
- is1155 = false;
114
+ if (erc1155) {
115
+ result.push("ERC1155");
150
116
  }
151
- return { address: contractAddress, chainId, name, symbol, type: is1155 ? "ERC1155" : "ERC721" };
117
+ return result;
152
118
  };
153
119
 
154
120
  // src/lib/getNftCollectionNfts.ts
155
- import { AxiosJson } from "@xyo-network/axios";
156
- import { NftSchema, toTokenType } from "@xyo-network/crypto-nft-payload-plugin";
157
- import { ERC721Enumerable__factory as ERC721Enumerable__factory3, ERC721URIStorage__factory, ERC1155Supply__factory } from "@xyo-network/open-zeppelin-typechain";
158
121
  var ipfsGateway = "5d7b6582.beta.decentralnetworkservices.com";
159
122
  var checkIpfsUrl = (urlToCheck, ipfsGateway2) => {
160
123
  const url = new URL(urlToCheck);
@@ -172,20 +135,20 @@ var checkIpfsUrl = (urlToCheck, ipfsGateway2) => {
172
135
  return urlToCheck;
173
136
  }
174
137
  };
175
- var getNftCollectionNfts = async (contractAddress, chainId, maxNfts = 100) => {
138
+ var getNftCollectionNfts = async (contractAddress, provider, types, maxNfts = 100) => {
176
139
  if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {
177
140
  throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`);
178
141
  }
179
142
  const axios = new AxiosJson({ timeout: 2e3 });
180
- const provider = getProviderFromEnv(chainId);
181
- const enumerable = ERC721Enumerable__factory3.connect(contractAddress, provider);
143
+ const enumerable = ERC721Enumerable__factory.connect(contractAddress, provider);
182
144
  const storage = ERC721URIStorage__factory.connect(contractAddress, provider);
183
145
  const supply1155 = ERC1155Supply__factory.connect(contractAddress, provider);
146
+ const finalTypes = types ?? await tokenTypes(enumerable);
184
147
  const result = [];
185
- const { type: nftType } = await getNftCollectionMetadata(contractAddress, chainId);
186
148
  for (let i = 0; i < maxNfts; i++) {
149
+ console.log(`Getting Token [${i}]`);
187
150
  const tokenId = (await enumerable.tokenByIndex(i)).toHexString();
188
- const supply = nftType === toTokenType("ERC11155") ? (await supply1155.totalSupply(tokenId)).toHexString() : "0x01";
151
+ const supply = finalTypes.includes(toTokenType("ERC1155")) ? (await supply1155.totalSupply(tokenId)).toHexString() : "0x01";
189
152
  const metadataUri = await storage.tokenURI(tokenId);
190
153
  const checkedMetaDataUri = checkIpfsUrl(metadataUri, ipfsGateway);
191
154
  let metadata = void 0;
@@ -197,49 +160,93 @@ var getNftCollectionNfts = async (contractAddress, chainId, maxNfts = 100) => {
197
160
  }
198
161
  const info = {
199
162
  address: contractAddress,
200
- chainId,
163
+ chainId: provider.network.chainId,
201
164
  metadata,
202
165
  metadataUri,
203
166
  schema: NftSchema,
204
167
  supply,
205
168
  tokenId,
206
- type: nftType
169
+ type: finalTypes.at(0),
170
+ types
207
171
  };
208
172
  result.push(info);
209
173
  }
210
174
  return result;
211
175
  };
212
176
 
177
+ // src/lib/getProviderFromEnv.ts
178
+ import { InfuraProvider, WebSocketProvider } from "@ethersproject/providers";
179
+ var getProviderFromEnv = (chainId = "homestead") => {
180
+ const infuraWssUri = process.env.INFURA_WSS_URI;
181
+ const infuraProvider = new InfuraProvider("homestead", {
182
+ projectId: process.env.INFURA_PROJECT_ID,
183
+ projectSecret: process.env.INFURA_PROJECT_SECRET
184
+ });
185
+ const infuraWebsocketProvider = infuraWssUri ? new WebSocketProvider(infuraWssUri, chainId) : void 0;
186
+ const quickNodeUri = process.env.QUICKNODE_WSS_URI;
187
+ const quickNodeProvider = quickNodeUri ? new WebSocketProvider(quickNodeUri, chainId) : void 0;
188
+ const provider = infuraWebsocketProvider ?? infuraProvider ?? infuraWebsocketProvider ?? quickNodeProvider ?? infuraProvider;
189
+ return provider;
190
+ };
191
+
213
192
  // src/Witness.ts
214
193
  var defaultMaxNfts = 100;
215
194
  var NoOp = Promise.resolve();
195
+ function resolvedValue(settled, assert) {
196
+ if (assert && settled.status === "rejected") {
197
+ throw settled.reason;
198
+ }
199
+ return settled.status === "fulfilled" ? settled.value : void 0;
200
+ }
216
201
  var CryptoNftCollectionWitness = class extends AbstractWitness {
217
202
  static configSchemas = [NftCollectionWitnessConfigSchema];
203
+ providers = {};
204
+ getProvider(chainId) {
205
+ this.providers[chainId] = this.providers[chainId] ?? getProviderFromEnv(chainId);
206
+ return this.providers[chainId];
207
+ }
218
208
  async observeHandler(payloads) {
219
209
  await this.started("throw");
220
210
  const queries = (payloads == null ? void 0 : payloads.filter(isNftCollectionWitnessQuery)) ?? [];
221
211
  const observations = await Promise.all(
222
212
  queries.map(async (query) => {
213
+ const chainId = assertEx((query == null ? void 0 : query.chainId) || this.config.chainId, "params.chainId is required");
214
+ const provider = this.getProvider(chainId);
223
215
  const address = assertEx(
224
216
  EthAddress.parse(assertEx((query == null ? void 0 : query.address) || this.config.address, "params.address is required")),
225
217
  "Failed to parse params.address"
226
218
  ).toString();
227
- const chainId = assertEx((query == null ? void 0 : query.chainId) || this.config.chainId, "params.chainId is required");
219
+ const erc721Enumerable = ERC721Enumerable__factory2.connect(address, provider);
228
220
  const maxNfts = (query == null ? void 0 : query.maxNfts) || defaultMaxNfts;
229
- const [info, total, nfts, archivist] = await Promise.all([
230
- getNftCollectionMetadata(address, chainId),
231
- getNftCollectionCount(address, chainId),
232
- getNftCollectionNfts(address, chainId, maxNfts),
233
- this.writeArchivist()
221
+ const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([
222
+ await erc721Enumerable.name(),
223
+ await erc721Enumerable.symbol(),
224
+ (await erc721Enumerable.totalSupply()).toNumber(),
225
+ await tokenTypes(erc721Enumerable),
226
+ await this.writeArchivist()
234
227
  ]);
228
+ const types = resolvedValue(typesSettled, true);
229
+ const nfts = await getNftCollectionNfts(address, provider, types, maxNfts);
235
230
  const metrics = getNftCollectionMetrics(nfts);
231
+ const archivist = resolvedValue(archivistSettled);
236
232
  const [sources] = await Promise.all([
237
233
  // Hash all the payloads
238
234
  Promise.all(nfts.map((nft) => PayloadHasher.hashAsync(nft))),
239
235
  // Insert them into the archivist if we have one
240
236
  archivist ? archivist.insert(nfts) : NoOp
241
237
  ]);
242
- const payload = { ...info, metrics, schema: NftCollectionSchema, sources, total };
238
+ const payload = {
239
+ address,
240
+ chainId,
241
+ metrics,
242
+ name: resolvedValue(name, true),
243
+ schema: NftCollectionSchema,
244
+ sources,
245
+ symbol: resolvedValue(symbol, true),
246
+ total: resolvedValue(total, true),
247
+ type: types.at(0),
248
+ types
249
+ };
243
250
  return payload;
244
251
  })
245
252
  );
@@ -265,10 +272,12 @@ export {
265
272
  CryptoNftCollectionWitnessPlugin,
266
273
  checkIpfsUrl,
267
274
  src_default as default,
268
- getInterfaceID,
269
- getNftCollectionCount,
270
- getNftCollectionMetadata,
271
275
  getNftCollectionMetrics,
272
- getNftCollectionNfts
276
+ getNftCollectionNfts,
277
+ getProviderFromEnv,
278
+ hasFunctions,
279
+ isErc1155,
280
+ isErc721,
281
+ tokenTypes
273
282
  };
274
283
  //# sourceMappingURL=index.mjs.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"}
@@ -0,0 +1,3 @@
1
+ import { InfuraProvider, WebSocketProvider } from '@ethersproject/providers';
2
+ export declare const getProviderFromEnv: (chainId?: string | number) => WebSocketProvider | InfuraProvider;
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"}
@@ -0,0 +1,3 @@
1
+ import { InfuraProvider, WebSocketProvider } from '@ethersproject/providers';
2
+ export declare const getProviderFromEnv: (chainId?: string | number) => WebSocketProvider | InfuraProvider;
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"}
package/package.json CHANGED
@@ -11,23 +11,27 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "@ethersproject/abi": "^5.7.0",
14
+ "@ethersproject/contracts": "^5.7.0",
15
+ "@ethersproject/providers": "^5.7.2",
14
16
  "@xylabs/assert": "^2.13.3",
15
17
  "@xylabs/eth-address": "^2.13.3",
16
- "@xyo-network/abstract-witness": "~2.78.2",
17
- "@xyo-network/core": "~2.78.2",
18
- "@xyo-network/crypto-nft-collection-payload-plugin": "~2.78.2",
19
- "@xyo-network/crypto-nft-payload-plugin": "~2.78.2",
20
- "@xyo-network/module-model": "~2.78.2",
21
- "@xyo-network/payload-model": "~2.78.2",
22
- "@xyo-network/payloadset-plugin": "~2.78.2",
23
- "@xyo-network/witness-model": "~2.78.2"
18
+ "@xyo-network/abstract-witness": "~2.78.3",
19
+ "@xyo-network/axios": "~2.78.3",
20
+ "@xyo-network/core": "~2.78.3",
21
+ "@xyo-network/crypto-nft-collection-payload-plugin": "~2.78.3",
22
+ "@xyo-network/crypto-nft-payload-plugin": "~2.78.3",
23
+ "@xyo-network/module-model": "~2.78.3",
24
+ "@xyo-network/open-zeppelin-typechain": "^2.2.11",
25
+ "@xyo-network/payload-model": "~2.78.3",
26
+ "@xyo-network/payloadset-plugin": "~2.78.3",
27
+ "@xyo-network/witness-model": "~2.78.3"
24
28
  },
25
29
  "devDependencies": {
26
30
  "@xylabs/jest-helpers": "^2.13.3",
27
31
  "@xylabs/ts-scripts-yarn3": "^3.1.13",
28
32
  "@xylabs/tsconfig": "^3.1.13",
29
- "@xyo-network/account": "~2.78.2",
30
- "@xyo-network/account-model": "~2.78.2",
33
+ "@xyo-network/account": "~2.78.3",
34
+ "@xyo-network/account-model": "~2.78.3",
31
35
  "ethers": "^5.7.2",
32
36
  "jest": "^29.7.0",
33
37
  "typescript": "^5.2.2"
@@ -72,5 +76,5 @@
72
76
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
73
77
  },
74
78
  "sideEffects": false,
75
- "version": "2.78.2"
79
+ "version": "2.78.3"
76
80
  }