@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.
- package/dist/cjs/Witness.js +3 -2
- package/dist/cjs/Witness.js.map +1 -1
- package/dist/cjs/lib/collectionMetrics/getNftCollectionMetrics.js +18 -10
- 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/cjs/lib/getNftCollectionNfts.js +3 -1
- package/dist/cjs/lib/getNftCollectionNfts.js.map +1 -1
- package/dist/docs.json +1444 -1675
- package/dist/esm/Witness.js +3 -2
- package/dist/esm/Witness.js.map +1 -1
- package/dist/esm/lib/collectionMetrics/getNftCollectionMetrics.js +19 -11
- 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/esm/lib/getNftCollectionNfts.js +3 -1
- package/dist/esm/lib/getNftCollectionNfts.js.map +1 -1
- 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/dist/types/lib/getNftCollectionNfts.d.ts.map +1 -1
- package/package.json +8 -8
- package/src/Witness.ts +3 -2
- package/src/lib/collectionMetrics/getNftCollectionMetrics.ts +25 -20
- 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/src/lib/getNftCollectionNfts.ts +3 -1
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,25 @@
|
|
|
1
|
-
import { calculateAllPropertiesDistribution } from './lib';
|
|
1
|
+
import { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib';
|
|
2
2
|
export const getNftCollectionMetrics = (nfts) => {
|
|
3
|
-
const
|
|
4
|
-
.map((nft) => nft
|
|
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(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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":"
|
|
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 +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"}
|
|
@@ -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;
|
|
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;
|
|
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,oBA0BzD,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"}
|
|
@@ -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,
|
|
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.
|
|
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.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.
|
|
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
|
|
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,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,
|
|
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
|
|
17
|
-
.map((nft) => nft
|
|
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(
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
}
|
|
@@ -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'
|
|
@@ -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
|