@xyo-network/crypto-nft-collection-witness-plugin 2.70.11 → 2.70.13

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 (50) 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 +16 -9
  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/docs.json +1442 -1673
  16. package/dist/esm/Witness.js +3 -2
  17. package/dist/esm/Witness.js.map +1 -1
  18. package/dist/esm/lib/collectionMetrics/getNftCollectionMetrics.js +17 -10
  19. package/dist/esm/lib/collectionMetrics/getNftCollectionMetrics.js.map +1 -1
  20. package/dist/esm/lib/collectionMetrics/lib/index.js +1 -0
  21. package/dist/esm/lib/collectionMetrics/lib/index.js.map +1 -1
  22. package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.js +19 -0
  23. package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.js.map +1 -0
  24. package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.js +16 -0
  25. package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.js.map +1 -0
  26. package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.js +3 -0
  27. package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.js.map +1 -0
  28. package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/index.js +2 -0
  29. package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/index.js.map +1 -0
  30. package/dist/types/Witness.d.ts.map +1 -1
  31. package/dist/types/lib/collectionMetrics/getNftCollectionMetrics.d.ts +1 -10
  32. package/dist/types/lib/collectionMetrics/getNftCollectionMetrics.d.ts.map +1 -1
  33. package/dist/types/lib/collectionMetrics/lib/index.d.ts +1 -0
  34. package/dist/types/lib/collectionMetrics/lib/index.d.ts.map +1 -1
  35. package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.ts +8 -0
  36. package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.ts.map +1 -0
  37. package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.ts +9 -0
  38. package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.ts.map +1 -0
  39. package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.ts +3 -0
  40. package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.ts.map +1 -0
  41. package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/index.d.ts +2 -0
  42. package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/index.d.ts.map +1 -0
  43. package/package.json +8 -8
  44. package/src/Witness.ts +3 -2
  45. package/src/lib/collectionMetrics/getNftCollectionMetrics.ts +23 -19
  46. package/src/lib/collectionMetrics/lib/index.ts +1 -0
  47. package/src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.ts +20 -0
  48. package/src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts +20 -0
  49. package/src/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.ts +2 -0
  50. package/src/lib/collectionMetrics/lib/probabilityDistributions/index.ts +1 -0
@@ -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,24 @@
1
- import { calculateAllPropertiesDistribution } from './lib';
1
+ import { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib';
2
2
  export const getNftCollectionMetrics = (nfts) => {
3
- const attributes = nfts
3
+ const traits = nfts
4
4
  .map((nft) => nft.metadata?.attributes)
5
5
  .map((attributes) => {
6
6
  return Object.fromEntries(attributes.map((attribute) => [attribute.trait_type, attribute.value]));
7
7
  });
8
- const distribution = calculateAllPropertiesDistribution(attributes);
9
- return {
10
- distribution: {
11
- metadata: {
12
- attributes: distribution,
13
- },
14
- },
15
- };
8
+ const distribution = calculateAllPropertiesDistribution(traits);
9
+ const n = nfts.length;
10
+ const attributes = Object.fromEntries(Object.entries(distribution)
11
+ .filter((v) => v[1] !== undefined)
12
+ .map(([trait, entries]) => {
13
+ const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0);
14
+ const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n);
15
+ const values = Object.fromEntries(Object.entries(entries).map(([value, traitValueCount]) => {
16
+ const { p } = calculateBinomialParamsFromProbability(n, traitValueCount / n);
17
+ const metrics = { binomial: { p }, count: traitValueCount };
18
+ return [value, metrics];
19
+ }));
20
+ return [trait, { metrics: { binomial: { p }, count: traitCount }, values }];
21
+ }));
22
+ return { metadata: { attributes } };
16
23
  };
17
24
  //# 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,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,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"}
@@ -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,oBAyBzD,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"}
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.11",
16
- "@xyo-network/crypto-nft-collection-payload-plugin": "~2.70.11",
17
- "@xyo-network/crypto-nft-payload-plugin": "~2.70.11",
18
- "@xyo-network/module": "~2.70.11",
19
- "@xyo-network/payload-model": "~2.70.11",
20
- "@xyo-network/payloadset-plugin": "~2.70.11",
21
- "@xyo-network/witness": "~2.70.11"
15
+ "@xyo-network/core": "~2.70.13",
16
+ "@xyo-network/crypto-nft-collection-payload-plugin": "~2.70.13",
17
+ "@xyo-network/crypto-nft-payload-plugin": "~2.70.13",
18
+ "@xyo-network/module": "~2.70.13",
19
+ "@xyo-network/payload-model": "~2.70.13",
20
+ "@xyo-network/payloadset-plugin": "~2.70.13",
21
+ "@xyo-network/witness": "~2.70.13"
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.11"
64
+ "version": "2.70.13"
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,33 @@
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
9
+ const traits = nfts
17
10
  .map((nft) => nft.metadata?.attributes as OpenSeaNftAttribute[])
18
11
  .map((attributes) => {
19
12
  return Object.fromEntries(attributes.map((attribute) => [attribute.trait_type, attribute.value]))
20
13
  })
21
- const distribution = calculateAllPropertiesDistribution(attributes)
22
- return {
23
- distribution: {
24
- metadata: {
25
- attributes: distribution,
26
- },
27
- },
28
- }
14
+ const distribution = calculateAllPropertiesDistribution(traits)
15
+ const n = nfts.length
16
+ const attributes = Object.fromEntries(
17
+ Object.entries(distribution)
18
+ .filter((v): v is TraitDistributionEntry => v[1] !== undefined)
19
+ .map(([trait, entries]) => {
20
+ const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0)
21
+ const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n)
22
+ const values = Object.fromEntries(
23
+ Object.entries(entries).map(([value, traitValueCount]) => {
24
+ const { p } = calculateBinomialParamsFromProbability(n, traitValueCount / n)
25
+ const metrics: NftTraitMetrics = { binomial: { p }, count: traitValueCount }
26
+ return [value, metrics]
27
+ }),
28
+ )
29
+ return [trait, { metrics: { binomial: { p }, count: traitCount }, values }]
30
+ }),
31
+ )
32
+ return { metadata: { attributes } }
29
33
  }
@@ -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'