@xyo-network/crypto-nft-collection-witness-plugin 6.0.3 → 7.0.0

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 (90) hide show
  1. package/README.md +5 -0
  2. package/dist/neutral/Witness.d.ts.map +1 -1
  3. package/dist/neutral/index.mjs +23 -31
  4. package/dist/neutral/index.mjs.map +2 -2
  5. package/dist/neutral/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.ts.map +1 -1
  6. package/dist/neutral/lib/collectionMetrics/lib/calculatePropertyDistribution.d.ts.map +1 -1
  7. package/dist/neutral/lib/getNftCollectionNfts.d.ts.map +1 -1
  8. package/dist/neutral/lib/tokenTypes.d.ts +1 -2
  9. package/dist/neutral/lib/tokenTypes.d.ts.map +1 -1
  10. package/package.json +27 -28
  11. package/dist/browser/Plugin.d.ts +0 -4
  12. package/dist/browser/Plugin.d.ts.map +0 -1
  13. package/dist/browser/Witness.d.ts +0 -11
  14. package/dist/browser/Witness.d.ts.map +0 -1
  15. package/dist/browser/index.d.ts +0 -4
  16. package/dist/browser/index.d.ts.map +0 -1
  17. package/dist/browser/index.mjs +0 -289
  18. package/dist/browser/index.mjs.map +0 -7
  19. package/dist/browser/lib/collectionMetrics/getNftCollectionMetrics.d.ts +0 -4
  20. package/dist/browser/lib/collectionMetrics/getNftCollectionMetrics.d.ts.map +0 -1
  21. package/dist/browser/lib/collectionMetrics/index.d.ts +0 -2
  22. package/dist/browser/lib/collectionMetrics/index.d.ts.map +0 -1
  23. package/dist/browser/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.ts +0 -3
  24. package/dist/browser/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.ts.map +0 -1
  25. package/dist/browser/lib/collectionMetrics/lib/calculatePropertyDistribution.d.ts +0 -3
  26. package/dist/browser/lib/collectionMetrics/lib/calculatePropertyDistribution.d.ts.map +0 -1
  27. package/dist/browser/lib/collectionMetrics/lib/distribution.d.ts +0 -4
  28. package/dist/browser/lib/collectionMetrics/lib/distribution.d.ts.map +0 -1
  29. package/dist/browser/lib/collectionMetrics/lib/index.d.ts +0 -4
  30. package/dist/browser/lib/collectionMetrics/lib/index.d.ts.map +0 -1
  31. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.ts +0 -8
  32. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.ts.map +0 -1
  33. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.ts +0 -9
  34. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.ts.map +0 -1
  35. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.ts +0 -3
  36. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.ts.map +0 -1
  37. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/index.d.ts +0 -2
  38. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/index.d.ts.map +0 -1
  39. package/dist/browser/lib/contractHasFunctions.d.ts +0 -3
  40. package/dist/browser/lib/contractHasFunctions.d.ts.map +0 -1
  41. package/dist/browser/lib/getNftCollectionNfts.d.ts +0 -19
  42. package/dist/browser/lib/getNftCollectionNfts.d.ts.map +0 -1
  43. package/dist/browser/lib/index.d.ts +0 -5
  44. package/dist/browser/lib/index.d.ts.map +0 -1
  45. package/dist/browser/lib/nonEvaluableContractAddresses.d.ts +0 -6
  46. package/dist/browser/lib/nonEvaluableContractAddresses.d.ts.map +0 -1
  47. package/dist/browser/lib/tokenTypes.d.ts +0 -6
  48. package/dist/browser/lib/tokenTypes.d.ts.map +0 -1
  49. package/dist/browser/lib/tryCall.d.ts +0 -2
  50. package/dist/browser/lib/tryCall.d.ts.map +0 -1
  51. package/dist/node/Plugin.d.ts +0 -4
  52. package/dist/node/Plugin.d.ts.map +0 -1
  53. package/dist/node/Witness.d.ts +0 -11
  54. package/dist/node/Witness.d.ts.map +0 -1
  55. package/dist/node/index.d.ts +0 -4
  56. package/dist/node/index.d.ts.map +0 -1
  57. package/dist/node/index.mjs +0 -289
  58. package/dist/node/index.mjs.map +0 -7
  59. package/dist/node/lib/collectionMetrics/getNftCollectionMetrics.d.ts +0 -4
  60. package/dist/node/lib/collectionMetrics/getNftCollectionMetrics.d.ts.map +0 -1
  61. package/dist/node/lib/collectionMetrics/index.d.ts +0 -2
  62. package/dist/node/lib/collectionMetrics/index.d.ts.map +0 -1
  63. package/dist/node/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.ts +0 -3
  64. package/dist/node/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.ts.map +0 -1
  65. package/dist/node/lib/collectionMetrics/lib/calculatePropertyDistribution.d.ts +0 -3
  66. package/dist/node/lib/collectionMetrics/lib/calculatePropertyDistribution.d.ts.map +0 -1
  67. package/dist/node/lib/collectionMetrics/lib/distribution.d.ts +0 -4
  68. package/dist/node/lib/collectionMetrics/lib/distribution.d.ts.map +0 -1
  69. package/dist/node/lib/collectionMetrics/lib/index.d.ts +0 -4
  70. package/dist/node/lib/collectionMetrics/lib/index.d.ts.map +0 -1
  71. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.ts +0 -8
  72. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.ts.map +0 -1
  73. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.ts +0 -9
  74. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.ts.map +0 -1
  75. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.ts +0 -3
  76. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.ts.map +0 -1
  77. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/index.d.ts +0 -2
  78. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/index.d.ts.map +0 -1
  79. package/dist/node/lib/contractHasFunctions.d.ts +0 -3
  80. package/dist/node/lib/contractHasFunctions.d.ts.map +0 -1
  81. package/dist/node/lib/getNftCollectionNfts.d.ts +0 -19
  82. package/dist/node/lib/getNftCollectionNfts.d.ts.map +0 -1
  83. package/dist/node/lib/index.d.ts +0 -5
  84. package/dist/node/lib/index.d.ts.map +0 -1
  85. package/dist/node/lib/nonEvaluableContractAddresses.d.ts +0 -6
  86. package/dist/node/lib/nonEvaluableContractAddresses.d.ts.map +0 -1
  87. package/dist/node/lib/tokenTypes.d.ts +0 -6
  88. package/dist/node/lib/tokenTypes.d.ts.map +0 -1
  89. package/dist/node/lib/tryCall.d.ts +0 -2
  90. package/dist/node/lib/tryCall.d.ts.map +0 -1
package/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![logo][]](https://xyo.network)
2
+
1
3
  # @xyo-network/crypto-nft-collection-witness-plugin
2
4
 
3
5
  [![npm][npm-badge]][npm-link]
@@ -36,9 +38,12 @@ bun add {{name}}
36
38
 
37
39
  See the [LICENSE](LICENSE) file for license rights and limitations (LGPL-3.0-only).
38
40
 
41
+ ## Credits
39
42
 
43
+ [Made with 🔥 and ❄️ by XYO Foundation](https://xyo.network)
40
44
 
41
45
  [npm-badge]: https://img.shields.io/npm/v/@xyo-network/crypto-nft-collection-witness-plugin.svg
42
46
  [npm-link]: https://www.npmjs.com/package/@xyo-network/crypto-nft-collection-witness-plugin
43
47
  [license-badge]: https://img.shields.io/npm/l/@xyo-network/crypto-nft-collection-witness-plugin.svg
44
48
  [license-link]: https://github.com/xylabs/sdk-js/blob/main/LICENSE
49
+ [logo]: https://cdn.xy.company/img/brand/XYO_full_colored.png
@@ -1 +1 @@
1
- {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,mDAAmD,CAAA;AAO1D,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAA;AAE9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AAMtE,MAAM,MAAM,gCAAgC,GAAG,gBAAgB,CAAC,0BAA0B,CAAC,CAAA;AAoB3F,qBAAa,0BAA0B,CACrC,OAAO,SAAS,gCAAgC,GAAG,gCAAgC,CACnF,SAAQ,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,CAAC;IACjF,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA6D;IAC7G,gBAAyB,mBAAmB,EAAE,MAAM,CAAmC;cAE9D,cAAc,CAAC,QAAQ,CAAC,EAAE,yBAAyB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAkD9G"}
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,mDAAmD,CAAA;AAO1D,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAA;AAE9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AAMtE,MAAM,MAAM,gCAAgC,GAAG,gBAAgB,CAAC,0BAA0B,CAAC,CAAA;AAoB3F,qBAAa,0BAA0B,CACrC,OAAO,SAAS,gCAAgC,GAAG,gCAAgC,CACnF,SAAQ,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,CAAC;IACjF,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA6D;IAC7G,gBAAyB,mBAAmB,EAAE,MAAM,CAAmC;cAE9D,cAAc,CAAC,QAAQ,CAAC,EAAE,yBAAyB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAkD9G"}
@@ -2,21 +2,13 @@
2
2
  var calculateAllPropertiesDistribution = (array) => {
3
3
  const distribution = {};
4
4
  for (const item of array) {
5
- for (const property in item) {
6
- if (Object.prototype.hasOwnProperty.call(item, property)) {
7
- const value = item[property];
8
- if (value !== void 0 && value !== null) {
9
- const valueString = value.toString();
10
- if (!distribution[property]) {
11
- distribution[property] = { [valueString]: 1 };
12
- } else if (distribution[property][valueString]) {
13
- ;
14
- distribution[property][valueString] += 1;
15
- } else {
16
- ;
17
- distribution[property][valueString] = 1;
18
- }
19
- }
5
+ for (const property of Object.keys(item)) {
6
+ const value = item[property];
7
+ if (value !== void 0 && value !== null) {
8
+ const valueString = String(value);
9
+ const propertyDistribution = distribution[property] ?? {};
10
+ propertyDistribution[valueString] = (propertyDistribution[valueString] ?? 0) + 1;
11
+ distribution[property] = propertyDistribution;
20
12
  }
21
13
  }
22
14
  }
@@ -118,7 +110,7 @@ var tryCall = async (func, name) => {
118
110
  try {
119
111
  return await func();
120
112
  } catch (ex) {
121
- if (name) {
113
+ if (name != null && name !== "") {
122
114
  const error = ex;
123
115
  console.log(`tryCall failed [${name}]: ${error.message}`);
124
116
  }
@@ -129,39 +121,41 @@ var tryCall = async (func, name) => {
129
121
  // src/lib/getNftCollectionNfts.ts
130
122
  var ipfsGateway = "5d7b6582.beta.decentralnetworkservices.com";
131
123
  function range(size, startAt = 0) {
132
- return [...Array(size).keys()].map((i) => i + startAt);
124
+ return Array.from({ length: size }, (_value, i) => i + startAt);
133
125
  }
134
126
  var getNftCollectionNfts = async (contractAddress, provider, types, maxNfts = 100) => {
135
127
  try {
136
128
  const block = await provider.getBlockNumber();
137
129
  const erc1967Status = await getErc1967SlotStatus(provider, contractAddress, block);
138
130
  const erc1822Status = await getErc1822SlotStatus(provider, contractAddress, block);
139
- const implementation = !erc1967Status.slots.implementation || isHexZero(erc1967Status.slots.implementation) ? erc1822Status.implementation : erc1967Status.implementation;
131
+ const implementation = (erc1967Status.slots.implementation == null || isHexZero(erc1967Status.slots.implementation) === true ? erc1822Status : erc1967Status).implementation;
140
132
  const client = new FetchJsonClient({ timeout: 2e3 });
141
133
  const enumerable = ERC721Enumerable__factory.connect(implementation, provider);
142
134
  const storage = ERC721URIStorage__factory.connect(implementation, provider);
143
135
  const supply1155 = ERC1155Supply__factory.connect(implementation, provider);
144
136
  const finalTypes = types ?? await tokenTypes(provider, implementation);
145
137
  const maxNftsArray = range(maxNfts);
146
- const result = (await Promise.all(
138
+ const settledNfts = await Promise.all(
147
139
  maxNftsArray.map(async (_value, i) => {
148
140
  const tokenId = await tryCall(async () => await enumerable.tokenByIndex(i, { blockTag: block })) ?? BigInt(i);
149
141
  if (tokenId !== void 0) {
150
142
  const supply = finalTypes.includes(toTokenType("ERC1155")) ? await tryCall(async () => await supply1155["totalSupply(uint256)"](tokenId)) ?? "0x01" : "0x01";
151
143
  const metadataUri = await tryCall(async () => await storage.tokenURI(tokenId, { blockTag: block }));
152
- const checkedMetaDataUri = metadataUri ? checkIpfsUrl(metadataUri, ipfsGateway) : void 0;
144
+ const checkedMetadataUri = metadataUri != null && metadataUri !== "" ? checkIpfsUrl(metadataUri, ipfsGateway) : void 0;
153
145
  let metadata;
154
- if (checkedMetaDataUri !== void 0) {
146
+ if (checkedMetadataUri !== void 0) {
155
147
  try {
156
- metadata = (await client.get(checkedMetaDataUri)).data ?? void 0;
148
+ const response = await client.get(checkedMetadataUri);
149
+ metadata = response.data ?? void 0;
157
150
  } catch (ex) {
158
151
  const error = ex;
159
152
  console.error(`Get Metadata failed: ${error.message}`);
160
153
  }
161
154
  }
155
+ const network = await provider.getNetwork();
162
156
  const info = {
163
157
  address: contractAddress,
164
- chainId: Number((await provider.getNetwork()).chainId),
158
+ chainId: Number(network.chainId),
165
159
  metadata,
166
160
  metadataUri,
167
161
  schema: NftSchema,
@@ -176,7 +170,8 @@ var getNftCollectionNfts = async (contractAddress, provider, types, maxNfts = 10
176
170
  return info;
177
171
  }
178
172
  })
179
- )).filter(exists);
173
+ );
174
+ const result = settledNfts.filter(exists);
180
175
  return result;
181
176
  } catch (ex) {
182
177
  const error = ex;
@@ -191,11 +186,8 @@ import { NftSchema as NftSchema2 } from "@xyo-network/crypto-nft-payload-plugin"
191
186
  import { createPayloadSetWitnessPlugin, PayloadSetSchema } from "@xyo-network/sdk-js";
192
187
 
193
188
  // src/Witness.ts
194
- import {
195
- asEthAddress,
196
- assertEx as assertEx2,
197
- EthAddressWrapper
198
- } from "@xylabs/sdk-js";
189
+ import { EthAddressWrapper } from "@xylabs/eth-address";
190
+ import { asEthAddress, assertEx as assertEx2 } from "@xylabs/sdk-js";
199
191
  import {
200
192
  isNftCollectionWitnessQuery,
201
193
  NftCollectionSchema,
@@ -207,7 +199,7 @@ import { AbstractEvmWitness } from "@xyo-network/witness-evm-abstract";
207
199
  var defaultMaxNfts = 100;
208
200
  var NoOp = Promise.resolve();
209
201
  function resolvedValue(settled, assert) {
210
- if (assert && settled.status === "rejected") {
202
+ if (assert === true && settled.status === "rejected") {
211
203
  throw settled.reason;
212
204
  }
213
205
  return settled.status === "fulfilled" ? settled.value : void 0;
@@ -228,7 +220,7 @@ var CryptoNftCollectionWitness = class extends AbstractEvmWitness {
228
220
  () => "Failed to parse params.address"
229
221
  ).toString(), true);
230
222
  const erc721Enumerable = ERC721Enumerable__factory2.connect(address, provider);
231
- const maxNfts = query?.maxNfts && query.maxNfts > 0 ? query.maxNfts : defaultMaxNfts;
223
+ const maxNfts = query?.maxNfts != null && query.maxNfts > 0 ? query.maxNfts : defaultMaxNfts;
232
224
  const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([
233
225
  erc721Enumerable.name(),
234
226
  erc721Enumerable.symbol(),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts", "../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts", "../../src/lib/collectionMetrics/getNftCollectionMetrics.ts", "../../src/lib/contractHasFunctions.ts", "../../src/lib/getNftCollectionNfts.ts", "../../src/lib/tokenTypes.ts", "../../src/lib/tryCall.ts", "../../src/Plugin.ts", "../../src/Witness.ts"],
4
- "sourcesContent": ["import type { Distribution } from './distribution.ts'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n for (const item of array) {\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 type { 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 (\u00B5)\n const mean = n * p\n\n // Variance (\u03C3^2)\n const variance = n * p * (1 - p)\n\n // Standard Deviation (\u03C3)\n const stdDev = Math.sqrt(variance)\n\n return {\n mean, p, stdDev, variance,\n }\n}\n", "import type { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib/index.ts'\n\ntype TraitDistributionEntry = [string, Record<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 { assertEx } from '@xylabs/sdk-js'\nimport type { Interface, Provider } from 'ethers'\n\nexport const contractHasFunctions = async (provider: Provider, address: string, contractInterface: Interface, functionNames: string[]) => {\n try {\n const bytecode = await provider.getCode(address, 'latest')\n for (const functionName of functionNames) {\n const selector = assertEx(contractInterface.getFunction(functionName)?.selector, () => 'Function not found on interface')\n return (bytecode.includes(selector.slice(2)))\n }\n return false\n } catch (ex) {\n const error = ex as Error\n console.log(error)\n return false\n }\n}\n", "import type { EthAddress } from '@xylabs/sdk-js'\nimport {\n exists, FetchJsonClient, isHexZero,\n} from '@xylabs/sdk-js'\nimport type {\n NftInfo, NftMetadata, TokenType,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport { NftSchema, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\nimport {\n ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory,\n} from '@xyo-network/open-zeppelin-typechain'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain-abstract'\nimport type { Provider } from 'ethers'\n\nimport { tokenTypes } from './tokenTypes.ts'\nimport { tryCall } from './tryCall.ts'\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\nfunction range(size: number, startAt = 0): readonly number[] {\n return [...Array(size).keys()].map(i => i + startAt)\n}\n\nexport const getNftCollectionNfts = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: EthAddress,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: Provider,\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 try {\n const block = await provider.getBlockNumber()\n\n // Check if ERC-1967 Upgradeable\n const erc1967Status = await getErc1967SlotStatus(provider, contractAddress, block)\n\n // Check if ERC-1822 Upgradeable\n const erc1822Status = await getErc1822SlotStatus(provider, contractAddress, block)\n\n const implementation\n = !erc1967Status.slots.implementation || isHexZero(erc1967Status.slots.implementation)\n ? erc1822Status.implementation\n : erc1967Status.implementation\n\n const client = new FetchJsonClient({ timeout: 2000 })\n const enumerable = ERC721Enumerable__factory.connect(implementation, provider)\n const storage = ERC721URIStorage__factory.connect(implementation, provider)\n const supply1155 = ERC1155Supply__factory.connect(implementation, provider)\n const finalTypes = types ?? (await tokenTypes(provider, implementation))\n\n const maxNftsArray = range(maxNfts)\n\n const result: NftInfo[] = (\n await Promise.all(\n maxNftsArray.map(async (_value, i) => {\n const tokenId = (await tryCall(async () => await enumerable.tokenByIndex(i, { blockTag: block }))) ?? BigInt(i)\n if (tokenId !== undefined) {\n const supply\n = finalTypes.includes(toTokenType('ERC1155'))\n ? ((await tryCall(async () => await supply1155['totalSupply(uint256)'](tokenId))) ?? '0x01')\n : '0x01'\n const metadataUri = await tryCall(async () => await storage.tokenURI(tokenId, { blockTag: block }))\n const checkedMetaDataUri = metadataUri ? checkIpfsUrl(metadataUri, ipfsGateway) : undefined\n let metadata: NftMetadata | undefined\n if (checkedMetaDataUri !== undefined) {\n try {\n metadata = (await client.get<NftMetadata>(checkedMetaDataUri)).data ?? undefined\n } catch (ex) {\n const error = ex as Error\n console.error(`Get Metadata failed: ${error.message}`)\n }\n }\n\n const info: NftInfo = {\n address: contractAddress,\n chainId: Number((await provider.getNetwork()).chainId),\n metadata,\n metadataUri,\n schema: NftSchema,\n supply: `0x${supply.toString(16)}`,\n tokenId: `0x${tokenId.toString(16)}`,\n type: finalTypes.at(0),\n types: finalTypes,\n }\n if (implementation !== contractAddress) {\n info.implementation = implementation\n }\n return info\n }\n }),\n )\n ).filter(exists)\n return result\n } catch (ex) {\n const error = ex as Error\n console.error(`getNftCollectionNfts failed: [${error.name}] ${error.message}`)\n console.log(error.stack)\n return []\n }\n}\n", "import type { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { Provider } from 'ethers'\n\nimport { contractHasFunctions } from './contractHasFunctions.ts'\n\nexport const isErc1155 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, ERC1155URIStorage__factory.createInterface(), ['uri'])\n}\n\nexport const isErc721 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, ERC721__factory.createInterface(), ['name', 'symbol', 'tokenURI'])\n}\n\nexport const tokenTypes = async (provider: Provider, address: string) => {\n const [erc721, erc1155] = await Promise.all([isErc721(provider, address), isErc1155(provider, address)])\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", "export const tryCall = async <T>(func: () => Promise<T>, name?: string): Promise<T | undefined> => {\n try {\n return await func()\n } catch (ex) {\n if (name) {\n const error = ex as Error\n console.log(`tryCall failed [${name}]: ${error.message}`)\n }\n return undefined\n }\n}\n", "import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { PayloadSetWitnessPlugin } from '@xyo-network/sdk-js'\nimport { createPayloadSetWitnessPlugin, PayloadSetSchema } from '@xyo-network/sdk-js'\n\nimport { CryptoNftCollectionWitness } from './Witness.ts'\n\nexport const CryptoNftCollectionWitnessPlugin = (): PayloadSetWitnessPlugin<CryptoNftCollectionWitness> =>\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 {\n asEthAddress, assertEx, EthAddressWrapper,\n} from '@xylabs/sdk-js'\nimport type {\n NftCollectionInfo,\n NftCollectionWitnessConfig,\n NftCollectionWitnessQuery,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionSchema,\n NftCollectionWitnessConfigSchema,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { Schema, WithSources } from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract'\n\nimport {\n getNftCollectionMetrics, getNftCollectionNfts, tokenTypes,\n} from './lib/index.ts'\n\nexport type CryptoNftCollectionWitnessParams = EvmWitnessParams<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\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<\n TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams,\n> extends AbstractEvmWitness<TParams, NftCollectionWitnessQuery, NftCollectionInfo> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftCollectionWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftCollectionWitnessConfigSchema\n\n protected override async observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]> {\n await this.startedAsync('throw')\n await this.getProviders() // make sure cache clears\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 = await this.getProvider(true, true)\n const address = asEthAddress(assertEx(\n EthAddressWrapper.parse(assertEx(query?.address ?? this.config.address, () => 'params.address is required')),\n () => 'Failed to parse params.address',\n ).toString(), true)\n\n const erc721Enumerable = ERC721Enumerable__factory.connect(address, provider)\n\n const maxNfts = query?.maxNfts && query.maxNfts > 0 ? query.maxNfts : defaultMaxNfts\n const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([\n erc721Enumerable.name(),\n erc721Enumerable.symbol(),\n erc721Enumerable.totalSupply(),\n tokenTypes(provider, address),\n this.archivistInstance(),\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 => PayloadBuilder.dataHash(nft))),\n // Insert them into the archivist if we have one\n archivist ? archivist.insert(nfts) : NoOp,\n ])\n const payload: WithSources<NftCollectionInfo> = {\n address,\n chainId,\n metrics,\n name: resolvedValue(name, true),\n schema: NftCollectionSchema,\n $sources,\n symbol: resolvedValue(symbol, true),\n total: Number(resolvedValue(total, true)),\n type: types.at(0),\n types,\n }\n return payload\n }),\n )\n return observations.flat()\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Distribution } from './distribution.ts'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n for (const item of array) {\n for (const property of Object.keys(item as object) as (keyof T)[]) {\n const value = item[property]\n if (value !== undefined && value !== null) {\n const valueString = String(value)\n const propertyDistribution = distribution[property] ?? {}\n propertyDistribution[valueString] = (propertyDistribution[valueString] ?? 0) + 1\n distribution[property] = propertyDistribution\n }\n }\n }\n\n return distribution\n}\n", "import type { 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 (\u00B5)\n const mean = n * p\n\n // Variance (\u03C3^2)\n const variance = n * p * (1 - p)\n\n // Standard Deviation (\u03C3)\n const stdDev = Math.sqrt(variance)\n\n return {\n mean, p, stdDev, variance,\n }\n}\n", "import type { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib/index.ts'\n\ntype TraitDistributionEntry = [string, Record<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 { assertEx } from '@xylabs/sdk-js'\nimport type { Interface, Provider } from 'ethers'\n\nexport const contractHasFunctions = async (provider: Provider, address: string, contractInterface: Interface, functionNames: string[]) => {\n try {\n const bytecode = await provider.getCode(address, 'latest')\n for (const functionName of functionNames) {\n const selector = assertEx(contractInterface.getFunction(functionName)?.selector, () => 'Function not found on interface')\n return (bytecode.includes(selector.slice(2)))\n }\n return false\n } catch (ex) {\n const error = ex as Error\n console.log(error)\n return false\n }\n}\n", "import type { EthAddress } from '@xylabs/sdk-js'\nimport {\n exists, FetchJsonClient, isHexZero,\n} from '@xylabs/sdk-js'\nimport type {\n NftInfo, NftMetadata, TokenType,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport { NftSchema, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\nimport {\n ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory,\n} from '@xyo-network/open-zeppelin-typechain'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain-abstract'\nimport type { Provider } from 'ethers'\n\nimport { tokenTypes } from './tokenTypes.ts'\nimport { tryCall } from './tryCall.ts'\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\nfunction range(size: number, startAt = 0): readonly number[] {\n return Array.from({ length: size }, (_value, i) => i + startAt)\n}\n\nexport const getNftCollectionNfts = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: EthAddress,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: Provider,\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 try {\n const block = await provider.getBlockNumber()\n\n // Check if ERC-1967 Upgradeable\n const erc1967Status = await getErc1967SlotStatus(provider, contractAddress, block)\n\n // Check if ERC-1822 Upgradeable\n const erc1822Status = await getErc1822SlotStatus(provider, contractAddress, block)\n\n const implementation\n = (erc1967Status.slots.implementation == null || isHexZero(erc1967Status.slots.implementation) === true\n ? erc1822Status\n : erc1967Status).implementation\n\n const client = new FetchJsonClient({ timeout: 2000 })\n const enumerable = ERC721Enumerable__factory.connect(implementation, provider)\n const storage = ERC721URIStorage__factory.connect(implementation, provider)\n const supply1155 = ERC1155Supply__factory.connect(implementation, provider)\n const finalTypes = types ?? (await tokenTypes(provider, implementation))\n\n const maxNftsArray = range(maxNfts)\n\n const settledNfts = await Promise.all(\n maxNftsArray.map(async (_value, i) => {\n const tokenId = (await tryCall(async () => await enumerable.tokenByIndex(i, { blockTag: block }))) ?? BigInt(i)\n if (tokenId !== undefined) {\n const supply\n = finalTypes.includes(toTokenType('ERC1155'))\n ? ((await tryCall(async () => await supply1155['totalSupply(uint256)'](tokenId))) ?? '0x01')\n : '0x01'\n const metadataUri = await tryCall(async () => await storage.tokenURI(tokenId, { blockTag: block }))\n const checkedMetadataUri = metadataUri != null && metadataUri !== '' ? checkIpfsUrl(metadataUri, ipfsGateway) : undefined\n let metadata: NftMetadata | undefined\n if (checkedMetadataUri !== undefined) {\n try {\n const response = await client.get<NftMetadata>(checkedMetadataUri)\n metadata = response.data ?? undefined\n } catch (ex) {\n const error = ex as Error\n console.error(`Get Metadata failed: ${error.message}`)\n }\n }\n\n const network = await provider.getNetwork()\n const info: NftInfo = {\n address: contractAddress,\n chainId: Number(network.chainId),\n metadata,\n metadataUri,\n schema: NftSchema,\n supply: `0x${supply.toString(16)}`,\n tokenId: `0x${tokenId.toString(16)}`,\n type: finalTypes.at(0),\n types: finalTypes,\n }\n if (implementation !== contractAddress) {\n info.implementation = implementation\n }\n return info\n }\n }),\n )\n const result: NftInfo[] = settledNfts.filter(exists)\n return result\n } catch (ex) {\n const error = ex as Error\n console.error(`getNftCollectionNfts failed: [${error.name}] ${error.message}`)\n console.log(error.stack)\n return []\n }\n}\n", "import type { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { Provider } from 'ethers'\n\nimport { contractHasFunctions } from './contractHasFunctions.ts'\n\nexport const isErc1155 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, ERC1155URIStorage__factory.createInterface(), ['uri'])\n}\n\nexport const isErc721 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, ERC721__factory.createInterface(), ['name', 'symbol', 'tokenURI'])\n}\n\nexport const tokenTypes = async (provider: Provider, address: string) => {\n const [erc721, erc1155] = await Promise.all([isErc721(provider, address), isErc1155(provider, address)])\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", "export const tryCall = async <T>(func: () => Promise<T>, name?: string): Promise<T | undefined> => {\n try {\n return await func()\n } catch (ex) {\n if (name != null && name !== '') {\n const error = ex as Error\n console.log(`tryCall failed [${name}]: ${error.message}`)\n }\n return undefined\n }\n}\n", "import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { PayloadSetWitnessPlugin } from '@xyo-network/sdk-js'\nimport { createPayloadSetWitnessPlugin, PayloadSetSchema } from '@xyo-network/sdk-js'\n\nimport { CryptoNftCollectionWitness } from './Witness.ts'\n\nexport const CryptoNftCollectionWitnessPlugin = (): PayloadSetWitnessPlugin<CryptoNftCollectionWitness> =>\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 { EthAddressWrapper } from '@xylabs/eth-address'\nimport { asEthAddress, assertEx } from '@xylabs/sdk-js'\nimport type {\n NftCollectionInfo,\n NftCollectionWitnessConfig,\n NftCollectionWitnessQuery,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionSchema,\n NftCollectionWitnessConfigSchema,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { Schema, WithSources } from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract'\n\nimport {\n getNftCollectionMetrics, getNftCollectionNfts, tokenTypes,\n} from './lib/index.ts'\n\nexport type CryptoNftCollectionWitnessParams = EvmWitnessParams<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\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 === true && settled.status === 'rejected') {\n throw settled.reason\n }\n return settled.status === 'fulfilled' ? settled.value : undefined\n}\n\nexport class CryptoNftCollectionWitness<\n TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams,\n> extends AbstractEvmWitness<TParams, NftCollectionWitnessQuery, NftCollectionInfo> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftCollectionWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftCollectionWitnessConfigSchema\n\n protected override async observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]> {\n await this.startedAsync('throw')\n await this.getProviders() // make sure cache clears\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 = await this.getProvider(true, true)\n const address = asEthAddress(assertEx(\n EthAddressWrapper.parse(assertEx(query?.address ?? this.config.address, () => 'params.address is required')),\n () => 'Failed to parse params.address',\n ).toString(), true)\n\n const erc721Enumerable = ERC721Enumerable__factory.connect(address, provider)\n\n const maxNfts = query?.maxNfts != null && query.maxNfts > 0 ? query.maxNfts : defaultMaxNfts\n const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([\n erc721Enumerable.name(),\n erc721Enumerable.symbol(),\n erc721Enumerable.totalSupply(),\n tokenTypes(provider, address),\n this.archivistInstance(),\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 => PayloadBuilder.dataHash(nft))),\n // Insert them into the archivist if we have one\n archivist ? archivist.insert(nfts) : NoOp,\n ])\n const payload: WithSources<NftCollectionInfo> = {\n address,\n chainId,\n metrics,\n name: resolvedValue(name, true),\n schema: NftCollectionSchema,\n $sources,\n symbol: resolvedValue(symbol, true),\n total: Number(resolvedValue(total, true)),\n type: types.at(0),\n types,\n }\n return payload\n }),\n )\n return observations.flat()\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["attributes", "p", "NftSchema", "assertEx", "ERC721Enumerable__factory", "assertEx", "ERC721Enumerable__factory", "NftSchema"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"calculateAllPropertiesDistribution.d.ts","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,eAAO,MAAM,kCAAkC,GAAI,CAAC,EAAE,OAAO,CAAC,EAAE,KAAG,YAAY,CAAC,CAAC,CAsBhF,CAAA"}
1
+ {"version":3,"file":"calculateAllPropertiesDistribution.d.ts","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,eAAO,MAAM,kCAAkC,GAAI,CAAC,EAAE,OAAO,CAAC,EAAE,KAAG,YAAY,CAAC,CAAC,CAgBhF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"calculatePropertyDistribution.d.ts","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/calculatePropertyDistribution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,eAAO,MAAM,6BAA6B,GAAI,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,MAAM,CAAC,KAAG,YAAY,CAAC,CAAC,CAgB9F,CAAA"}
1
+ {"version":3,"file":"calculatePropertyDistribution.d.ts","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/calculatePropertyDistribution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,eAAO,MAAM,6BAA6B,GAAI,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,MAAM,CAAC,KAAG,YAAY,CAAC,CAAC,CAY9F,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getNftCollectionNfts.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionNfts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAIhD,OAAO,KAAK,EACV,OAAO,EAAe,SAAS,EAChC,MAAM,wCAAwC,CAAA;AAQ/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAWtC,eAAO,MAAM,oBAAoB;AAC/B;;GAEG;AACH,iBAAiB,UAAU;AAC3B;;GAEG;AACH,UAAU,QAAQ,EAClB,QAAQ,SAAS,EAAE;AACnB;;;;GAIG;AACH,gBAAa,KACZ,OAAO,CAAC,OAAO,EAAE,CAsEnB,CAAA"}
1
+ {"version":3,"file":"getNftCollectionNfts.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionNfts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAIhD,OAAO,KAAK,EACV,OAAO,EAAe,SAAS,EAChC,MAAM,wCAAwC,CAAA;AAQ/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAWtC,eAAO,MAAM,oBAAoB;AAC/B;;GAEG;AACH,iBAAiB,UAAU;AAC3B;;GAEG;AACH,UAAU,QAAQ,EAClB,QAAQ,SAAS,EAAE;AACnB;;;;GAIG;AACH,gBAAa,KACZ,OAAO,CAAC,OAAO,EAAE,CAuEnB,CAAA"}
@@ -1,6 +1,5 @@
1
- import type { TokenType } from '@xyo-network/crypto-nft-payload-plugin';
2
1
  import type { Provider } from 'ethers';
3
2
  export declare const isErc1155: (provider: Provider, address: string) => Promise<boolean>;
4
3
  export declare const isErc721: (provider: Provider, address: string) => Promise<boolean>;
5
- export declare const tokenTypes: (provider: Provider, address: string) => Promise<TokenType[]>;
4
+ export declare const tokenTypes: (provider: Provider, address: string) => Promise<("ERC721" | "ERC1155" | null)[]>;
6
5
  //# sourceMappingURL=tokenTypes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokenTypes.d.ts","sourceRoot":"","sources":["../../../src/lib/tokenTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAEvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAItC,eAAO,MAAM,SAAS,GAAU,UAAU,QAAQ,EAAE,SAAS,MAAM,qBAElE,CAAA;AAED,eAAO,MAAM,QAAQ,GAAU,UAAU,QAAQ,EAAE,SAAS,MAAM,qBAEjE,CAAA;AAED,eAAO,MAAM,UAAU,GAAU,UAAU,QAAQ,EAAE,SAAS,MAAM,yBAUnE,CAAA"}
1
+ {"version":3,"file":"tokenTypes.d.ts","sourceRoot":"","sources":["../../../src/lib/tokenTypes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAItC,eAAO,MAAM,SAAS,GAAU,UAAU,QAAQ,EAAE,SAAS,MAAM,qBAElE,CAAA;AAED,eAAO,MAAM,QAAQ,GAAU,UAAU,QAAQ,EAAE,SAAS,MAAM,qBAEjE,CAAA;AAED,eAAO,MAAM,UAAU,GAAU,UAAU,QAAQ,EAAE,SAAS,MAAM,6CAUnE,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/crypto-nft-collection-witness-plugin",
3
- "version": "6.0.3",
3
+ "version": "7.0.0",
4
4
  "description": "Typescript/Javascript Plugins for XYO Platform",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -31,38 +31,35 @@
31
31
  "README.md"
32
32
  ],
33
33
  "dependencies": {
34
- "@xyo-network/erc1822-witness": "~6.0.3",
35
- "@xyo-network/crypto-nft-collection-payload-plugin": "~6.0.3",
36
- "@xyo-network/crypto-nft-payload-plugin": "~6.0.3",
37
- "@xyo-network/erc1967-witness": "~6.0.3"
34
+ "@xyo-network/crypto-nft-collection-payload-plugin": "~7.0.0",
35
+ "@xyo-network/crypto-nft-payload-plugin": "~7.0.0",
36
+ "@xyo-network/erc1967-witness": "~7.0.0",
37
+ "@xyo-network/erc1822-witness": "~7.0.0"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@bitauth/libauth": "~3.0.0",
41
41
  "@metamask/providers": "^22.1.1",
42
42
  "@noble/post-quantum": "~0.6.1",
43
43
  "@opentelemetry/api": "^1.9.1",
44
- "@opentelemetry/sdk-trace-base": "^2.7.1",
44
+ "@opentelemetry/sdk-trace-base": "^2.8.0",
45
45
  "@scure/base": "^2.2.0",
46
46
  "@scure/bip39": "~2.2.0",
47
- "@xylabs/geo": "^6.0.8",
48
- "@xylabs/sdk-js": "^6.0.8",
49
- "@xylabs/threads": "^6.0.8",
50
- "@xylabs/toolchain": "~8.1.16",
51
- "@xylabs/tsconfig": "~8.1.16",
52
- "@xylabs/vitest-extended": "~6.0.8",
53
- "@xyo-network/account-model": "^6.0.9",
47
+ "@xylabs/eth-address": "~6.1.3",
48
+ "@xylabs/geo": "^6.1.3",
49
+ "@xylabs/sdk-js": "^6.1.3",
50
+ "@xylabs/threads": "^6.1.3",
51
+ "@xylabs/toolchain": "~8.2.7",
52
+ "@xylabs/tsconfig": "~8.2.7",
53
+ "@xylabs/vitest-extended": "^6.1.3",
54
54
  "@xyo-network/open-zeppelin-typechain": "^4.1.3",
55
- "@xyo-network/payload-model": "^6.0.9",
56
- "@xyo-network/sdk-js": "^6.0.4",
57
- "@xyo-network/sdk-protocol-js": "~6.0.9",
58
- "@xyo-network/witness-blockchain-abstract": "^6.0.4",
59
- "@xyo-network/witness-evm-abstract": "~6.0.4",
55
+ "@xyo-network/sdk-js": "^7.0.0",
56
+ "@xyo-network/sdk-protocol-js": "~7.0",
57
+ "@xyo-network/witness-blockchain-abstract": "^7.0.0",
58
+ "@xyo-network/witness-evm-abstract": "~7.0",
60
59
  "ajv": "^8.20.0",
61
60
  "async-mutex": "^0.5.0",
62
- "bn.js": "^5.2.3",
63
- "buffer": "^6.0.3",
64
61
  "debug": "~4.4.3",
65
- "eslint": "^10.4.1",
62
+ "eslint": "^10.5.0",
66
63
  "ethers": "^6.16.0",
67
64
  "hash-wasm": "^4.12.0",
68
65
  "idb": "^8.0.3",
@@ -70,7 +67,7 @@
70
67
  "observable-fns": "~0.6.1",
71
68
  "typescript": "~6.0.3",
72
69
  "vite": "^8.0.16",
73
- "vitest": "^4.1.8",
70
+ "vitest": "^4.1.9",
74
71
  "webextension-polyfill": "^0.12.0",
75
72
  "zod": "^4.4.3"
76
73
  },
@@ -82,18 +79,17 @@
82
79
  "@opentelemetry/sdk-trace-base": "^2.7",
83
80
  "@scure/base": "^2.2",
84
81
  "@scure/bip39": "~2.2",
82
+ "@xylabs/eth-address": "^6.1",
85
83
  "@xylabs/geo": "^6.0",
86
84
  "@xylabs/sdk-js": "^6.0",
87
85
  "@xylabs/threads": "^6.0",
88
86
  "@xyo-network/open-zeppelin-typechain": "^4.1",
89
- "@xyo-network/sdk-js": "^6.0",
90
- "@xyo-network/sdk-protocol-js": "~6.0",
91
- "@xyo-network/witness-blockchain-abstract": "^6.0",
92
- "@xyo-network/witness-evm-abstract": "^6.0",
87
+ "@xyo-network/sdk-js": "^7.0",
88
+ "@xyo-network/sdk-protocol-js": "^7.0",
89
+ "@xyo-network/witness-blockchain-abstract": "^7.0",
90
+ "@xyo-network/witness-evm-abstract": "^7.0",
93
91
  "ajv": "^8.20",
94
92
  "async-mutex": "^0.5",
95
- "bn.js": "^5.2",
96
- "buffer": "^6.0",
97
93
  "debug": "~4.4",
98
94
  "ethers": "^6.16",
99
95
  "hash-wasm": "^4.12",
@@ -103,6 +99,9 @@
103
99
  "webextension-polyfill": "^0.12",
104
100
  "zod": "^4.4"
105
101
  },
102
+ "engines": {
103
+ "node": "^24"
104
+ },
106
105
  "publishConfig": {
107
106
  "access": "public"
108
107
  }
@@ -1,4 +0,0 @@
1
- import type { PayloadSetWitnessPlugin } from '@xyo-network/sdk-js';
2
- import { CryptoNftCollectionWitness } from './Witness.ts';
3
- export declare const CryptoNftCollectionWitnessPlugin: () => PayloadSetWitnessPlugin<CryptoNftCollectionWitness>;
4
- //# sourceMappingURL=Plugin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAGlE,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAEzD,eAAO,MAAM,gCAAgC,QAAO,uBAAuB,CAAC,0BAA0B,CASnG,CAAA"}
@@ -1,11 +0,0 @@
1
- import type { NftCollectionInfo, NftCollectionWitnessConfig, NftCollectionWitnessQuery } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- import type { Schema } from '@xyo-network/sdk-js';
3
- import type { EvmWitnessParams } from '@xyo-network/witness-evm-abstract';
4
- import { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract';
5
- export type CryptoNftCollectionWitnessParams = EvmWitnessParams<NftCollectionWitnessConfig>;
6
- export declare class CryptoNftCollectionWitness<TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams> extends AbstractEvmWitness<TParams, NftCollectionWitnessQuery, NftCollectionInfo> {
7
- static readonly configSchemas: Schema[];
8
- static readonly defaultConfigSchema: Schema;
9
- protected observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]>;
10
- }
11
- //# sourceMappingURL=Witness.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,mDAAmD,CAAA;AAO1D,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAA;AAE9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AAMtE,MAAM,MAAM,gCAAgC,GAAG,gBAAgB,CAAC,0BAA0B,CAAC,CAAA;AAoB3F,qBAAa,0BAA0B,CACrC,OAAO,SAAS,gCAAgC,GAAG,gCAAgC,CACnF,SAAQ,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,CAAC;IACjF,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA6D;IAC7G,gBAAyB,mBAAmB,EAAE,MAAM,CAAmC;cAE9D,cAAc,CAAC,QAAQ,CAAC,EAAE,yBAAyB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAkD9G"}
@@ -1,4 +0,0 @@
1
- export * from './lib/index.ts';
2
- export { CryptoNftCollectionWitnessPlugin, CryptoNftCollectionWitnessPlugin as default } from './Plugin.ts';
3
- export * from './Witness.ts';
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,OAAO,EAAE,gCAAgC,EAAE,gCAAgC,IAAI,OAAO,EAAE,MAAM,aAAa,CAAA;AAC3G,cAAc,cAAc,CAAA"}