@xyo-network/crypto-nft-collection-witness-plugin 2.70.12 → 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.
- package/dist/cjs/Witness.js +3 -2
- package/dist/cjs/Witness.js.map +1 -1
- package/dist/cjs/lib/collectionMetrics/getNftCollectionMetrics.js +16 -9
- package/dist/cjs/lib/collectionMetrics/getNftCollectionMetrics.js.map +1 -1
- package/dist/cjs/lib/collectionMetrics/lib/index.js +1 -0
- package/dist/cjs/lib/collectionMetrics/lib/index.js.map +1 -1
- package/dist/cjs/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.js +23 -0
- package/dist/cjs/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.js.map +1 -0
- package/dist/cjs/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.js +20 -0
- package/dist/cjs/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.js.map +1 -0
- package/dist/cjs/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.js +6 -0
- package/dist/cjs/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.js.map +1 -0
- package/dist/cjs/lib/collectionMetrics/lib/probabilityDistributions/index.js +5 -0
- package/dist/cjs/lib/collectionMetrics/lib/probabilityDistributions/index.js.map +1 -0
- package/dist/docs.json +1442 -1673
- package/dist/esm/Witness.js +3 -2
- package/dist/esm/Witness.js.map +1 -1
- package/dist/esm/lib/collectionMetrics/getNftCollectionMetrics.js +17 -10
- package/dist/esm/lib/collectionMetrics/getNftCollectionMetrics.js.map +1 -1
- package/dist/esm/lib/collectionMetrics/lib/index.js +1 -0
- package/dist/esm/lib/collectionMetrics/lib/index.js.map +1 -1
- package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.js +19 -0
- package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.js.map +1 -0
- package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.js +16 -0
- package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.js.map +1 -0
- package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.js +3 -0
- package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.js.map +1 -0
- package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/index.js +2 -0
- package/dist/esm/lib/collectionMetrics/lib/probabilityDistributions/index.js.map +1 -0
- package/dist/types/Witness.d.ts.map +1 -1
- package/dist/types/lib/collectionMetrics/getNftCollectionMetrics.d.ts +1 -10
- package/dist/types/lib/collectionMetrics/getNftCollectionMetrics.d.ts.map +1 -1
- package/dist/types/lib/collectionMetrics/lib/index.d.ts +1 -0
- package/dist/types/lib/collectionMetrics/lib/index.d.ts.map +1 -1
- package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.ts +8 -0
- package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.d.ts.map +1 -0
- package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.ts +9 -0
- package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.d.ts.map +1 -0
- package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.ts +3 -0
- package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.ts.map +1 -0
- package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/index.d.ts +2 -0
- package/dist/types/lib/collectionMetrics/lib/probabilityDistributions/index.d.ts.map +1 -0
- package/package.json +8 -8
- package/src/Witness.ts +3 -2
- package/src/lib/collectionMetrics/getNftCollectionMetrics.ts +23 -19
- package/src/lib/collectionMetrics/lib/index.ts +1 -0
- package/src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.ts +20 -0
- package/src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts +20 -0
- package/src/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.ts +2 -0
- package/src/lib/collectionMetrics/lib/probabilityDistributions/index.ts +1 -0
package/dist/esm/Witness.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
35
|
+
const payload = { ...info, metrics, schema: NftCollectionSchema, sources, total };
|
|
36
|
+
return payload;
|
|
36
37
|
}));
|
|
37
38
|
return observations.flat();
|
|
38
39
|
}
|
package/dist/esm/Witness.js.map
CHANGED
|
@@ -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,
|
|
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
|
|
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(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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":"
|
|
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 +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 @@
|
|
|
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 @@
|
|
|
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;
|
|
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,
|
|
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 +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 @@
|
|
|
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 @@
|
|
|
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.
|
|
16
|
-
"@xyo-network/crypto-nft-collection-payload-plugin": "~2.70.
|
|
17
|
-
"@xyo-network/crypto-nft-payload-plugin": "~2.70.
|
|
18
|
-
"@xyo-network/module": "~2.70.
|
|
19
|
-
"@xyo-network/payload-model": "~2.70.
|
|
20
|
-
"@xyo-network/payloadset-plugin": "~2.70.
|
|
21
|
-
"@xyo-network/witness": "~2.70.
|
|
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.
|
|
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
|
|
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
|
-
|
|
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,
|
|
4
|
+
import { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib'
|
|
4
5
|
|
|
5
|
-
|
|
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
|
|
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(
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
}
|
|
@@ -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 @@
|
|
|
1
|
+
export * from './binomial'
|