@xyo-network/crypto-nft-collection-witness-plugin 2.96.0 → 2.96.2

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 (112) hide show
  1. package/dist/browser/Plugin.d.cts.map +1 -1
  2. package/dist/browser/Plugin.d.mts.map +1 -1
  3. package/dist/browser/Plugin.d.ts.map +1 -1
  4. package/dist/browser/index.cjs +1 -297
  5. package/dist/browser/index.cjs.map +1 -1
  6. package/dist/browser/index.js +1 -278
  7. package/dist/browser/index.js.map +1 -1
  8. package/dist/browser/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.cts.map +1 -1
  9. package/dist/browser/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.mts.map +1 -1
  10. package/dist/browser/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.ts.map +1 -1
  11. package/dist/browser/lib/collectionMetrics/lib/calculatePropertyDistribution.d.cts.map +1 -1
  12. package/dist/browser/lib/collectionMetrics/lib/calculatePropertyDistribution.d.mts.map +1 -1
  13. package/dist/browser/lib/collectionMetrics/lib/calculatePropertyDistribution.d.ts.map +1 -1
  14. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.cts +0 -5
  15. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.cts.map +1 -1
  16. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.mts +0 -5
  17. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.mts.map +1 -1
  18. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.ts +0 -5
  19. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.ts.map +1 -1
  20. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.cts +0 -6
  21. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.cts.map +1 -1
  22. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.mts +0 -6
  23. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.mts.map +1 -1
  24. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.ts +0 -6
  25. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.ts.map +1 -1
  26. package/dist/browser/lib/getNftCollectionNfts.d.cts.map +1 -1
  27. package/dist/browser/lib/getNftCollectionNfts.d.mts.map +1 -1
  28. package/dist/browser/lib/getNftCollectionNfts.d.ts.map +1 -1
  29. package/dist/browser/lib/nonEvaluableContractAddresses.d.cts +0 -4
  30. package/dist/browser/lib/nonEvaluableContractAddresses.d.cts.map +1 -1
  31. package/dist/browser/lib/nonEvaluableContractAddresses.d.mts +0 -4
  32. package/dist/browser/lib/nonEvaluableContractAddresses.d.mts.map +1 -1
  33. package/dist/browser/lib/nonEvaluableContractAddresses.d.ts +0 -4
  34. package/dist/browser/lib/nonEvaluableContractAddresses.d.ts.map +1 -1
  35. package/dist/browser/lib/tryCall.d.cts.map +1 -1
  36. package/dist/browser/lib/tryCall.d.mts.map +1 -1
  37. package/dist/browser/lib/tryCall.d.ts.map +1 -1
  38. package/dist/neutral/Plugin.d.cts.map +1 -1
  39. package/dist/neutral/Plugin.d.mts.map +1 -1
  40. package/dist/neutral/Plugin.d.ts.map +1 -1
  41. package/dist/neutral/index.cjs +1 -297
  42. package/dist/neutral/index.cjs.map +1 -1
  43. package/dist/neutral/index.js +1 -278
  44. package/dist/neutral/index.js.map +1 -1
  45. package/dist/neutral/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.cts.map +1 -1
  46. package/dist/neutral/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.mts.map +1 -1
  47. package/dist/neutral/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.ts.map +1 -1
  48. package/dist/neutral/lib/collectionMetrics/lib/calculatePropertyDistribution.d.cts.map +1 -1
  49. package/dist/neutral/lib/collectionMetrics/lib/calculatePropertyDistribution.d.mts.map +1 -1
  50. package/dist/neutral/lib/collectionMetrics/lib/calculatePropertyDistribution.d.ts.map +1 -1
  51. package/dist/neutral/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.cts +0 -5
  52. package/dist/neutral/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.cts.map +1 -1
  53. package/dist/neutral/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.mts +0 -5
  54. package/dist/neutral/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.mts.map +1 -1
  55. package/dist/neutral/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.ts +0 -5
  56. package/dist/neutral/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.ts.map +1 -1
  57. package/dist/neutral/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.cts +0 -6
  58. package/dist/neutral/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.cts.map +1 -1
  59. package/dist/neutral/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.mts +0 -6
  60. package/dist/neutral/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.mts.map +1 -1
  61. package/dist/neutral/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.ts +0 -6
  62. package/dist/neutral/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.ts.map +1 -1
  63. package/dist/neutral/lib/getNftCollectionNfts.d.cts.map +1 -1
  64. package/dist/neutral/lib/getNftCollectionNfts.d.mts.map +1 -1
  65. package/dist/neutral/lib/getNftCollectionNfts.d.ts.map +1 -1
  66. package/dist/neutral/lib/nonEvaluableContractAddresses.d.cts +0 -4
  67. package/dist/neutral/lib/nonEvaluableContractAddresses.d.cts.map +1 -1
  68. package/dist/neutral/lib/nonEvaluableContractAddresses.d.mts +0 -4
  69. package/dist/neutral/lib/nonEvaluableContractAddresses.d.mts.map +1 -1
  70. package/dist/neutral/lib/nonEvaluableContractAddresses.d.ts +0 -4
  71. package/dist/neutral/lib/nonEvaluableContractAddresses.d.ts.map +1 -1
  72. package/dist/neutral/lib/tryCall.d.cts.map +1 -1
  73. package/dist/neutral/lib/tryCall.d.mts.map +1 -1
  74. package/dist/neutral/lib/tryCall.d.ts.map +1 -1
  75. package/dist/node/Plugin.d.cts.map +1 -1
  76. package/dist/node/Plugin.d.mts.map +1 -1
  77. package/dist/node/Plugin.d.ts.map +1 -1
  78. package/dist/node/index.cjs +1 -312
  79. package/dist/node/index.cjs.map +1 -1
  80. package/dist/node/index.js +1 -282
  81. package/dist/node/index.js.map +1 -1
  82. package/dist/node/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.cts.map +1 -1
  83. package/dist/node/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.mts.map +1 -1
  84. package/dist/node/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.ts.map +1 -1
  85. package/dist/node/lib/collectionMetrics/lib/calculatePropertyDistribution.d.cts.map +1 -1
  86. package/dist/node/lib/collectionMetrics/lib/calculatePropertyDistribution.d.mts.map +1 -1
  87. package/dist/node/lib/collectionMetrics/lib/calculatePropertyDistribution.d.ts.map +1 -1
  88. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.cts +0 -5
  89. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.cts.map +1 -1
  90. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.mts +0 -5
  91. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.mts.map +1 -1
  92. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.ts +0 -5
  93. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.ts.map +1 -1
  94. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.cts +0 -6
  95. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.cts.map +1 -1
  96. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.mts +0 -6
  97. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.mts.map +1 -1
  98. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.ts +0 -6
  99. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.ts.map +1 -1
  100. package/dist/node/lib/getNftCollectionNfts.d.cts.map +1 -1
  101. package/dist/node/lib/getNftCollectionNfts.d.mts.map +1 -1
  102. package/dist/node/lib/getNftCollectionNfts.d.ts.map +1 -1
  103. package/dist/node/lib/nonEvaluableContractAddresses.d.cts +0 -4
  104. package/dist/node/lib/nonEvaluableContractAddresses.d.cts.map +1 -1
  105. package/dist/node/lib/nonEvaluableContractAddresses.d.mts +0 -4
  106. package/dist/node/lib/nonEvaluableContractAddresses.d.mts.map +1 -1
  107. package/dist/node/lib/nonEvaluableContractAddresses.d.ts +0 -4
  108. package/dist/node/lib/nonEvaluableContractAddresses.d.ts.map +1 -1
  109. package/dist/node/lib/tryCall.d.cts.map +1 -1
  110. package/dist/node/lib/tryCall.d.mts.map +1 -1
  111. package/dist/node/lib/tryCall.d.ts.map +1 -1
  112. package/package.json +16 -16
@@ -1,283 +1,2 @@
1
- // src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts
2
- var calculateAllPropertiesDistribution = (array) => {
3
- const distribution = {};
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
- }
20
- }
21
- }
22
- }
23
- return distribution;
24
- };
25
-
26
- // src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts
27
- var calculateBinomialParamsFromProbability = (n, p) => {
28
- const mean = n * p;
29
- const variance = n * p * (1 - p);
30
- const stdDev = Math.sqrt(variance);
31
- return { mean, p, stdDev, variance };
32
- };
33
-
34
- // src/lib/collectionMetrics/getNftCollectionMetrics.ts
35
- var getNftCollectionMetrics = (nfts) => {
36
- const traits = nfts.map((nft) => {
37
- var _a;
38
- return (_a = nft == null ? void 0 : nft.metadata) == null ? void 0 : _a.attributes;
39
- }).filter((v) => v !== void 0).map((attributes2) => {
40
- return Object.fromEntries(attributes2.map((attribute) => [attribute.trait_type, attribute.value]));
41
- });
42
- const distribution = calculateAllPropertiesDistribution(traits);
43
- const n = nfts.length;
44
- const attributes = Object.fromEntries(
45
- Object.entries(distribution).filter((v) => v[1] !== void 0).map(([trait, entries]) => {
46
- const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0);
47
- const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n);
48
- const values = Object.fromEntries(
49
- Object.entries(entries).map(([value, traitValueCount]) => {
50
- const { p: p2 } = calculateBinomialParamsFromProbability(n, traitValueCount / n);
51
- const metrics = { binomial: { p: p2 }, count: traitValueCount };
52
- return [value, metrics];
53
- })
54
- );
55
- return [trait, { metrics: { binomial: { p }, count: traitCount }, values }];
56
- })
57
- );
58
- return { metadata: { attributes } };
59
- };
60
-
61
- // src/lib/contractHasFunctions.ts
62
- import { assertEx } from "@xylabs/assert";
63
- var contractHasFunctions = async (provider, address, contractInterface, functionNames) => {
64
- var _a;
65
- try {
66
- const bytecode = await provider.getCode(address, "latest");
67
- for (const functionName of functionNames) {
68
- const selector = assertEx((_a = contractInterface.getFunction(functionName)) == null ? void 0 : _a.selector, () => "Function not found on interface");
69
- if (!bytecode.includes(selector.slice(2))) {
70
- return false;
71
- }
72
- return true;
73
- }
74
- return false;
75
- } catch (ex) {
76
- const error = ex;
77
- console.log(error);
78
- return false;
79
- }
80
- };
81
-
82
- // src/lib/getNftCollectionNfts.ts
83
- import { AxiosJson } from "@xylabs/axios";
84
- import { exists } from "@xylabs/exists";
85
- import { isHexZero } from "@xylabs/hex";
86
- import { NftSchema, toTokenType } from "@xyo-network/crypto-nft-payload-plugin";
87
- import { getErc1822SlotStatus } from "@xyo-network/erc1822-witness";
88
- import { getErc1967SlotStatus } from "@xyo-network/erc1967-witness";
89
- import { ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory } from "@xyo-network/open-zeppelin-typechain";
90
- import { checkIpfsUrl } from "@xyo-network/witness-blockchain-abstract";
91
-
92
- // src/lib/tokenTypes.ts
93
- import { ERC721__factory, ERC1155URIStorage__factory } from "@xyo-network/open-zeppelin-typechain";
94
- var isErc1155 = async (provider, address) => {
95
- return await contractHasFunctions(provider, address, ERC1155URIStorage__factory.createInterface(), ["uri"]);
96
- };
97
- var isErc721 = async (provider, address) => {
98
- return await contractHasFunctions(provider, address, ERC721__factory.createInterface(), ["name", "symbol", "tokenURI"]);
99
- };
100
- var tokenTypes = async (provider, address) => {
101
- const [erc721, erc1155] = await Promise.all([isErc721(provider, address), isErc1155(provider, address)]);
102
- const result = [];
103
- if (erc721) {
104
- result.push("ERC721");
105
- }
106
- if (erc1155) {
107
- result.push("ERC1155");
108
- }
109
- return result;
110
- };
111
-
112
- // src/lib/tryCall.ts
113
- var tryCall = async (func, name) => {
114
- try {
115
- return await func();
116
- } catch (ex) {
117
- if (name) {
118
- const error = ex;
119
- console.log(`tryCall failed [${name}]: ${error.message}`);
120
- }
121
- return void 0;
122
- }
123
- };
124
-
125
- // src/lib/getNftCollectionNfts.ts
126
- var ipfsGateway = "5d7b6582.beta.decentralnetworkservices.com";
127
- function range(size, startAt = 0) {
128
- return [...Array(size).keys()].map((i) => i + startAt);
129
- }
130
- var getNftCollectionNfts = async (contractAddress, provider, types, maxNfts = 100) => {
131
- try {
132
- const block = await provider.getBlockNumber();
133
- const erc1967Status = await getErc1967SlotStatus(provider, contractAddress, block);
134
- const erc1822Status = await getErc1822SlotStatus(provider, contractAddress, block);
135
- const implementation = !erc1967Status.slots.implementation || isHexZero(erc1967Status.slots.implementation) ? erc1822Status.implementation : erc1967Status.implementation;
136
- const axios = new AxiosJson({ timeout: 2e3 });
137
- const enumerable = ERC721Enumerable__factory.connect(implementation, provider);
138
- const storage = ERC721URIStorage__factory.connect(implementation, provider);
139
- const supply1155 = ERC1155Supply__factory.connect(implementation, provider);
140
- const finalTypes = types ?? await tokenTypes(provider, implementation);
141
- const maxNftsArray = range(maxNfts);
142
- const result = (await Promise.all(
143
- maxNftsArray.map(async (_value, i) => {
144
- const tokenId = await tryCall(async () => await enumerable.tokenByIndex(i, { blockTag: block })) ?? BigInt(i);
145
- if (tokenId !== void 0) {
146
- const supply = finalTypes.includes(toTokenType("ERC1155")) ? await tryCall(async () => await supply1155["totalSupply(uint256)"](tokenId)) ?? "0x01" : "0x01";
147
- const metadataUri = await tryCall(async () => await storage.tokenURI(tokenId, { blockTag: block }));
148
- const checkedMetaDataUri = metadataUri ? checkIpfsUrl(metadataUri, ipfsGateway) : void 0;
149
- let metadata;
150
- if (checkedMetaDataUri !== void 0) {
151
- try {
152
- metadata = (await axios.get(checkedMetaDataUri)).data;
153
- } catch (ex) {
154
- const error = ex;
155
- console.error(`Get Metadata failed: ${error.message}`);
156
- }
157
- }
158
- const info = {
159
- address: contractAddress,
160
- chainId: Number((await provider.getNetwork()).chainId),
161
- metadata,
162
- metadataUri,
163
- schema: NftSchema,
164
- supply: `0x${supply.toString(16)}`,
165
- tokenId: `0x${tokenId.toString(16)}`,
166
- type: finalTypes.at(0),
167
- types: finalTypes
168
- };
169
- if (implementation !== contractAddress) {
170
- info.implementation = implementation;
171
- }
172
- return info;
173
- }
174
- })
175
- )).filter(exists);
176
- return result;
177
- } catch (ex) {
178
- const error = ex;
179
- console.error(`getNftCollectionNfts failed: [${error.name}] ${error.message}`);
180
- console.log(error.stack);
181
- return [];
182
- }
183
- };
184
-
185
- // src/Plugin.ts
186
- import { NftSchema as NftSchema2 } from "@xyo-network/crypto-nft-payload-plugin";
187
- import { PayloadSetSchema } from "@xyo-network/payload-model";
188
- import { createPayloadSetWitnessPlugin } from "@xyo-network/payloadset-plugin";
189
-
190
- // src/Witness.ts
191
- import { assertEx as assertEx2 } from "@xylabs/assert";
192
- import { EthAddress } from "@xylabs/eth-address";
193
- import {
194
- isNftCollectionWitnessQuery,
195
- NftCollectionSchema,
196
- NftCollectionWitnessConfigSchema
197
- } from "@xyo-network/crypto-nft-collection-payload-plugin";
198
- import { ERC721Enumerable__factory as ERC721Enumerable__factory2 } from "@xyo-network/open-zeppelin-typechain";
199
- import { PayloadBuilder } from "@xyo-network/payload-builder";
200
- import { AbstractEvmWitness } from "@xyo-network/witness-evm-abstract";
201
- var defaultMaxNfts = 100;
202
- var NoOp = Promise.resolve();
203
- function resolvedValue(settled, assert) {
204
- if (assert && settled.status === "rejected") {
205
- throw settled.reason;
206
- }
207
- return settled.status === "fulfilled" ? settled.value : void 0;
208
- }
209
- var CryptoNftCollectionWitness = class extends AbstractEvmWitness {
210
- static configSchemas = [...super.configSchemas, NftCollectionWitnessConfigSchema];
211
- static defaultConfigSchema = NftCollectionWitnessConfigSchema;
212
- async observeHandler(payloads) {
213
- await this.started("throw");
214
- await this.getProviders();
215
- const queries = (payloads == null ? void 0 : payloads.filter(isNftCollectionWitnessQuery)) ?? [];
216
- const observations = await Promise.all(
217
- queries.map(async (query) => {
218
- const chainId = assertEx2((query == null ? void 0 : query.chainId) || this.config.chainId, () => "params.chainId is required");
219
- const provider = await this.getProvider(true, true);
220
- const address = assertEx2(
221
- EthAddress.parse(assertEx2((query == null ? void 0 : query.address) || this.config.address, () => "params.address is required")),
222
- () => "Failed to parse params.address"
223
- ).toString();
224
- const erc721Enumerable = ERC721Enumerable__factory2.connect(address, provider);
225
- const maxNfts = (query == null ? void 0 : query.maxNfts) || defaultMaxNfts;
226
- const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([
227
- erc721Enumerable.name(),
228
- erc721Enumerable.symbol(),
229
- erc721Enumerable.totalSupply(),
230
- tokenTypes(provider, address),
231
- this.archivistInstance()
232
- ]);
233
- const types = resolvedValue(typesSettled, true);
234
- const nfts = await getNftCollectionNfts(address, provider, types, maxNfts);
235
- const metrics = getNftCollectionMetrics(nfts);
236
- const archivist = resolvedValue(archivistSettled);
237
- const [sources] = await Promise.all([
238
- // Hash all the payloads
239
- Promise.all(nfts.map((nft) => PayloadBuilder.dataHash(nft))),
240
- // Insert them into the archivist if we have one
241
- archivist ? archivist.insert(nfts) : NoOp
242
- ]);
243
- const payload = {
244
- address,
245
- chainId,
246
- metrics,
247
- name: resolvedValue(name, true),
248
- schema: NftCollectionSchema,
249
- sources,
250
- symbol: resolvedValue(symbol, true),
251
- total: Number(resolvedValue(total, true)),
252
- type: types.at(0),
253
- types
254
- };
255
- return payload;
256
- })
257
- );
258
- return observations.flat();
259
- }
260
- };
261
-
262
- // src/Plugin.ts
263
- var CryptoNftCollectionWitnessPlugin = () => createPayloadSetWitnessPlugin(
264
- { required: { [NftSchema2]: 1 }, schema: PayloadSetSchema },
265
- {
266
- witness: async (params) => {
267
- const result = await CryptoNftCollectionWitness.create(params);
268
- return result;
269
- }
270
- }
271
- );
272
- export {
273
- CryptoNftCollectionWitness,
274
- CryptoNftCollectionWitnessPlugin,
275
- contractHasFunctions,
276
- CryptoNftCollectionWitnessPlugin as default,
277
- getNftCollectionMetrics,
278
- getNftCollectionNfts,
279
- isErc1155,
280
- isErc721,
281
- tokenTypes
282
- };
1
+ var W=e=>{let t={};for(let s of e)for(let n in s)if(Object.prototype.hasOwnProperty.call(s,n)){let o=s[n];if(o!=null){let r=o.toString();t[n]?t[n][r]?t[n][r]+=1:t[n][r]=1:t[n]={[r]:1}}}return t};var w=(e,t)=>{let s=e*t,n=e*t*(1-t),o=Math.sqrt(n);return{mean:s,p:t,stdDev:o,variance:n}};var R=e=>{let t=e.map(r=>{var i;return(i=r==null?void 0:r.metadata)==null?void 0:i.attributes}).filter(r=>r!==void 0).map(r=>Object.fromEntries(r.map(i=>[i.trait_type,i.value]))),s=W(t),n=e.length;return{metadata:{attributes:Object.fromEntries(Object.entries(s).filter(r=>r[1]!==void 0).map(([r,i])=>{let a=Object.values(i).reduce((m,c)=>m+c,0),{p:l}=w(e.length,a/n),d=Object.fromEntries(Object.entries(i).map(([m,c])=>{let{p:f}=w(n,c/n);return[m,{binomial:{p:f},count:c}]}));return[r,{metrics:{binomial:{p:l},count:a},values:d}]}))}}};import{assertEx as F}from"@xylabs/assert";var v=async(e,t,s,n)=>{var o;try{let r=await e.getCode(t,"latest");for(let i of n){let a=F((o=s.getFunction(i))==null?void 0:o.selector,()=>"Function not found on interface");return!!r.includes(a.slice(2))}return!1}catch(r){return console.log(r),!1}};import{AxiosJson as $}from"@xylabs/axios";import{exists as H}from"@xylabs/exists";import{isHexZero as Q}from"@xylabs/hex";import{NftSchema as G,toTokenType as V}from"@xyo-network/crypto-nft-payload-plugin";import{getErc1822SlotStatus as J}from"@xyo-network/erc1822-witness";import{getErc1967SlotStatus as Z}from"@xyo-network/erc1967-witness";import{ERC721Enumerable__factory as z,ERC721URIStorage__factory as K,ERC1155Supply__factory as L}from"@xyo-network/open-zeppelin-typechain";import{checkIpfsUrl as X}from"@xyo-network/witness-blockchain-abstract";import{ERC721__factory as j,ERC1155URIStorage__factory as A}from"@xyo-network/open-zeppelin-typechain";var B=async(e,t)=>await v(e,t,A.createInterface(),["uri"]),U=async(e,t)=>await v(e,t,j.createInterface(),["name","symbol","tokenURI"]),h=async(e,t)=>{let[s,n]=await Promise.all([U(e,t),B(e,t)]),o=[];return s&&o.push("ERC721"),n&&o.push("ERC1155"),o};var S=async(e,t)=>{try{return await e()}catch(s){t&&console.log(`tryCall failed [${t}]: ${s.message}`);return}};var Y="5d7b6582.beta.decentralnetworkservices.com";function q(e,t=0){return[...Array(e).keys()].map(s=>s+t)}var _=async(e,t,s,n=100)=>{try{let o=await t.getBlockNumber(),r=await Z(t,e,o),i=await J(t,e,o),a=!r.slots.implementation||Q(r.slots.implementation)?i.implementation:r.implementation,l=new $({timeout:2e3}),d=z.connect(a,t),m=K.connect(a,t),c=L.connect(a,t),f=s??await h(t,a),g=q(n);return(await Promise.all(g.map(async(N,u)=>{let p=await S(async()=>await d.tokenByIndex(u,{blockTag:o}))??BigInt(u);if(p!==void 0){let C=f.includes(V("ERC1155"))?await S(async()=>await c["totalSupply(uint256)"](p))??"0x01":"0x01",y=await S(async()=>await m.tokenURI(p,{blockTag:o})),x=y?X(y,Y):void 0,P;if(x!==void 0)try{P=(await l.get(x)).data}catch(D){console.error(`Get Metadata failed: ${D.message}`)}let k={address:e,chainId:Number((await t.getNetwork()).chainId),metadata:P,metadataUri:y,schema:G,supply:`0x${C.toString(16)}`,tokenId:`0x${p.toString(16)}`,type:f.at(0),types:f};return a!==e&&(k.implementation=a),k}}))).filter(H)}catch(o){let r=o;return console.error(`getNftCollectionNfts failed: [${r.name}] ${r.message}`),console.log(r.stack),[]}};import{NftSchema as ct}from"@xyo-network/crypto-nft-payload-plugin";import{PayloadSetSchema as lt}from"@xyo-network/payload-model";import{createPayloadSetWitnessPlugin as mt}from"@xyo-network/payloadset-plugin";import{assertEx as E}from"@xylabs/assert";import{EthAddress as tt}from"@xylabs/eth-address";import{isNftCollectionWitnessQuery as et,NftCollectionSchema as ot,NftCollectionWitnessConfigSchema as M}from"@xyo-network/crypto-nft-collection-payload-plugin";import{ERC721Enumerable__factory as rt}from"@xyo-network/open-zeppelin-typechain";import{PayloadBuilder as nt}from"@xyo-network/payload-builder";import{AbstractEvmWitness as st}from"@xyo-network/witness-evm-abstract";var it=100,at=Promise.resolve();function b(e,t){if(t&&e.status==="rejected")throw e.reason;return e.status==="fulfilled"?e.value:void 0}var T=class extends st{static configSchemas=[...super.configSchemas,M];static defaultConfigSchema=M;async observeHandler(t){await this.started("throw"),await this.getProviders();let s=(t==null?void 0:t.filter(et))??[];return(await Promise.all(s.map(async o=>{let r=E((o==null?void 0:o.chainId)||this.config.chainId,()=>"params.chainId is required"),i=await this.getProvider(!0,!0),a=E(tt.parse(E((o==null?void 0:o.address)||this.config.address,()=>"params.address is required")),()=>"Failed to parse params.address").toString(),l=rt.connect(a,i),d=(o==null?void 0:o.maxNfts)||it,[m,c,f,g,I]=await Promise.allSettled([l.name(),l.symbol(),l.totalSupply(),h(i,a),this.archivistInstance()]),N=b(g,!0),u=await _(a,i,N,d),p=R(u),C=b(I),[y]=await Promise.all([Promise.all(u.map(P=>nt.dataHash(P))),C?C.insert(u):at]);return{address:a,chainId:r,metrics:p,name:b(m,!0),schema:ot,sources:y,symbol:b(c,!0),total:Number(b(f,!0)),type:N.at(0),types:N}}))).flat()}};var O=()=>mt({required:{[ct]:1},schema:lt},{witness:async e=>await T.create(e)});export{T as CryptoNftCollectionWitness,O as CryptoNftCollectionWitnessPlugin,v as contractHasFunctions,O as default,R as getNftCollectionMetrics,_ as getNftCollectionNfts,B as isErc1155,U as isErc721,h as tokenTypes};
283
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":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"],"sourcesContent":["import { Distribution } from './distribution'\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 { 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 { assertEx } from '@xylabs/assert'\nimport { 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 if (!bytecode.includes(selector.slice(2))) {\n return false\n }\n return true\n }\n return false\n } catch (ex) {\n const error = ex as Error\n console.log(error)\n return false\n }\n}\n","import { AxiosJson } from '@xylabs/axios'\nimport { exists } from '@xylabs/exists'\nimport { isHexZero } from '@xylabs/hex'\nimport { NftInfo, NftMetadata, NftSchema, TokenType, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\nimport { ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain-abstract'\nimport { Provider } from 'ethers'\n\nimport { tokenTypes } from './tokenTypes'\nimport { tryCall } from './tryCall'\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\nfunction range(size: number, startAt: number = 0): ReadonlyArray<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: string,\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 axios = new AxiosJson({ 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 axios.get(checkedMetaDataUri)).data\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 { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { Provider } from 'ethers'\n\nimport { contractHasFunctions } from './contractHasFunctions'\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 { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetWitnessPlugin, PayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { CryptoNftCollectionWitness } from './Witness'\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 { assertEx } from '@xylabs/assert'\nimport { EthAddress } from '@xylabs/eth-address'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionInfo,\n NftCollectionSchema,\n NftCollectionWitnessConfig,\n NftCollectionWitnessConfigSchema,\n NftCollectionWitnessQuery,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Schema } from '@xyo-network/payload-model'\nimport { AbstractEvmWitness, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\n\nimport { getNftCollectionMetrics, getNftCollectionNfts, tokenTypes } from './lib'\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.started('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 = 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 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: 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"],"mappings":"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","names":["attributes","p","NftSchema","assertEx","ERC721Enumerable__factory","assertEx","ERC721Enumerable__factory","NftSchema"]}
1
+ {"version":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"],"sourcesContent":["import { Distribution } from './distribution'\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 { 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 { assertEx } from '@xylabs/assert'\nimport { 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 if (!bytecode.includes(selector.slice(2))) {\n return false\n }\n return true\n }\n return false\n } catch (ex) {\n const error = ex as Error\n console.log(error)\n return false\n }\n}\n","import { AxiosJson } from '@xylabs/axios'\nimport { exists } from '@xylabs/exists'\nimport { isHexZero } from '@xylabs/hex'\nimport { NftInfo, NftMetadata, NftSchema, TokenType, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\nimport { ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain-abstract'\nimport { Provider } from 'ethers'\n\nimport { tokenTypes } from './tokenTypes'\nimport { tryCall } from './tryCall'\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\nfunction range(size: number, startAt: number = 0): ReadonlyArray<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: string,\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 axios = new AxiosJson({ 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 axios.get(checkedMetaDataUri)).data\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 { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { Provider } from 'ethers'\n\nimport { contractHasFunctions } from './contractHasFunctions'\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 { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetWitnessPlugin, PayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { CryptoNftCollectionWitness } from './Witness'\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 { assertEx } from '@xylabs/assert'\nimport { EthAddress } from '@xylabs/eth-address'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionInfo,\n NftCollectionSchema,\n NftCollectionWitnessConfig,\n NftCollectionWitnessConfigSchema,\n NftCollectionWitnessQuery,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Schema } from '@xyo-network/payload-model'\nimport { AbstractEvmWitness, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\n\nimport { getNftCollectionMetrics, getNftCollectionNfts, tokenTypes } from './lib'\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.started('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 = 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 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: 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"],"mappings":"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","names":["calculateAllPropertiesDistribution","array","distribution","item","property","value","valueString","calculateBinomialParamsFromProbability","n","p","mean","variance","stdDev","getNftCollectionMetrics","nfts","traits","nft","_a","v","attributes","attribute","distribution","calculateAllPropertiesDistribution","trait","entries","traitCount","prev","curr","p","calculateBinomialParamsFromProbability","values","value","traitValueCount","assertEx","contractHasFunctions","provider","address","contractInterface","functionNames","_a","bytecode","functionName","selector","ex","AxiosJson","exists","isHexZero","NftSchema","toTokenType","getErc1822SlotStatus","getErc1967SlotStatus","ERC721Enumerable__factory","ERC721URIStorage__factory","ERC1155Supply__factory","checkIpfsUrl","ERC721__factory","ERC1155URIStorage__factory","isErc1155","provider","address","contractHasFunctions","ERC1155URIStorage__factory","isErc721","ERC721__factory","tokenTypes","erc721","erc1155","result","tryCall","func","name","ex","ipfsGateway","range","size","startAt","i","getNftCollectionNfts","contractAddress","provider","types","maxNfts","block","erc1967Status","getErc1967SlotStatus","erc1822Status","getErc1822SlotStatus","implementation","isHexZero","axios","AxiosJson","enumerable","ERC721Enumerable__factory","storage","ERC721URIStorage__factory","supply1155","ERC1155Supply__factory","finalTypes","tokenTypes","maxNftsArray","_value","tokenId","tryCall","supply","toTokenType","metadataUri","checkedMetaDataUri","checkIpfsUrl","metadata","ex","info","NftSchema","exists","error","NftSchema","PayloadSetSchema","createPayloadSetWitnessPlugin","assertEx","EthAddress","isNftCollectionWitnessQuery","NftCollectionSchema","NftCollectionWitnessConfigSchema","ERC721Enumerable__factory","PayloadBuilder","AbstractEvmWitness","defaultMaxNfts","NoOp","resolvedValue","settled","assert","CryptoNftCollectionWitness","AbstractEvmWitness","NftCollectionWitnessConfigSchema","payloads","queries","isNftCollectionWitnessQuery","query","chainId","assertEx","provider","address","EthAddress","erc721Enumerable","ERC721Enumerable__factory","maxNfts","name","symbol","total","typesSettled","archivistSettled","tokenTypes","types","nfts","getNftCollectionNfts","metrics","getNftCollectionMetrics","archivist","sources","nft","PayloadBuilder","NftCollectionSchema","CryptoNftCollectionWitnessPlugin","createPayloadSetWitnessPlugin","NftSchema","PayloadSetSchema","params","CryptoNftCollectionWitness"]}
@@ -1 +1 @@
1
- {"version":3,"file":"calculateAllPropertiesDistribution.d.ts","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,eAAO,MAAM,kCAAkC,aAAc,CAAC,EAAE,KAAG,aAAa,CAAC,CAsBhF,CAAA"}
1
+ {"version":3,"file":"calculateAllPropertiesDistribution.d.ts","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,eAAO,MAAM,kCAAkC,GAAI,CAAC,SAAS,CAAC,EAAE,KAAG,YAAY,CAAC,CAAC,CAsBhF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"calculateAllPropertiesDistribution.d.ts","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,eAAO,MAAM,kCAAkC,aAAc,CAAC,EAAE,KAAG,aAAa,CAAC,CAsBhF,CAAA"}
1
+ {"version":3,"file":"calculateAllPropertiesDistribution.d.ts","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,eAAO,MAAM,kCAAkC,GAAI,CAAC,SAAS,CAAC,EAAE,KAAG,YAAY,CAAC,CAAC,CAsBhF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"calculateAllPropertiesDistribution.d.ts","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,eAAO,MAAM,kCAAkC,aAAc,CAAC,EAAE,KAAG,aAAa,CAAC,CAsBhF,CAAA"}
1
+ {"version":3,"file":"calculateAllPropertiesDistribution.d.ts","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,eAAO,MAAM,kCAAkC,GAAI,CAAC,SAAS,CAAC,EAAE,KAAG,YAAY,CAAC,CAAC,CAsBhF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"calculatePropertyDistribution.d.ts","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/calculatePropertyDistribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,eAAO,MAAM,6BAA6B,aAAc,CAAC,EAAE,YAAY,MAAM,CAAC,KAAG,aAAa,CAAC,CAgB9F,CAAA"}
1
+ {"version":3,"file":"calculatePropertyDistribution.d.ts","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/calculatePropertyDistribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,eAAO,MAAM,6BAA6B,GAAI,CAAC,SAAS,CAAC,EAAE,YAAY,MAAM,CAAC,KAAG,YAAY,CAAC,CAAC,CAgB9F,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"calculatePropertyDistribution.d.ts","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/calculatePropertyDistribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,eAAO,MAAM,6BAA6B,aAAc,CAAC,EAAE,YAAY,MAAM,CAAC,KAAG,aAAa,CAAC,CAgB9F,CAAA"}
1
+ {"version":3,"file":"calculatePropertyDistribution.d.ts","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/calculatePropertyDistribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,eAAO,MAAM,6BAA6B,GAAI,CAAC,SAAS,CAAC,EAAE,YAAY,MAAM,CAAC,KAAG,YAAY,CAAC,CAAC,CAgB9F,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"calculatePropertyDistribution.d.ts","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/calculatePropertyDistribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,eAAO,MAAM,6BAA6B,aAAc,CAAC,EAAE,YAAY,MAAM,CAAC,KAAG,aAAa,CAAC,CAgB9F,CAAA"}
1
+ {"version":3,"file":"calculatePropertyDistribution.d.ts","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/calculatePropertyDistribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,eAAO,MAAM,6BAA6B,GAAI,CAAC,SAAS,CAAC,EAAE,YAAY,MAAM,CAAC,KAAG,YAAY,CAAC,CAAC,CAgB9F,CAAA"}
@@ -1,8 +1,3 @@
1
1
  import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- /**
3
- * Calculates the parameters of a binomial distribution given a list of outcomes
4
- * @param outcomes List of outcomes, where 1 is a success and 0 is a failure
5
- * @returns The mean, standard deviation, and variance of the binomial distribution
6
- */
7
2
  export declare const calculateBinomialParamsFromOutcomes: (outcomes: number[]) => BinomialDistributionParameters;
8
3
  //# sourceMappingURL=calculateBinomialParamsFromOutcomes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"calculateBinomialParamsFromOutcomes.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,mDAAmD,CAAA;AAElG;;;;GAIG;AACH,eAAO,MAAM,mCAAmC,aAAc,MAAM,EAAE,KAAG,8BAYxE,CAAA"}
1
+ {"version":3,"file":"calculateBinomialParamsFromOutcomes.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,mDAAmD,CAAA;AAOlG,eAAO,MAAM,mCAAmC,aAAc,MAAM,EAAE,KAAG,8BAYxE,CAAA"}
@@ -1,8 +1,3 @@
1
1
  import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- /**
3
- * Calculates the parameters of a binomial distribution given a list of outcomes
4
- * @param outcomes List of outcomes, where 1 is a success and 0 is a failure
5
- * @returns The mean, standard deviation, and variance of the binomial distribution
6
- */
7
2
  export declare const calculateBinomialParamsFromOutcomes: (outcomes: number[]) => BinomialDistributionParameters;
8
3
  //# sourceMappingURL=calculateBinomialParamsFromOutcomes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"calculateBinomialParamsFromOutcomes.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,mDAAmD,CAAA;AAElG;;;;GAIG;AACH,eAAO,MAAM,mCAAmC,aAAc,MAAM,EAAE,KAAG,8BAYxE,CAAA"}
1
+ {"version":3,"file":"calculateBinomialParamsFromOutcomes.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,mDAAmD,CAAA;AAOlG,eAAO,MAAM,mCAAmC,aAAc,MAAM,EAAE,KAAG,8BAYxE,CAAA"}
@@ -1,8 +1,3 @@
1
1
  import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- /**
3
- * Calculates the parameters of a binomial distribution given a list of outcomes
4
- * @param outcomes List of outcomes, where 1 is a success and 0 is a failure
5
- * @returns The mean, standard deviation, and variance of the binomial distribution
6
- */
7
2
  export declare const calculateBinomialParamsFromOutcomes: (outcomes: number[]) => BinomialDistributionParameters;
8
3
  //# sourceMappingURL=calculateBinomialParamsFromOutcomes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"calculateBinomialParamsFromOutcomes.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,mDAAmD,CAAA;AAElG;;;;GAIG;AACH,eAAO,MAAM,mCAAmC,aAAc,MAAM,EAAE,KAAG,8BAYxE,CAAA"}
1
+ {"version":3,"file":"calculateBinomialParamsFromOutcomes.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,mDAAmD,CAAA;AAOlG,eAAO,MAAM,mCAAmC,aAAc,MAAM,EAAE,KAAG,8BAYxE,CAAA"}
@@ -1,9 +1,3 @@
1
1
  import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- /**
3
- * Calculates the parameters of a binomial distribution given the number of trials and success probability
4
- * @param n Number of trials
5
- * @param p Success probability
6
- * @returns The binomial distribution parameters
7
- */
8
2
  export declare const calculateBinomialParamsFromProbability: (n: number, p: number) => BinomialDistributionParameters;
9
3
  //# sourceMappingURL=calculateBinomialParamsFromProbability.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"calculateBinomialParamsFromProbability.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,mDAAmD,CAAA;AAElG;;;;;GAKG;AACH,eAAO,MAAM,sCAAsC,MAAO,MAAM,KAAK,MAAM,KAAG,8BAW7E,CAAA"}
1
+ {"version":3,"file":"calculateBinomialParamsFromProbability.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,mDAAmD,CAAA;AAQlG,eAAO,MAAM,sCAAsC,MAAO,MAAM,KAAK,MAAM,KAAG,8BAW7E,CAAA"}
@@ -1,9 +1,3 @@
1
1
  import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- /**
3
- * Calculates the parameters of a binomial distribution given the number of trials and success probability
4
- * @param n Number of trials
5
- * @param p Success probability
6
- * @returns The binomial distribution parameters
7
- */
8
2
  export declare const calculateBinomialParamsFromProbability: (n: number, p: number) => BinomialDistributionParameters;
9
3
  //# sourceMappingURL=calculateBinomialParamsFromProbability.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"calculateBinomialParamsFromProbability.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,mDAAmD,CAAA;AAElG;;;;;GAKG;AACH,eAAO,MAAM,sCAAsC,MAAO,MAAM,KAAK,MAAM,KAAG,8BAW7E,CAAA"}
1
+ {"version":3,"file":"calculateBinomialParamsFromProbability.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,mDAAmD,CAAA;AAQlG,eAAO,MAAM,sCAAsC,MAAO,MAAM,KAAK,MAAM,KAAG,8BAW7E,CAAA"}
@@ -1,9 +1,3 @@
1
1
  import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- /**
3
- * Calculates the parameters of a binomial distribution given the number of trials and success probability
4
- * @param n Number of trials
5
- * @param p Success probability
6
- * @returns The binomial distribution parameters
7
- */
8
2
  export declare const calculateBinomialParamsFromProbability: (n: number, p: number) => BinomialDistributionParameters;
9
3
  //# sourceMappingURL=calculateBinomialParamsFromProbability.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"calculateBinomialParamsFromProbability.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,mDAAmD,CAAA;AAElG;;;;;GAKG;AACH,eAAO,MAAM,sCAAsC,MAAO,MAAM,KAAK,MAAM,KAAG,8BAW7E,CAAA"}
1
+ {"version":3,"file":"calculateBinomialParamsFromProbability.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,mDAAmD,CAAA;AAQlG,eAAO,MAAM,sCAAsC,MAAO,MAAM,KAAK,MAAM,KAAG,8BAW7E,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getNftCollectionNfts.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionNfts.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAA0B,SAAS,EAAe,MAAM,wCAAwC,CAAA;AAKhH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAWjC,eAAO,MAAM,oBAAoB,oBAId,MAAM,YAIb,QAAQ,UACV,SAAS,EAAE,uBAOlB,QAAQ,OAAO,EAAE,CAsEnB,CAAA"}
1
+ {"version":3,"file":"getNftCollectionNfts.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionNfts.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAA0B,SAAS,EAAe,MAAM,wCAAwC,CAAA;AAKhH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAWjC,eAAO,MAAM,oBAAoB,oBAId,MAAM,YAIb,QAAQ,UACV,SAAS,EAAE,uBAOlB,OAAO,CAAC,OAAO,EAAE,CAsEnB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getNftCollectionNfts.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionNfts.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAA0B,SAAS,EAAe,MAAM,wCAAwC,CAAA;AAKhH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAWjC,eAAO,MAAM,oBAAoB,oBAId,MAAM,YAIb,QAAQ,UACV,SAAS,EAAE,uBAOlB,QAAQ,OAAO,EAAE,CAsEnB,CAAA"}
1
+ {"version":3,"file":"getNftCollectionNfts.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionNfts.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAA0B,SAAS,EAAe,MAAM,wCAAwC,CAAA;AAKhH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAWjC,eAAO,MAAM,oBAAoB,oBAId,MAAM,YAIb,QAAQ,UACV,SAAS,EAAE,uBAOlB,OAAO,CAAC,OAAO,EAAE,CAsEnB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getNftCollectionNfts.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionNfts.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAA0B,SAAS,EAAe,MAAM,wCAAwC,CAAA;AAKhH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAWjC,eAAO,MAAM,oBAAoB,oBAId,MAAM,YAIb,QAAQ,UACV,SAAS,EAAE,uBAOlB,QAAQ,OAAO,EAAE,CAsEnB,CAAA"}
1
+ {"version":3,"file":"getNftCollectionNfts.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionNfts.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAA0B,SAAS,EAAe,MAAM,wCAAwC,CAAA;AAKhH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAWjC,eAAO,MAAM,oBAAoB,oBAId,MAAM,YAIb,QAAQ,UACV,SAAS,EAAE,uBAOlB,OAAO,CAAC,OAAO,EAAE,CAsEnB,CAAA"}
@@ -1,6 +1,2 @@
1
- /**
2
- * These contracts are not evaluable for some
3
- * reason (too large, nonsensical, etc.)
4
- */
5
1
  export declare const nonEvaluableContractAddresses: string[];
6
2
  //# sourceMappingURL=nonEvaluableContractAddresses.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nonEvaluableContractAddresses.d.ts","sourceRoot":"","sources":["../../../src/lib/nonEvaluableContractAddresses.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,6BAA6B,UAGD,CAAA"}
1
+ {"version":3,"file":"nonEvaluableContractAddresses.d.ts","sourceRoot":"","sources":["../../../src/lib/nonEvaluableContractAddresses.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,6BAA6B,UAGD,CAAA"}
@@ -1,6 +1,2 @@
1
- /**
2
- * These contracts are not evaluable for some
3
- * reason (too large, nonsensical, etc.)
4
- */
5
1
  export declare const nonEvaluableContractAddresses: string[];
6
2
  //# sourceMappingURL=nonEvaluableContractAddresses.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nonEvaluableContractAddresses.d.ts","sourceRoot":"","sources":["../../../src/lib/nonEvaluableContractAddresses.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,6BAA6B,UAGD,CAAA"}
1
+ {"version":3,"file":"nonEvaluableContractAddresses.d.ts","sourceRoot":"","sources":["../../../src/lib/nonEvaluableContractAddresses.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,6BAA6B,UAGD,CAAA"}
@@ -1,6 +1,2 @@
1
- /**
2
- * These contracts are not evaluable for some
3
- * reason (too large, nonsensical, etc.)
4
- */
5
1
  export declare const nonEvaluableContractAddresses: string[];
6
2
  //# sourceMappingURL=nonEvaluableContractAddresses.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nonEvaluableContractAddresses.d.ts","sourceRoot":"","sources":["../../../src/lib/nonEvaluableContractAddresses.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,6BAA6B,UAGD,CAAA"}
1
+ {"version":3,"file":"nonEvaluableContractAddresses.d.ts","sourceRoot":"","sources":["../../../src/lib/nonEvaluableContractAddresses.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,6BAA6B,UAGD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"tryCall.d.ts","sourceRoot":"","sources":["../../../src/lib/tryCall.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,YAAmB,MAAM,QAAQ,CAAC,CAAC,SAAS,MAAM,KAAG,QAAQ,CAAC,GAAG,SAAS,CAU7F,CAAA"}
1
+ {"version":3,"file":"tryCall.d.ts","sourceRoot":"","sources":["../../../src/lib/tryCall.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,GAAU,CAAC,QAAQ,MAAM,OAAO,CAAC,CAAC,CAAC,SAAS,MAAM,KAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAU7F,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"tryCall.d.ts","sourceRoot":"","sources":["../../../src/lib/tryCall.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,YAAmB,MAAM,QAAQ,CAAC,CAAC,SAAS,MAAM,KAAG,QAAQ,CAAC,GAAG,SAAS,CAU7F,CAAA"}
1
+ {"version":3,"file":"tryCall.d.ts","sourceRoot":"","sources":["../../../src/lib/tryCall.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,GAAU,CAAC,QAAQ,MAAM,OAAO,CAAC,CAAC,CAAC,SAAS,MAAM,KAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAU7F,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"tryCall.d.ts","sourceRoot":"","sources":["../../../src/lib/tryCall.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,YAAmB,MAAM,QAAQ,CAAC,CAAC,SAAS,MAAM,KAAG,QAAQ,CAAC,GAAG,SAAS,CAU7F,CAAA"}
1
+ {"version":3,"file":"tryCall.d.ts","sourceRoot":"","sources":["../../../src/lib/tryCall.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,GAAU,CAAC,QAAQ,MAAM,OAAO,CAAC,CAAC,CAAC,SAAS,MAAM,KAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAU7F,CAAA"}