@xyo-network/crypto-nft-collection-witness-plugin 2.70.12 → 2.70.14

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 (56) hide show
  1. package/dist/cjs/Witness.js +3 -2
  2. package/dist/cjs/Witness.js.map +1 -1
  3. package/dist/cjs/lib/collectionMetrics/getNftCollectionMetrics.js +18 -10
  4. package/dist/cjs/lib/collectionMetrics/getNftCollectionMetrics.js.map +1 -1
  5. package/dist/cjs/lib/collectionMetrics/lib/index.js +1 -0
  6. package/dist/cjs/lib/collectionMetrics/lib/index.js.map +1 -1
  7. package/dist/cjs/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.js +23 -0
  8. package/dist/cjs/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.js.map +1 -0
  9. package/dist/cjs/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.js +20 -0
  10. package/dist/cjs/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.js.map +1 -0
  11. package/dist/cjs/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.js +6 -0
  12. package/dist/cjs/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.js.map +1 -0
  13. package/dist/cjs/lib/collectionMetrics/lib/probabilityDistributions/index.js +5 -0
  14. package/dist/cjs/lib/collectionMetrics/lib/probabilityDistributions/index.js.map +1 -0
  15. package/dist/cjs/lib/getNftCollectionNfts.js +3 -1
  16. package/dist/cjs/lib/getNftCollectionNfts.js.map +1 -1
  17. package/dist/docs.json +1444 -1675
  18. package/dist/esm/Witness.js +3 -2
  19. package/dist/esm/Witness.js.map +1 -1
  20. package/dist/esm/lib/collectionMetrics/getNftCollectionMetrics.js +19 -11
  21. package/dist/esm/lib/collectionMetrics/getNftCollectionMetrics.js.map +1 -1
  22. package/dist/esm/lib/collectionMetrics/lib/index.js +1 -0
  23. package/dist/esm/lib/collectionMetrics/lib/index.js.map +1 -1
  24. package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.js +19 -0
  25. package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.js.map +1 -0
  26. package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.js +16 -0
  27. package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.js.map +1 -0
  28. package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.js +3 -0
  29. package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.js.map +1 -0
  30. package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/index.js +2 -0
  31. package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/index.js.map +1 -0
  32. package/dist/esm/lib/getNftCollectionNfts.js +3 -1
  33. package/dist/esm/lib/getNftCollectionNfts.js.map +1 -1
  34. package/dist/types/Witness.d.ts.map +1 -1
  35. package/dist/types/lib/collectionMetrics/getNftCollectionMetrics.d.ts +1 -10
  36. package/dist/types/lib/collectionMetrics/getNftCollectionMetrics.d.ts.map +1 -1
  37. package/dist/types/lib/collectionMetrics/lib/index.d.ts +1 -0
  38. package/dist/types/lib/collectionMetrics/lib/index.d.ts.map +1 -1
  39. package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.ts +8 -0
  40. package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.ts.map +1 -0
  41. package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.ts +9 -0
  42. package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.ts.map +1 -0
  43. package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.ts +3 -0
  44. package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.ts.map +1 -0
  45. package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/index.d.ts +2 -0
  46. package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/index.d.ts.map +1 -0
  47. package/dist/types/lib/getNftCollectionNfts.d.ts.map +1 -1
  48. package/package.json +8 -8
  49. package/src/Witness.ts +3 -2
  50. package/src/lib/collectionMetrics/getNftCollectionMetrics.ts +25 -20
  51. package/src/lib/collectionMetrics/lib/index.ts +1 -0
  52. package/src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.ts +20 -0
  53. package/src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts +20 -0
  54. package/src/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.ts +2 -0
  55. package/src/lib/collectionMetrics/lib/probabilityDistributions/index.ts +1 -0
  56. package/src/lib/getNftCollectionNfts.ts +3 -1
@@ -25,14 +25,15 @@ export class CryptoNftCollectionWitness extends AbstractWitness {
25
25
  getNftCollectionNfts(address, chainId, this.account.private.hex, maxNfts),
26
26
  this.writeArchivist(),
27
27
  ]);
28
- const distribution = getNftCollectionMetrics(nfts);
28
+ const metrics = getNftCollectionMetrics(nfts);
29
29
  const [sources] = await Promise.all([
30
30
  // Hash all the payloads
31
31
  Promise.all(nfts.map((nft) => PayloadHasher.hashAsync(nft))),
32
32
  // Insert them into the archivist if we have one
33
33
  archivist ? archivist.insert(nfts) : NoOp,
34
34
  ]);
35
- return { ...info, ...distribution, schema: NftCollectionSchema, sources, total };
35
+ const payload = { ...info, metrics, schema: NftCollectionSchema, sources, total };
36
+ return payload;
36
37
  }));
37
38
  return observations.flat();
38
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Witness.js","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EACL,kCAAkC,EAElC,mBAAmB,EAEnB,gCAAgC,GACjC,MAAM,mDAAmD,CAAA;AAG1D,OAAO,EAAE,eAAe,EAAiB,MAAM,sBAAsB,CAAA;AAErE,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,OAAO,CAAA;AAItH,MAAM,cAAc,GAAG,GAAG,CAAA;AAE1B;;;;GAIG;AACH,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;AAE9B,MAAM,OAAO,0BAEX,SAAQ,eAAwB;IAChC,MAAM,CAAU,aAAa,GAAG,CAAC,gCAAgC,CAAC,CAAA;IAE/C,KAAK,CAAC,cAAc,CAAC,QAAoB;QAC1D,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAC3B,MAAM,OAAO,GAAG,QAAQ,EAAE,MAAM,CAAC,kCAAkC,CAAC,IAAI,EAAE,CAAA;QAC1E,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CACpC,OAAO,CAAC,GAAG,CAAoC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAA;YAC7F,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAA;YAC7F,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,cAAc,CAAA;YAChD,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACvD,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;gBAChE,yBAAyB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;gBACrE,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC;gBACzE,IAAI,CAAC,cAAc,EAAE;aACtB,CAAC,CAAA;YACF,MAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAA;YAClD,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAClC,wBAAwB;gBACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC5D,gDAAgD;gBAChD,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;aAC1C,CAAC,CAAA;YACF,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,YAAY,EAAE,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;QAClF,CAAC,CAAC,CACH,CAAA;QACD,OAAO,YAAY,CAAC,IAAI,EAAE,CAAA;IAC5B,CAAC"}
1
+ {"version":3,"file":"Witness.js","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EACL,kCAAkC,EAElC,mBAAmB,EAEnB,gCAAgC,GACjC,MAAM,mDAAmD,CAAA;AAG1D,OAAO,EAAE,eAAe,EAAiB,MAAM,sBAAsB,CAAA;AAErE,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,OAAO,CAAA;AAItH,MAAM,cAAc,GAAG,GAAG,CAAA;AAE1B;;;;GAIG;AACH,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;AAE9B,MAAM,OAAO,0BAEX,SAAQ,eAAwB;IAChC,MAAM,CAAU,aAAa,GAAG,CAAC,gCAAgC,CAAC,CAAA;IAE/C,KAAK,CAAC,cAAc,CAAC,QAAoB;QAC1D,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAC3B,MAAM,OAAO,GAAG,QAAQ,EAAE,MAAM,CAAC,kCAAkC,CAAC,IAAI,EAAE,CAAA;QAC1E,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CACpC,OAAO,CAAC,GAAG,CAAoC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAA;YAC7F,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAA;YAC7F,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,cAAc,CAAA;YAChD,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACvD,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;gBAChE,yBAAyB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;gBACrE,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC;gBACzE,IAAI,CAAC,cAAc,EAAE;aACtB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAA;YAC7C,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAClC,wBAAwB;gBACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC5D,gDAAgD;gBAChD,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;aAC1C,CAAC,CAAA;YACF,MAAM,OAAO,GAA6B,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;YAC3G,OAAO,OAAO,CAAA;QAChB,CAAC,CAAC,CACH,CAAA;QACD,OAAO,YAAY,CAAC,IAAI,EAAE,CAAA;IAC5B,CAAC"}
@@ -1,17 +1,25 @@
1
- import { calculateAllPropertiesDistribution } from './lib';
1
+ import { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib';
2
2
  export const getNftCollectionMetrics = (nfts) => {
3
- const attributes = nfts
4
- .map((nft) => nft.metadata?.attributes)
3
+ const traits = nfts
4
+ .map((nft) => nft?.metadata?.attributes)
5
+ .filter((v) => v !== undefined)
5
6
  .map((attributes) => {
6
7
  return Object.fromEntries(attributes.map((attribute) => [attribute.trait_type, attribute.value]));
7
8
  });
8
- const distribution = calculateAllPropertiesDistribution(attributes);
9
- return {
10
- distribution: {
11
- metadata: {
12
- attributes: distribution,
13
- },
14
- },
15
- };
9
+ const distribution = calculateAllPropertiesDistribution(traits);
10
+ const n = nfts.length;
11
+ const attributes = Object.fromEntries(Object.entries(distribution)
12
+ .filter((v) => v[1] !== undefined)
13
+ .map(([trait, entries]) => {
14
+ const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0);
15
+ const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n);
16
+ const values = Object.fromEntries(Object.entries(entries).map(([value, traitValueCount]) => {
17
+ const { p } = calculateBinomialParamsFromProbability(n, traitValueCount / n);
18
+ const metrics = { binomial: { p }, count: traitValueCount };
19
+ return [value, metrics];
20
+ }));
21
+ return [trait, { metrics: { binomial: { p }, count: traitCount }, values }];
22
+ }));
23
+ return { metadata: { attributes } };
16
24
  };
17
25
  //# sourceMappingURL=getNftCollectionMetrics.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getNftCollectionMetrics.js","sourceRoot":"","sources":["../../../../src/lib/collectionMetrics/getNftCollectionMetrics.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kCAAkC,EAAgB,MAAM,OAAO,CAAA;AAYxE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,IAAe,EAAwB,EAAE;IAC/E,MAAM,UAAU,GAAG,IAAI;SACpB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAmC,CAAC;SAC/D,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;QAClB,OAAO,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACnG,CAAC,CAAC,CAAA;IACJ,MAAM,YAAY,GAAG,kCAAkC,CAAC,UAAU,CAAC,CAAA;IACnE,OAAO;QACL,YAAY,EAAE;YACZ,QAAQ,EAAE;gBACR,UAAU,EAAE,YAAY;aACzB;SACF;KACF,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"getNftCollectionMetrics.js","sourceRoot":"","sources":["../../../../src/lib/collectionMetrics/getNftCollectionMetrics.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kCAAkC,EAAE,sCAAsC,EAAE,MAAM,OAAO,CAAA;AAIlG,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,IAAe,EAAwB,EAAE;IAC/E,MAAM,MAAM,GAAG,IAAI;SAChB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,UAA+C,CAAC;SAC5E,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;SAC1D,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;QAClB,OAAO,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACnG,CAAC,CAAC,CAAA;IACJ,MAAM,YAAY,GAAG,kCAAkC,CAAC,MAAM,CAAC,CAAA;IAC/D,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;IACrB,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CACnC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;SACzB,MAAM,CAAC,CAAC,CAAC,EAA+B,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;SAC9D,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE;QACxB,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC,CAAA;QAChF,MAAM,EAAE,CAAC,EAAE,GAAG,sCAAsC,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,CAAC,CAAC,CAAA;QACjF,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAC/B,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,eAAe,CAAC,EAAE,EAAE;YACvD,MAAM,EAAE,CAAC,EAAE,GAAG,sCAAsC,CAAC,CAAC,EAAE,eAAe,GAAG,CAAC,CAAC,CAAA;YAC5E,MAAM,OAAO,GAAoB,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,CAAA;YAC5E,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACzB,CAAC,CAAC,CACH,CAAA;QACD,OAAO,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IAC7E,CAAC,CAAC,CACL,CAAA;IACD,OAAO,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAE,CAAA;AACrC,CAAC,CAAA"}
@@ -1,3 +1,4 @@
1
1
  export * from './calculateAllPropertiesDistribution';
2
2
  export * from './distribution';
3
+ export * from './probabilityDistributions';
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAA;AACpD,cAAc,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAA;AACpD,cAAc,gBAAgB,CAAA;AAC9B,cAAc,4BAA4B,CAAA"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Calculates the parameters of a binomial distribution given a list of outcomes
3
+ * @param outcomes List of outcomes, where 1 is a success and 0 is a failure
4
+ * @returns The mean, standard deviation, and variance of the binomial distribution
5
+ */
6
+ export const calculateBinomialParamsFromOutcomes = (outcomes) => {
7
+ const n = outcomes.length;
8
+ // Calculate p: the proportion of successes
9
+ const sum = outcomes.reduce((acc, value) => acc + value, 0);
10
+ const p = sum / n;
11
+ // Mean (µ)
12
+ const mean = n * p;
13
+ // Variance (σ^2)
14
+ const variance = n * p * (1 - p);
15
+ // Standard Deviation (σ)
16
+ const stdDev = Math.sqrt(variance);
17
+ return { mean, p, stdDev, variance };
18
+ };
19
+ //# sourceMappingURL=calculateBinomialParamsFromOutcomes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculateBinomialParamsFromOutcomes.js","sourceRoot":"","sources":["../../../../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC,QAAkB,EAAkC,EAAE;IACxG,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAA;IACzB,2CAA2C;IAC3C,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAA;IAC3D,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,CAAA;IACjB,WAAW;IACX,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IAClB,iBAAiB;IACjB,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAChC,yBAAyB;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAClC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;AACtC,CAAC,CAAA"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Calculates the parameters of a binomial distribution given the number of trials and success probability
3
+ * @param n Number of trials
4
+ * @param p Success probability
5
+ * @returns The binomial distribution parameters
6
+ */
7
+ export const calculateBinomialParamsFromProbability = (n, p) => {
8
+ // Mean (µ)
9
+ const mean = n * p;
10
+ // Variance (σ^2)
11
+ const variance = n * p * (1 - p);
12
+ // Standard Deviation (σ)
13
+ const stdDev = Math.sqrt(variance);
14
+ return { mean, p, stdDev, variance };
15
+ };
16
+ //# sourceMappingURL=calculateBinomialParamsFromProbability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculateBinomialParamsFromProbability.js","sourceRoot":"","sources":["../../../../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sCAAsC,GAAG,CAAC,CAAS,EAAE,CAAS,EAAkC,EAAE;IAC7G,WAAW;IACX,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IAElB,iBAAiB;IACjB,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAEhC,yBAAyB;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAElC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;AACtC,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from './calculateBinomialParamsFromOutcomes';
2
+ export * from './calculateBinomialParamsFromProbability';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.ts"],"names":[],"mappings":"AAAA,cAAc,uCAAuC,CAAA;AACrD,cAAc,0CAA0C,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './binomial';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/lib/collectionMetrics/lib/probabilityDistributions/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA"}
@@ -33,7 +33,9 @@ maxNfts = 100) => {
33
33
  do {
34
34
  const opts = { contractAddress, cursor };
35
35
  const { cursor: nextCursor, pageSize, total, assets } = await sdk.api.getNFTsForCollection(opts);
36
- const batch = assets.slice(0, Math.min(pageSize, total - nfts.length));
36
+ const batch = assets.slice(0, Math.min(pageSize, total - nfts.length)).map((asset) => {
37
+ return { ...asset, chainId };
38
+ });
37
39
  nfts.push(...batch);
38
40
  cursor = nextCursor;
39
41
  if (nfts.length >= total || !cursor)
@@ -1 +1 @@
1
- {"version":3,"file":"getNftCollectionNfts.js","sourceRoot":"","sources":["../../../src/lib/getNftCollectionNfts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAA2B,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAE3F,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAA;AAO/E,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK;AACvC;;GAEG;AACH,eAAuB;AACvB;;GAEG;AACH,OAAe;AACf,MAAM;AACN,mDAAmD;AACnD,MAAM;AACN,iDAAiD;AACjD;;GAEG;AACH,UAAkB;AAClB;;;;GAIG;AACH,OAAO,GAAG,GAAG,EACc,EAAE;IAC7B,IAAI,6BAA6B,CAAC,QAAQ,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,EAAE;QACzE,MAAM,IAAI,KAAK,CAAC,uDAAuD,eAAe,EAAE,CAAC,CAAA;KAC1F;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAA;IAC7I,MAAM,IAAI,GAAc,EAAE,CAAA;IAC1B,IAAI,MAAM,GAAuB,SAAS,CAAA;IAC1C,GAAG;QACD,MAAM,IAAI,GAA2B,EAAE,eAAe,EAAE,MAAM,EAAE,CAAA;QAChE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;QAChG,MAAM,KAAK,GAAc,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QACjF,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAA;QACnB,MAAM,GAAG,UAAU,CAAA;QACnB,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,IAAI,CAAC,MAAM;YAAE,MAAK;KAC3C,QAAQ,IAAI,CAAC,MAAM,GAAG,OAAO,EAAC;IAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACtB,OAAO,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IACtC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
1
+ {"version":3,"file":"getNftCollectionNfts.js","sourceRoot":"","sources":["../../../src/lib/getNftCollectionNfts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAA2B,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAE3F,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAA;AAO/E,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK;AACvC;;GAEG;AACH,eAAuB;AACvB;;GAEG;AACH,OAAe;AACf,MAAM;AACN,mDAAmD;AACnD,MAAM;AACN,iDAAiD;AACjD;;GAEG;AACH,UAAkB;AAClB;;;;GAIG;AACH,OAAO,GAAG,GAAG,EACc,EAAE;IAC7B,IAAI,6BAA6B,CAAC,QAAQ,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,EAAE;QACzE,MAAM,IAAI,KAAK,CAAC,uDAAuD,eAAe,EAAE,CAAC,CAAA;KAC1F;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAA;IAC7I,MAAM,IAAI,GAAc,EAAE,CAAA;IAC1B,IAAI,MAAM,GAAuB,SAAS,CAAA;IAC1C,GAAG;QACD,MAAM,IAAI,GAA2B,EAAE,eAAe,EAAE,MAAM,EAAE,CAAA;QAChE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;QAChG,MAAM,KAAK,GAAc,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9F,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,CAAA;QAC9B,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAA;QACnB,MAAM,GAAG,UAAU,CAAA;QACnB,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,IAAI,CAAC,MAAM;YAAE,MAAK;KAC3C,QAAQ,IAAI,CAAC,MAAM,GAAG,OAAO,EAAC;IAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACtB,OAAO,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IACtC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,0BAA0B,EAE3B,MAAM,mDAAmD,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAIrE,MAAM,MAAM,gCAAgC,GAAG,aAAa,CAAC,eAAe,CAAC,0BAA0B,CAAC,CAAC,CAAA;AAWzG,qBAAa,0BAA0B,CACrC,OAAO,SAAS,gCAAgC,GAAG,gCAAgC,CACnF,SAAQ,eAAe,CAAC,OAAO,CAAC;IAChC,OAAgB,aAAa,uDAAqC;cAEzC,cAAc,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CA0BlF"}
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,0BAA0B,EAE3B,MAAM,mDAAmD,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAIrE,MAAM,MAAM,gCAAgC,GAAG,aAAa,CAAC,eAAe,CAAC,0BAA0B,CAAC,CAAC,CAAA;AAWzG,qBAAa,0BAA0B,CACrC,OAAO,SAAS,gCAAgC,GAAG,gCAAgC,CACnF,SAAQ,eAAe,CAAC,OAAO,CAAC;IAChC,OAAgB,aAAa,uDAAqC;cAEzC,cAAc,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CA2BlF"}
@@ -1,13 +1,4 @@
1
+ import { NftCollectionMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin';
1
2
  import { NftInfo } from '@xyo-network/crypto-nft-payload-plugin';
2
- import { Distribution } from './lib';
3
- export interface NftCollectionMetrics {
4
- distribution: {
5
- metadata: {
6
- attributes: Distribution<{
7
- [key: string]: string | number;
8
- }>;
9
- };
10
- };
11
- }
12
3
  export declare const getNftCollectionMetrics: (nfts: NftInfo[]) => NftCollectionMetrics;
13
4
  //# sourceMappingURL=getNftCollectionMetrics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getNftCollectionMetrics.d.ts","sourceRoot":"","sources":["../../../../src/lib/collectionMetrics/getNftCollectionMetrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAuB,MAAM,wCAAwC,CAAA;AAErF,OAAO,EAAsC,YAAY,EAAE,MAAM,OAAO,CAAA;AAExE,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE;QACZ,QAAQ,EAAE;YACR,UAAU,EAAE,YAAY,CAAC;gBACvB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;aAC/B,CAAC,CAAA;SACH,CAAA;KACF,CAAA;CACF;AAED,eAAO,MAAM,uBAAuB,SAAU,OAAO,EAAE,KAAG,oBAczD,CAAA"}
1
+ {"version":3,"file":"getNftCollectionMetrics.d.ts","sourceRoot":"","sources":["../../../../src/lib/collectionMetrics/getNftCollectionMetrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,mDAAmD,CAAA;AACzG,OAAO,EAAE,OAAO,EAAuB,MAAM,wCAAwC,CAAA;AAMrF,eAAO,MAAM,uBAAuB,SAAU,OAAO,EAAE,KAAG,oBA0BzD,CAAA"}
@@ -1,3 +1,4 @@
1
1
  export * from './calculateAllPropertiesDistribution';
2
2
  export * from './distribution';
3
+ export * from './probabilityDistributions';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAA;AACpD,cAAc,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/collectionMetrics/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAA;AACpD,cAAc,gBAAgB,CAAA;AAC9B,cAAc,4BAA4B,CAAA"}
@@ -0,0 +1,8 @@
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
+ export declare const calculateBinomialParamsFromOutcomes: (outcomes: number[]) => BinomialDistributionParameters;
8
+ //# sourceMappingURL=calculateBinomialParamsFromOutcomes.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,9 @@
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
+ export declare const calculateBinomialParamsFromProbability: (n: number, p: number) => BinomialDistributionParameters;
9
+ //# sourceMappingURL=calculateBinomialParamsFromProbability.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,3 @@
1
+ export * from './calculateBinomialParamsFromOutcomes';
2
+ export * from './calculateBinomialParamsFromProbability';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.ts"],"names":[],"mappings":"AAAA,cAAc,uCAAuC,CAAA;AACrD,cAAc,0CAA0C,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './binomial';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/collectionMetrics/lib/probabilityDistributions/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getNftCollectionNfts.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionNfts.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,cAAc,EAAa,MAAM,wCAAwC,CAAA;AAS3F,eAAO,MAAM,oBAAoB,oBAId,MAAM,WAId,MAAM,cAQH,MAAM,uBAOjB,QAAQ,cAAc,EAAE,CAkB1B,CAAA"}
1
+ {"version":3,"file":"getNftCollectionNfts.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftCollectionNfts.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,cAAc,EAAa,MAAM,wCAAwC,CAAA;AAS3F,eAAO,MAAM,oBAAoB,oBAId,MAAM,WAId,MAAM,cAQH,MAAM,uBAOjB,QAAQ,cAAc,EAAE,CAoB1B,CAAA"}
package/package.json CHANGED
@@ -12,13 +12,13 @@
12
12
  "dependencies": {
13
13
  "@infura/sdk": "^2.4.3",
14
14
  "@xylabs/assert": "^2.9.3",
15
- "@xyo-network/core": "~2.70.12",
16
- "@xyo-network/crypto-nft-collection-payload-plugin": "~2.70.12",
17
- "@xyo-network/crypto-nft-payload-plugin": "~2.70.12",
18
- "@xyo-network/module": "~2.70.12",
19
- "@xyo-network/payload-model": "~2.70.12",
20
- "@xyo-network/payloadset-plugin": "~2.70.12",
21
- "@xyo-network/witness": "~2.70.12"
15
+ "@xyo-network/core": "~2.70.14",
16
+ "@xyo-network/crypto-nft-collection-payload-plugin": "~2.70.14",
17
+ "@xyo-network/crypto-nft-payload-plugin": "~2.70.14",
18
+ "@xyo-network/module": "~2.70.14",
19
+ "@xyo-network/payload-model": "~2.70.14",
20
+ "@xyo-network/payloadset-plugin": "~2.70.14",
21
+ "@xyo-network/witness": "~2.70.14"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@xylabs/jest-helpers": "^2.9.3",
@@ -61,5 +61,5 @@
61
61
  },
62
62
  "sideEffects": false,
63
63
  "types": "dist/types/index.d.ts",
64
- "version": "2.70.12"
64
+ "version": "2.70.14"
65
65
  }
package/src/Witness.ts CHANGED
@@ -43,14 +43,15 @@ export class CryptoNftCollectionWitness<
43
43
  getNftCollectionNfts(address, chainId, this.account.private.hex, maxNfts),
44
44
  this.writeArchivist(),
45
45
  ])
46
- const distribution = getNftCollectionMetrics(nfts)
46
+ const metrics = getNftCollectionMetrics(nfts)
47
47
  const [sources] = await Promise.all([
48
48
  // Hash all the payloads
49
49
  Promise.all(nfts.map((nft) => PayloadHasher.hashAsync(nft))),
50
50
  // Insert them into the archivist if we have one
51
51
  archivist ? archivist.insert(nfts) : NoOp,
52
52
  ])
53
- return { ...info, ...distribution, schema: NftCollectionSchema, sources, total }
53
+ const payload: NftCollectionInfoPayload = { ...info, metrics, schema: NftCollectionSchema, sources, total }
54
+ return payload
54
55
  }),
55
56
  )
56
57
  return observations.flat()
@@ -1,29 +1,34 @@
1
+ import { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'
1
2
  import { NftInfo, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'
2
3
 
3
- import { calculateAllPropertiesDistribution, Distribution } from './lib'
4
+ import { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib'
4
5
 
5
- export interface NftCollectionMetrics {
6
- distribution: {
7
- metadata: {
8
- attributes: Distribution<{
9
- [key: string]: string | number
10
- }>
11
- }
12
- }
13
- }
6
+ type TraitDistributionEntry = [string, { [key: string]: number }]
14
7
 
15
8
  export const getNftCollectionMetrics = (nfts: NftInfo[]): NftCollectionMetrics => {
16
- const attributes = nfts
17
- .map((nft) => nft.metadata?.attributes as OpenSeaNftAttribute[])
9
+ const traits = nfts
10
+ .map((nft) => nft?.metadata?.attributes as OpenSeaNftAttribute[] | undefined)
11
+ .filter((v): v is OpenSeaNftAttribute[] => v !== undefined)
18
12
  .map((attributes) => {
19
13
  return Object.fromEntries(attributes.map((attribute) => [attribute.trait_type, attribute.value]))
20
14
  })
21
- const distribution = calculateAllPropertiesDistribution(attributes)
22
- return {
23
- distribution: {
24
- metadata: {
25
- attributes: distribution,
26
- },
27
- },
28
- }
15
+ const distribution = calculateAllPropertiesDistribution(traits)
16
+ const n = nfts.length
17
+ const attributes = Object.fromEntries(
18
+ Object.entries(distribution)
19
+ .filter((v): v is TraitDistributionEntry => v[1] !== undefined)
20
+ .map(([trait, entries]) => {
21
+ const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0)
22
+ const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n)
23
+ const values = Object.fromEntries(
24
+ Object.entries(entries).map(([value, traitValueCount]) => {
25
+ const { p } = calculateBinomialParamsFromProbability(n, traitValueCount / n)
26
+ const metrics: NftTraitMetrics = { binomial: { p }, count: traitValueCount }
27
+ return [value, metrics]
28
+ }),
29
+ )
30
+ return [trait, { metrics: { binomial: { p }, count: traitCount }, values }]
31
+ }),
32
+ )
33
+ return { metadata: { attributes } }
29
34
  }
@@ -1,2 +1,3 @@
1
1
  export * from './calculateAllPropertiesDistribution'
2
2
  export * from './distribution'
3
+ export * from './probabilityDistributions'
@@ -0,0 +1,20 @@
1
+ import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin'
2
+
3
+ /**
4
+ * Calculates the parameters of a binomial distribution given a list of outcomes
5
+ * @param outcomes List of outcomes, where 1 is a success and 0 is a failure
6
+ * @returns The mean, standard deviation, and variance of the binomial distribution
7
+ */
8
+ export const calculateBinomialParamsFromOutcomes = (outcomes: number[]): BinomialDistributionParameters => {
9
+ const n = outcomes.length
10
+ // Calculate p: the proportion of successes
11
+ const sum = outcomes.reduce((acc, value) => acc + value, 0)
12
+ const p = sum / n
13
+ // Mean (µ)
14
+ const mean = n * p
15
+ // Variance (σ^2)
16
+ const variance = n * p * (1 - p)
17
+ // Standard Deviation (σ)
18
+ const stdDev = Math.sqrt(variance)
19
+ return { mean, p, stdDev, variance }
20
+ }
@@ -0,0 +1,20 @@
1
+ import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin'
2
+
3
+ /**
4
+ * Calculates the parameters of a binomial distribution given the number of trials and success probability
5
+ * @param n Number of trials
6
+ * @param p Success probability
7
+ * @returns The binomial distribution parameters
8
+ */
9
+ export const calculateBinomialParamsFromProbability = (n: number, p: number): BinomialDistributionParameters => {
10
+ // Mean (µ)
11
+ const mean = n * p
12
+
13
+ // Variance (σ^2)
14
+ const variance = n * p * (1 - p)
15
+
16
+ // Standard Deviation (σ)
17
+ const stdDev = Math.sqrt(variance)
18
+
19
+ return { mean, p, stdDev, variance }
20
+ }
@@ -0,0 +1,2 @@
1
+ export * from './calculateBinomialParamsFromOutcomes'
2
+ export * from './calculateBinomialParamsFromProbability'
@@ -0,0 +1 @@
1
+ export * from './binomial'
@@ -41,7 +41,9 @@ export const getNftCollectionNfts = async (
41
41
  do {
42
42
  const opts: ContractAddressOptions = { contractAddress, cursor }
43
43
  const { cursor: nextCursor, pageSize, total, assets } = await sdk.api.getNFTsForCollection(opts)
44
- const batch: NftInfo[] = assets.slice(0, Math.min(pageSize, total - nfts.length))
44
+ const batch: NftInfo[] = assets.slice(0, Math.min(pageSize, total - nfts.length)).map((asset) => {
45
+ return { ...asset, chainId }
46
+ })
45
47
  nfts.push(...batch)
46
48
  cursor = nextCursor
47
49
  if (nfts.length >= total || !cursor) break