@xyo-network/crypto-nft-collection-diviner-score-plugin 6.0.3 → 7.0.0

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 (60) hide show
  1. package/README.md +5 -0
  2. package/dist/neutral/index.mjs +1 -1
  3. package/dist/neutral/index.mjs.map +2 -2
  4. package/package.json +20 -21
  5. package/dist/browser/Diviner.d.ts +0 -10
  6. package/dist/browser/Diviner.d.ts.map +0 -1
  7. package/dist/browser/Plugin.d.ts +0 -3
  8. package/dist/browser/Plugin.d.ts.map +0 -1
  9. package/dist/browser/index.d.ts +0 -4
  10. package/dist/browser/index.d.ts.map +0 -1
  11. package/dist/browser/index.mjs +0 -155
  12. package/dist/browser/index.mjs.map +0 -7
  13. package/dist/browser/lib/index.d.ts +0 -2
  14. package/dist/browser/lib/index.d.ts.map +0 -1
  15. package/dist/browser/lib/rating/analyzeNftCollection.d.ts +0 -11
  16. package/dist/browser/lib/rating/analyzeNftCollection.d.ts.map +0 -1
  17. package/dist/browser/lib/rating/criteria/index.d.ts +0 -4
  18. package/dist/browser/lib/rating/criteria/index.d.ts.map +0 -1
  19. package/dist/browser/lib/rating/criteria/scoring/index.d.ts +0 -3
  20. package/dist/browser/lib/rating/criteria/scoring/index.d.ts.map +0 -1
  21. package/dist/browser/lib/rating/criteria/scoring/metadata/index.d.ts +0 -2
  22. package/dist/browser/lib/rating/criteria/scoring/metadata/index.d.ts.map +0 -1
  23. package/dist/browser/lib/rating/criteria/scoring/metadata/metadata.d.ts +0 -5
  24. package/dist/browser/lib/rating/criteria/scoring/metadata/metadata.d.ts.map +0 -1
  25. package/dist/browser/lib/rating/criteria/scoring/metadata/scoreIndividualAttributes.d.ts +0 -4
  26. package/dist/browser/lib/rating/criteria/scoring/metadata/scoreIndividualAttributes.d.ts.map +0 -1
  27. package/dist/browser/lib/rating/criteria/scoring/metadata/scoreTotalAttributes.d.ts +0 -24
  28. package/dist/browser/lib/rating/criteria/scoring/metadata/scoreTotalAttributes.d.ts.map +0 -1
  29. package/dist/browser/lib/rating/criteria/scoring/total.d.ts +0 -16
  30. package/dist/browser/lib/rating/criteria/scoring/total.d.ts.map +0 -1
  31. package/dist/browser/lib/rating/index.d.ts +0 -3
  32. package/dist/browser/lib/rating/index.d.ts.map +0 -1
  33. package/dist/node/Diviner.d.ts +0 -10
  34. package/dist/node/Diviner.d.ts.map +0 -1
  35. package/dist/node/Plugin.d.ts +0 -3
  36. package/dist/node/Plugin.d.ts.map +0 -1
  37. package/dist/node/index.d.ts +0 -4
  38. package/dist/node/index.d.ts.map +0 -1
  39. package/dist/node/index.mjs +0 -155
  40. package/dist/node/index.mjs.map +0 -7
  41. package/dist/node/lib/index.d.ts +0 -2
  42. package/dist/node/lib/index.d.ts.map +0 -1
  43. package/dist/node/lib/rating/analyzeNftCollection.d.ts +0 -11
  44. package/dist/node/lib/rating/analyzeNftCollection.d.ts.map +0 -1
  45. package/dist/node/lib/rating/criteria/index.d.ts +0 -4
  46. package/dist/node/lib/rating/criteria/index.d.ts.map +0 -1
  47. package/dist/node/lib/rating/criteria/scoring/index.d.ts +0 -3
  48. package/dist/node/lib/rating/criteria/scoring/index.d.ts.map +0 -1
  49. package/dist/node/lib/rating/criteria/scoring/metadata/index.d.ts +0 -2
  50. package/dist/node/lib/rating/criteria/scoring/metadata/index.d.ts.map +0 -1
  51. package/dist/node/lib/rating/criteria/scoring/metadata/metadata.d.ts +0 -5
  52. package/dist/node/lib/rating/criteria/scoring/metadata/metadata.d.ts.map +0 -1
  53. package/dist/node/lib/rating/criteria/scoring/metadata/scoreIndividualAttributes.d.ts +0 -4
  54. package/dist/node/lib/rating/criteria/scoring/metadata/scoreIndividualAttributes.d.ts.map +0 -1
  55. package/dist/node/lib/rating/criteria/scoring/metadata/scoreTotalAttributes.d.ts +0 -24
  56. package/dist/node/lib/rating/criteria/scoring/metadata/scoreTotalAttributes.d.ts.map +0 -1
  57. package/dist/node/lib/rating/criteria/scoring/total.d.ts +0 -16
  58. package/dist/node/lib/rating/criteria/scoring/total.d.ts.map +0 -1
  59. package/dist/node/lib/rating/index.d.ts +0 -3
  60. package/dist/node/lib/rating/index.d.ts.map +0 -1
package/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![logo][]](https://xyo.network)
2
+
1
3
  # @xyo-network/crypto-nft-collection-diviner-score-plugin
2
4
 
3
5
  [![npm][npm-badge]][npm-link]
@@ -36,9 +38,12 @@ bun add {{name}}
36
38
 
37
39
  See the [LICENSE](LICENSE) file for license rights and limitations (LGPL-3.0-only).
38
40
 
41
+ ## Credits
39
42
 
43
+ [Made with 🔥 and ❄️ by XYO Foundation](https://xyo.network)
40
44
 
41
45
  [npm-badge]: https://img.shields.io/npm/v/@xyo-network/crypto-nft-collection-diviner-score-plugin.svg
42
46
  [npm-link]: https://www.npmjs.com/package/@xyo-network/crypto-nft-collection-diviner-score-plugin
43
47
  [license-badge]: https://img.shields.io/npm/l/@xyo-network/crypto-nft-collection-diviner-score-plugin.svg
44
48
  [license-link]: https://github.com/xylabs/sdk-js/blob/main/LICENSE
49
+ [logo]: https://cdn.xy.company/img/brand/XYO_full_colored.png
@@ -14,7 +14,7 @@ var scoreIndividualAttributes = (info) => {
14
14
  const entries = Object.entries(attributes);
15
15
  if (entries.length === 0) return [0, maxScore];
16
16
  const scores = Object.entries(attributes).flatMap(([_trait, { values }]) => {
17
- return Object.entries(values).map(([_traitValue, metrics]) => {
17
+ return Object.values(values).map((metrics) => {
18
18
  const rarity = Math.min(Math.round((1 - metrics.binomial.p) * maxScore), maxScore);
19
19
  return [rarity, maxScore];
20
20
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/Diviner.ts", "../../src/lib/rating/criteria/scoring/metadata/scoreIndividualAttributes.ts", "../../src/lib/rating/criteria/scoring/metadata/scoreTotalAttributes.ts", "../../src/lib/rating/criteria/scoring/metadata/metadata.ts", "../../src/lib/rating/criteria/scoring/total.ts", "../../src/lib/rating/criteria/index.ts", "../../src/lib/rating/analyzeNftCollection.ts", "../../src/Plugin.ts"],
4
- "sourcesContent": ["import type {\n NftCollectionInfo,\n NftCollectionMetadata,\n NftCollectionScore,\n NftCollectionScoreDivinerConfig,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport {\n isNftCollectionInfo,\n NftCollectionScoreDivinerConfigSchema,\n NftCollectionScoreSchema,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type {\n AnyConfigSchema, DivinerParams, Payload, Schema,\n} from '@xyo-network/sdk-js'\nimport { AbstractDiviner, PayloadBuilder } from '@xyo-network/sdk-js'\n\nimport type { NftCollectionAnalysis } from './lib/index.ts'\nimport { analyzeNftCollection } from './lib/index.ts'\n\nexport type NftCollectionScoreDivinerParams = DivinerParams<AnyConfigSchema<NftCollectionScoreDivinerConfig>>\n\nconst toNftCollectionScore = (nftCollectionInfo: NftCollectionInfo, scores: NftCollectionAnalysis): NftCollectionScore => {\n const {\n name, symbol, address, chainId, types,\n } = nftCollectionInfo\n const metadata: NftCollectionMetadata = {\n address, chainId, name, symbol, types,\n }\n return {\n ...metadata, schema: NftCollectionScoreSchema, scores,\n }\n}\n\nexport class NftCollectionScoreDiviner<\n TParams extends NftCollectionScoreDivinerParams = NftCollectionScoreDivinerParams,\n> extends AbstractDiviner<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftCollectionScoreDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftCollectionScoreDivinerConfigSchema\n\n protected override divineHandler = async (payloads?: Payload[]): Promise<Payload[]> => {\n const nftCollectionInfos = payloads?.filter(isNftCollectionInfo) ?? []\n const results = await Promise.all(\n nftCollectionInfos.map<Promise<NftCollectionScore>>(async (nftCollectionInfo) => {\n const score = toNftCollectionScore(nftCollectionInfo, await analyzeNftCollection(nftCollectionInfo))\n const sourceHash = await PayloadBuilder.dataHash(nftCollectionInfo)\n return {\n ...score, schema: NftCollectionScoreSchema, sources: [sourceHash],\n } as NftCollectionScore\n }),\n )\n return results\n }\n}\n", "import type { NftCollectionAttributeMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { Score } from '@xyo-network/crypto-nft-score-model'\nimport { normalize } from '@xyo-network/crypto-nft-score-model'\n\nconst maxScore = 10\n\nexport const scoreIndividualAttributes = (info: NftCollectionAttributeMetrics): Score => {\n const { attributes } = info.metrics.metadata\n const entries = Object.entries(attributes)\n if (entries.length === 0) return [0, maxScore]\n const scores = Object.entries(attributes).flatMap(([_trait, { values }]) => {\n return Object.entries(values).map<Score>(([_traitValue, metrics]) => {\n const rarity = Math.min(Math.round((1 - metrics.binomial.p) * maxScore), maxScore)\n return [rarity, maxScore]\n })\n })\n // eslint-disable-next-line unicorn/no-array-reduce\n const total = scores.reduce<Score>(([a, b], [c, d]) => [a + c, b + d], [0, 0])\n return normalize(total, maxScore)\n}\n", "import type { NftCollectionAttributeMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { Score } from '@xyo-network/crypto-nft-score-model'\nimport { normalize } from '@xyo-network/crypto-nft-score-model'\n\nconst maxScore = 10\n\n/**\n * Mean: What value is the distribution centered around\n */\nconst defaultMu = 0.15\n\n/**\n * Standard Deviation: How spread out is the distribution\n */\nconst defaultSigma = 0.1\n\n/**\n * Calculates the Gaussian probability density\n * @param x\n * @param mu Mean\n * @param sigma Standard Deviation\n * @returns\n */\nconst gaussianProbabilityDensity = (x: number, mu: number = defaultMu, sigma: number = defaultSigma): number => {\n const sqrtTwoPi = Math.sqrt(2 * Math.PI)\n const denominator = sigma * sqrtTwoPi\n const power = -0.5 * Math.pow((x - mu) / sigma, 2)\n return (1 / denominator) * Math.exp(power)\n}\n\n/**\n * For a Gaussian distribution, the peak of the distribution is the mean\n */\nconst maxProbabilityDensity = gaussianProbabilityDensity(defaultMu)\n\n/**\n * We're working on some assumptions here:\n *\n * - If you have a 100% chance of getting a trait, everyone get's a trophy\n * - If you have a 50% chance of getting a trait, it's not rare\n * - If you have a 0% chance of getting a trait, it's not fun\n *\n * So we're looking for something Pareto-ish (somewhere between\n * 80/20 or 90/10) as that's a good & sustainable model for the\n * distribution of many traits in real life.\n * However, we also don't want to maximally reward collections\n * that have a lot of single attributes distributed uniformly\n * (basically a 0% trait probably) as that's perfectly entropic\n * but not very interesting (some overlap is desirable).\n * So we're using a Gaussian distribution to model the\n * probability density of the joint probability of all traits\n * centered around 15%.\n * @param info\n * @returns\n */\nexport const scoreTotalAttributes = (info: NftCollectionAttributeMetrics): Score => {\n const { attributes } = info.metrics.metadata\n // This has somewhat of a filtering function by causing anything with 100% probability to\n // add no value to the end score\n const jointProbability = Object.entries(attributes).reduce((acc, [_trait, { metrics }]) => {\n return acc * metrics.binomial.p\n }, 1)\n const probabilityDensity = gaussianProbabilityDensity(jointProbability)\n const score: Score = [probabilityDensity, maxProbabilityDensity]\n return normalize(score, maxScore)\n}\n", "import type { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { WeightedScoringCriteria } from '@xyo-network/crypto-nft-score-model'\n\nimport { scoreIndividualAttributes } from './scoreIndividualAttributes.ts'\nimport { scoreTotalAttributes } from './scoreTotalAttributes.ts'\n\nexport const attributeScoringCriteria: Record<string, WeightedScoringCriteria<NftCollectionInfo>> = {\n 'Metadata Attributes Individual': { score: scoreIndividualAttributes, weight: 2 },\n 'Metadata Attributes Total': { score: scoreTotalAttributes, weight: 2 },\n}\n\nexport const scoreMetadata: Record<string, WeightedScoringCriteria<NftCollectionInfo>> = { ...attributeScoringCriteria }\n", "import type { NftCollectionCount } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { Score } from '@xyo-network/crypto-nft-score-model'\nimport { normalize } from '@xyo-network/crypto-nft-score-model'\n\n/**\n * This \"magic\" value was obtained using Solver in Excel\n * to find the median, with mu/sigma fixed, which maximizes\n * the distribution (the mode for lognormal) at 10,000\n */\nconst median = 81_030_839.821_735_2\nconst defaultMu = Math.log(median)\nconst defaultSigma = 3\nconst mode = Math.exp(defaultMu - Math.pow(defaultSigma, 2))\n/**\n * Calculates the log-normal probability density\n * @param x the value at which you want to calculate the probability density\n * @param mu mean of the associated normal distribution\n * @param sigma standard deviation of the associated normal distribution\n * @returns\n */\nconst logNormalProbabilityDensity = (x: number, mu: number = defaultMu, sigma: number = defaultSigma): number => {\n if (x <= 0) return 0\n const logX = Math.log(x)\n return (1 / (x * sigma * Math.sqrt(2 * Math.PI))) * Math.exp(-0.5 * Math.pow((logX - mu) / sigma, 2))\n}\n\n/**\n * For a lognormal distribution, the peak of the distribution is the mode\n */\nconst maxProbabilityDensity = logNormalProbabilityDensity(mode)\n\nconst maxScore = 10\n\n/**\n * We're working on some assumptions here:\n * - If there's < 1000 NFTs in your collection it starts becoming too niche\n * - If there's > 20,000 NFTs in your collection it starts becoming too broad\n * So there's a sweet spot somewhere between 2000 and 10,000\n * where a collection has enough NFTs to be interesting, but\n * not so many that it's teetering on a diluted money grab.\n * To model that we're using a log-normal distribution optimized\n * to maximally reward collections in the aforementioned range\n * @param nft\n * @returns\n */\nexport const scoreTotal = (nft: NftCollectionCount): Score => {\n const density = logNormalProbabilityDensity(nft.total)\n const score: Score = [density, maxProbabilityDensity]\n return normalize(score, maxScore)\n}\n", "import type { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { WeightedScoringCriteria } from '@xyo-network/crypto-nft-score-model'\n\nimport { scoreMetadata, scoreTotal } from './scoring/index.ts'\n\nexport const scoringCriteria: Record<string, WeightedScoringCriteria<NftCollectionInfo>> = {\n ...scoreMetadata,\n Total: { score: scoreTotal, weight: 2 },\n}\n", "import type { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { Score } from '@xyo-network/crypto-nft-score-model'\n\nimport { scoringCriteria } from './criteria/index.ts'\n\nexport type ScoringCriteriaKey = keyof typeof scoringCriteria & PropertyKey\n\nexport type NftCollectionAnalysis = Record<ScoringCriteriaKey, Score>\n\nexport const analyzeNftCollection = async (\n /**\n * The NFT to evaluate\n */\n nft: NftCollectionInfo,\n): Promise<NftCollectionAnalysis> => {\n const result = Object.fromEntries(\n await Promise.all(\n Object.entries(scoringCriteria).map(async ([key, { score, weight }]) => {\n const rawScore = await score(nft)\n const weighted = rawScore.map(v => v * weight) as Score\n return [key, weighted] as const\n }),\n ),\n ) as NftCollectionAnalysis\n return result\n}\n", "import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { createPayloadSetDivinerPlugin, PayloadSetSchema } from '@xyo-network/sdk-js'\n\nimport { NftCollectionScoreDiviner } from './Diviner.ts'\n\nexport const NftCollectionScoreDivinerPlugin = () =>\n createPayloadSetDivinerPlugin<NftCollectionScoreDiviner>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n diviner: async (params) => {\n const result = await NftCollectionScoreDiviner.create(params)\n return result\n },\n },\n )\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type {\n NftCollectionInfo,\n NftCollectionMetadata,\n NftCollectionScore,\n NftCollectionScoreDivinerConfig,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport {\n isNftCollectionInfo,\n NftCollectionScoreDivinerConfigSchema,\n NftCollectionScoreSchema,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type {\n AnyConfigSchema, DivinerParams, Payload, Schema,\n} from '@xyo-network/sdk-js'\nimport { AbstractDiviner, PayloadBuilder } from '@xyo-network/sdk-js'\n\nimport type { NftCollectionAnalysis } from './lib/index.ts'\nimport { analyzeNftCollection } from './lib/index.ts'\n\nexport type NftCollectionScoreDivinerParams = DivinerParams<AnyConfigSchema<NftCollectionScoreDivinerConfig>>\n\nconst toNftCollectionScore = (nftCollectionInfo: NftCollectionInfo, scores: NftCollectionAnalysis): NftCollectionScore => {\n const {\n name, symbol, address, chainId, types,\n } = nftCollectionInfo\n const metadata: NftCollectionMetadata = {\n address, chainId, name, symbol, types,\n }\n return {\n ...metadata, schema: NftCollectionScoreSchema, scores,\n }\n}\n\nexport class NftCollectionScoreDiviner<\n TParams extends NftCollectionScoreDivinerParams = NftCollectionScoreDivinerParams,\n> extends AbstractDiviner<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftCollectionScoreDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftCollectionScoreDivinerConfigSchema\n\n protected override divineHandler = async (payloads?: Payload[]): Promise<Payload[]> => {\n const nftCollectionInfos = payloads?.filter(isNftCollectionInfo) ?? []\n const results = await Promise.all(\n nftCollectionInfos.map<Promise<NftCollectionScore>>(async (nftCollectionInfo) => {\n const score = toNftCollectionScore(nftCollectionInfo, await analyzeNftCollection(nftCollectionInfo))\n const sourceHash = await PayloadBuilder.dataHash(nftCollectionInfo)\n return {\n ...score, schema: NftCollectionScoreSchema, sources: [sourceHash],\n }\n }),\n )\n return results\n }\n}\n", "import type { NftCollectionAttributeMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { Score } from '@xyo-network/crypto-nft-score-model'\nimport { normalize } from '@xyo-network/crypto-nft-score-model'\n\nconst maxScore = 10\n\nexport const scoreIndividualAttributes = (info: NftCollectionAttributeMetrics): Score => {\n const { attributes } = info.metrics.metadata\n const entries = Object.entries(attributes)\n if (entries.length === 0) return [0, maxScore]\n const scores = Object.entries(attributes).flatMap(([_trait, { values }]) => {\n return Object.values(values).map<Score>((metrics) => {\n const rarity = Math.min(Math.round((1 - metrics.binomial.p) * maxScore), maxScore)\n return [rarity, maxScore]\n })\n })\n // eslint-disable-next-line unicorn/no-array-reduce\n const total = scores.reduce<Score>(([a, b], [c, d]) => [a + c, b + d], [0, 0])\n return normalize(total, maxScore)\n}\n", "import type { NftCollectionAttributeMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { Score } from '@xyo-network/crypto-nft-score-model'\nimport { normalize } from '@xyo-network/crypto-nft-score-model'\n\nconst maxScore = 10\n\n/**\n * Mean: What value is the distribution centered around\n */\nconst defaultMu = 0.15\n\n/**\n * Standard Deviation: How spread out is the distribution\n */\nconst defaultSigma = 0.1\n\n/**\n * Calculates the Gaussian probability density\n * @param x\n * @param mu Mean\n * @param sigma Standard Deviation\n * @returns\n */\nconst gaussianProbabilityDensity = (x: number, mu: number = defaultMu, sigma: number = defaultSigma): number => {\n const sqrtTwoPi = Math.sqrt(2 * Math.PI)\n const denominator = sigma * sqrtTwoPi\n const power = -0.5 * Math.pow((x - mu) / sigma, 2)\n return (1 / denominator) * Math.exp(power)\n}\n\n/**\n * For a Gaussian distribution, the peak of the distribution is the mean\n */\nconst maxProbabilityDensity = gaussianProbabilityDensity(defaultMu)\n\n/**\n * We're working on some assumptions here:\n *\n * - If you have a 100% chance of getting a trait, everyone get's a trophy\n * - If you have a 50% chance of getting a trait, it's not rare\n * - If you have a 0% chance of getting a trait, it's not fun\n *\n * So we're looking for something Pareto-ish (somewhere between\n * 80/20 or 90/10) as that's a good & sustainable model for the\n * distribution of many traits in real life.\n * However, we also don't want to maximally reward collections\n * that have a lot of single attributes distributed uniformly\n * (basically a 0% trait probably) as that's perfectly entropic\n * but not very interesting (some overlap is desirable).\n * So we're using a Gaussian distribution to model the\n * probability density of the joint probability of all traits\n * centered around 15%.\n * @param info\n * @returns\n */\nexport const scoreTotalAttributes = (info: NftCollectionAttributeMetrics): Score => {\n const { attributes } = info.metrics.metadata\n // This has somewhat of a filtering function by causing anything with 100% probability to\n // add no value to the end score\n const jointProbability = Object.entries(attributes).reduce((acc, [_trait, { metrics }]) => {\n return acc * metrics.binomial.p\n }, 1)\n const probabilityDensity = gaussianProbabilityDensity(jointProbability)\n const score: Score = [probabilityDensity, maxProbabilityDensity]\n return normalize(score, maxScore)\n}\n", "import type { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { WeightedScoringCriteria } from '@xyo-network/crypto-nft-score-model'\n\nimport { scoreIndividualAttributes } from './scoreIndividualAttributes.ts'\nimport { scoreTotalAttributes } from './scoreTotalAttributes.ts'\n\nexport const attributeScoringCriteria: Record<string, WeightedScoringCriteria<NftCollectionInfo>> = {\n 'Metadata Attributes Individual': { score: scoreIndividualAttributes, weight: 2 },\n 'Metadata Attributes Total': { score: scoreTotalAttributes, weight: 2 },\n}\n\nexport const scoreMetadata: Record<string, WeightedScoringCriteria<NftCollectionInfo>> = { ...attributeScoringCriteria }\n", "import type { NftCollectionCount } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { Score } from '@xyo-network/crypto-nft-score-model'\nimport { normalize } from '@xyo-network/crypto-nft-score-model'\n\n/**\n * This \"magic\" value was obtained using Solver in Excel\n * to find the median, with mu/sigma fixed, which maximizes\n * the distribution (the mode for lognormal) at 10,000\n */\nconst median = 81_030_839.8217352\nconst defaultMu = Math.log(median)\nconst defaultSigma = 3\nconst mode = Math.exp(defaultMu - Math.pow(defaultSigma, 2))\n/**\n * Calculates the log-normal probability density\n * @param x the value at which you want to calculate the probability density\n * @param mu mean of the associated normal distribution\n * @param sigma standard deviation of the associated normal distribution\n * @returns\n */\nconst logNormalProbabilityDensity = (x: number, mu: number = defaultMu, sigma: number = defaultSigma): number => {\n if (x <= 0) return 0\n const logX = Math.log(x)\n return (1 / (x * sigma * Math.sqrt(2 * Math.PI))) * Math.exp(-0.5 * Math.pow((logX - mu) / sigma, 2))\n}\n\n/**\n * For a lognormal distribution, the peak of the distribution is the mode\n */\nconst maxProbabilityDensity = logNormalProbabilityDensity(mode)\n\nconst maxScore = 10\n\n/**\n * We're working on some assumptions here:\n * - If there's < 1000 NFTs in your collection it starts becoming too niche\n * - If there's > 20,000 NFTs in your collection it starts becoming too broad\n * So there's a sweet spot somewhere between 2000 and 10,000\n * where a collection has enough NFTs to be interesting, but\n * not so many that it's teetering on a diluted money grab.\n * To model that we're using a log-normal distribution optimized\n * to maximally reward collections in the aforementioned range\n * @param nft\n * @returns\n */\nexport const scoreTotal = (nft: NftCollectionCount): Score => {\n const density = logNormalProbabilityDensity(nft.total)\n const score: Score = [density, maxProbabilityDensity]\n return normalize(score, maxScore)\n}\n", "import type { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { WeightedScoringCriteria } from '@xyo-network/crypto-nft-score-model'\n\nimport { scoreMetadata, scoreTotal } from './scoring/index.ts'\n\nexport const scoringCriteria: Record<string, WeightedScoringCriteria<NftCollectionInfo>> = {\n ...scoreMetadata,\n Total: { score: scoreTotal, weight: 2 },\n}\n", "import type { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { Score } from '@xyo-network/crypto-nft-score-model'\n\nimport { scoringCriteria } from './criteria/index.ts'\n\nexport type ScoringCriteriaKey = keyof typeof scoringCriteria & PropertyKey\n\nexport type NftCollectionAnalysis = Record<ScoringCriteriaKey, Score>\n\nexport const analyzeNftCollection = async (\n /**\n * The NFT to evaluate\n */\n nft: NftCollectionInfo,\n): Promise<NftCollectionAnalysis> => {\n const result = Object.fromEntries(\n await Promise.all(\n Object.entries(scoringCriteria).map(async ([key, { score, weight }]) => {\n const rawScore = await score(nft)\n const weighted = rawScore.map(v => v * weight) as Score\n return [key, weighted] as const\n }),\n ),\n )\n return result\n}\n", "import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { createPayloadSetDivinerPlugin, PayloadSetSchema } from '@xyo-network/sdk-js'\n\nimport { NftCollectionScoreDiviner } from './Diviner.ts'\n\nexport const NftCollectionScoreDivinerPlugin = () =>\n createPayloadSetDivinerPlugin<NftCollectionScoreDiviner>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n diviner: async (params) => {\n const result = await NftCollectionScoreDiviner.create(params)\n return result\n },\n },\n )\n"],
5
+ "mappings": "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",
6
6
  "names": ["normalize", "maxScore", "normalize", "defaultMu", "defaultSigma", "maxProbabilityDensity", "maxScore"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/crypto-nft-collection-diviner-score-plugin",
3
- "version": "6.0.3",
3
+ "version": "7.0.0",
4
4
  "description": "Typescript/Javascript Plugins for XYO Platform",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -31,32 +31,30 @@
31
31
  "README.md"
32
32
  ],
33
33
  "dependencies": {
34
- "@xyo-network/crypto-nft-collection-payload-plugin": "~6.0.3",
35
- "@xyo-network/crypto-nft-score-model": "~6.0.3",
36
- "@xyo-network/crypto-nft-payload-plugin": "~6.0.3"
34
+ "@xyo-network/crypto-nft-collection-payload-plugin": "~7.0.0",
35
+ "@xyo-network/crypto-nft-score-model": "~7.0.0",
36
+ "@xyo-network/crypto-nft-payload-plugin": "~7.0.0"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@bitauth/libauth": "~3.0.0",
40
40
  "@metamask/providers": "^22.1.1",
41
41
  "@noble/post-quantum": "~0.6.1",
42
42
  "@opentelemetry/api": "^1.9.1",
43
- "@opentelemetry/sdk-trace-base": "^2.7.1",
43
+ "@opentelemetry/sdk-trace-base": "^2.8.0",
44
44
  "@scure/base": "^2.2.0",
45
45
  "@scure/bip39": "~2.2.0",
46
- "@xylabs/geo": "^6.0.8",
47
- "@xylabs/sdk-js": "^6.0.8",
48
- "@xylabs/threads": "^6.0.8",
49
- "@xylabs/toolchain": "~8.1.16",
50
- "@xylabs/tsconfig": "~8.1.16",
51
- "@xylabs/vitest-extended": "~6.0.8",
52
- "@xyo-network/sdk-js": "^6.0.4",
53
- "@xyo-network/sdk-protocol-js": "~6.0.9",
46
+ "@xylabs/geo": "^6.1.3",
47
+ "@xylabs/sdk-js": "^6.1.3",
48
+ "@xylabs/threads": "^6.1.3",
49
+ "@xylabs/toolchain": "~8.2.7",
50
+ "@xylabs/tsconfig": "~8.2.7",
51
+ "@xylabs/vitest-extended": "^6.1.3",
52
+ "@xyo-network/sdk-js": "^7.0.0",
53
+ "@xyo-network/sdk-protocol-js": "~7.0",
54
54
  "ajv": "^8.20.0",
55
55
  "async-mutex": "^0.5.0",
56
- "bn.js": "^5.2.3",
57
- "buffer": "^6.0.3",
58
56
  "debug": "~4.4.3",
59
- "eslint": "^10.4.1",
57
+ "eslint": "^10.5.0",
60
58
  "ethers": "^6.16.0",
61
59
  "hash-wasm": "^4.12.0",
62
60
  "idb": "^8.0.3",
@@ -64,7 +62,7 @@
64
62
  "observable-fns": "~0.6.1",
65
63
  "typescript": "~6.0.3",
66
64
  "vite": "^8.0.16",
67
- "vitest": "^4.1.8",
65
+ "vitest": "^4.1.9",
68
66
  "webextension-polyfill": "^0.12.0",
69
67
  "zod": "^4.4.3"
70
68
  },
@@ -79,12 +77,10 @@
79
77
  "@xylabs/geo": "^6.0",
80
78
  "@xylabs/sdk-js": "^6.0",
81
79
  "@xylabs/threads": "^6.0",
82
- "@xyo-network/sdk-js": "^6.0",
83
- "@xyo-network/sdk-protocol-js": "~6.0",
80
+ "@xyo-network/sdk-js": "^7.0",
81
+ "@xyo-network/sdk-protocol-js": "^7.0",
84
82
  "ajv": "^8.20",
85
83
  "async-mutex": "^0.5",
86
- "bn.js": "^5.2",
87
- "buffer": "^6.0",
88
84
  "debug": "~4.4",
89
85
  "ethers": "^6.16",
90
86
  "hash-wasm": "^4.12",
@@ -94,6 +90,9 @@
94
90
  "webextension-polyfill": "^0.12",
95
91
  "zod": "^4.4"
96
92
  },
93
+ "engines": {
94
+ "node": "^24"
95
+ },
97
96
  "publishConfig": {
98
97
  "access": "public"
99
98
  }
@@ -1,10 +0,0 @@
1
- import type { NftCollectionScoreDivinerConfig } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- import type { AnyConfigSchema, DivinerParams, Payload, Schema } from '@xyo-network/sdk-js';
3
- import { AbstractDiviner } from '@xyo-network/sdk-js';
4
- export type NftCollectionScoreDivinerParams = DivinerParams<AnyConfigSchema<NftCollectionScoreDivinerConfig>>;
5
- export declare class NftCollectionScoreDiviner<TParams extends NftCollectionScoreDivinerParams = NftCollectionScoreDivinerParams> extends AbstractDiviner<TParams> {
6
- static readonly configSchemas: Schema[];
7
- static readonly defaultConfigSchema: Schema;
8
- protected divineHandler: (payloads?: Payload[]) => Promise<Payload[]>;
9
- }
10
- //# sourceMappingURL=Diviner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Diviner.d.ts","sourceRoot":"","sources":["../../src/Diviner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,+BAA+B,EAChC,MAAM,mDAAmD,CAAA;AAM1D,OAAO,KAAK,EACV,eAAe,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAChD,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAkB,MAAM,qBAAqB,CAAA;AAKrE,MAAM,MAAM,+BAA+B,GAAG,aAAa,CAAC,eAAe,CAAC,+BAA+B,CAAC,CAAC,CAAA;AAc7G,qBAAa,yBAAyB,CACpC,OAAO,SAAS,+BAA+B,GAAG,+BAA+B,CACjF,SAAQ,eAAe,CAAC,OAAO,CAAC;IAChC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAkE;IAClH,gBAAyB,mBAAmB,EAAE,MAAM,CAAwC;IAE5F,UAAmB,aAAa,GAAU,WAAW,OAAO,EAAE,KAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAYlF;CACF"}
@@ -1,3 +0,0 @@
1
- import { NftCollectionScoreDiviner } from './Diviner.ts';
2
- export declare const NftCollectionScoreDivinerPlugin: () => import("@xyo-network/sdk-js").PayloadSetDivinerPlugin<NftCollectionScoreDiviner<import("./Diviner.ts").NftCollectionScoreDivinerParams>>;
3
- //# sourceMappingURL=Plugin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AAExD,eAAO,MAAM,+BAA+B,gJASzC,CAAA"}
@@ -1,4 +0,0 @@
1
- export * from './Diviner.ts';
2
- export * from './lib/index.ts';
3
- export { NftCollectionScoreDivinerPlugin as default, NftCollectionScoreDivinerPlugin } from './Plugin.ts';
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,OAAO,EAAE,+BAA+B,IAAI,OAAO,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAA"}
@@ -1,155 +0,0 @@
1
- // src/Diviner.ts
2
- import {
3
- isNftCollectionInfo,
4
- NftCollectionScoreDivinerConfigSchema,
5
- NftCollectionScoreSchema
6
- } from "@xyo-network/crypto-nft-collection-payload-plugin";
7
- import { AbstractDiviner, PayloadBuilder } from "@xyo-network/sdk-js";
8
-
9
- // src/lib/rating/criteria/scoring/metadata/scoreIndividualAttributes.ts
10
- import { normalize } from "@xyo-network/crypto-nft-score-model";
11
- var maxScore = 10;
12
- var scoreIndividualAttributes = (info) => {
13
- const { attributes } = info.metrics.metadata;
14
- const entries = Object.entries(attributes);
15
- if (entries.length === 0) return [0, maxScore];
16
- const scores = Object.entries(attributes).flatMap(([_trait, { values }]) => {
17
- return Object.entries(values).map(([_traitValue, metrics]) => {
18
- const rarity = Math.min(Math.round((1 - metrics.binomial.p) * maxScore), maxScore);
19
- return [rarity, maxScore];
20
- });
21
- });
22
- const total = scores.reduce(([a, b], [c, d]) => [a + c, b + d], [0, 0]);
23
- return normalize(total, maxScore);
24
- };
25
-
26
- // src/lib/rating/criteria/scoring/metadata/scoreTotalAttributes.ts
27
- import { normalize as normalize2 } from "@xyo-network/crypto-nft-score-model";
28
- var maxScore2 = 10;
29
- var defaultMu = 0.15;
30
- var defaultSigma = 0.1;
31
- var gaussianProbabilityDensity = (x, mu = defaultMu, sigma = defaultSigma) => {
32
- const sqrtTwoPi = Math.sqrt(2 * Math.PI);
33
- const denominator = sigma * sqrtTwoPi;
34
- const power = -0.5 * Math.pow((x - mu) / sigma, 2);
35
- return 1 / denominator * Math.exp(power);
36
- };
37
- var maxProbabilityDensity = gaussianProbabilityDensity(defaultMu);
38
- var scoreTotalAttributes = (info) => {
39
- const { attributes } = info.metrics.metadata;
40
- const jointProbability = Object.entries(attributes).reduce((acc, [_trait, { metrics }]) => {
41
- return acc * metrics.binomial.p;
42
- }, 1);
43
- const probabilityDensity = gaussianProbabilityDensity(jointProbability);
44
- const score = [probabilityDensity, maxProbabilityDensity];
45
- return normalize2(score, maxScore2);
46
- };
47
-
48
- // src/lib/rating/criteria/scoring/metadata/metadata.ts
49
- var attributeScoringCriteria = {
50
- "Metadata Attributes Individual": { score: scoreIndividualAttributes, weight: 2 },
51
- "Metadata Attributes Total": { score: scoreTotalAttributes, weight: 2 }
52
- };
53
- var scoreMetadata = { ...attributeScoringCriteria };
54
-
55
- // src/lib/rating/criteria/scoring/total.ts
56
- import { normalize as normalize3 } from "@xyo-network/crypto-nft-score-model";
57
- var median = 810308398217352e-7;
58
- var defaultMu2 = Math.log(median);
59
- var defaultSigma2 = 3;
60
- var mode = Math.exp(defaultMu2 - Math.pow(defaultSigma2, 2));
61
- var logNormalProbabilityDensity = (x, mu = defaultMu2, sigma = defaultSigma2) => {
62
- if (x <= 0) return 0;
63
- const logX = Math.log(x);
64
- return 1 / (x * sigma * Math.sqrt(2 * Math.PI)) * Math.exp(-0.5 * Math.pow((logX - mu) / sigma, 2));
65
- };
66
- var maxProbabilityDensity2 = logNormalProbabilityDensity(mode);
67
- var maxScore3 = 10;
68
- var scoreTotal = (nft) => {
69
- const density = logNormalProbabilityDensity(nft.total);
70
- const score = [density, maxProbabilityDensity2];
71
- return normalize3(score, maxScore3);
72
- };
73
-
74
- // src/lib/rating/criteria/index.ts
75
- var scoringCriteria = {
76
- ...scoreMetadata,
77
- Total: { score: scoreTotal, weight: 2 }
78
- };
79
-
80
- // src/lib/rating/analyzeNftCollection.ts
81
- var analyzeNftCollection = async (nft) => {
82
- const result = Object.fromEntries(
83
- await Promise.all(
84
- Object.entries(scoringCriteria).map(async ([key, { score, weight }]) => {
85
- const rawScore = await score(nft);
86
- const weighted = rawScore.map((v) => v * weight);
87
- return [key, weighted];
88
- })
89
- )
90
- );
91
- return result;
92
- };
93
-
94
- // src/Diviner.ts
95
- var toNftCollectionScore = (nftCollectionInfo, scores) => {
96
- const {
97
- name,
98
- symbol,
99
- address,
100
- chainId,
101
- types
102
- } = nftCollectionInfo;
103
- const metadata = {
104
- address,
105
- chainId,
106
- name,
107
- symbol,
108
- types
109
- };
110
- return {
111
- ...metadata,
112
- schema: NftCollectionScoreSchema,
113
- scores
114
- };
115
- };
116
- var NftCollectionScoreDiviner = class extends AbstractDiviner {
117
- static configSchemas = [...super.configSchemas, NftCollectionScoreDivinerConfigSchema];
118
- static defaultConfigSchema = NftCollectionScoreDivinerConfigSchema;
119
- divineHandler = async (payloads) => {
120
- const nftCollectionInfos = payloads?.filter(isNftCollectionInfo) ?? [];
121
- const results = await Promise.all(
122
- nftCollectionInfos.map(async (nftCollectionInfo) => {
123
- const score = toNftCollectionScore(nftCollectionInfo, await analyzeNftCollection(nftCollectionInfo));
124
- const sourceHash = await PayloadBuilder.dataHash(nftCollectionInfo);
125
- return {
126
- ...score,
127
- schema: NftCollectionScoreSchema,
128
- sources: [sourceHash]
129
- };
130
- })
131
- );
132
- return results;
133
- };
134
- };
135
-
136
- // src/Plugin.ts
137
- import { NftSchema } from "@xyo-network/crypto-nft-payload-plugin";
138
- import { createPayloadSetDivinerPlugin, PayloadSetSchema } from "@xyo-network/sdk-js";
139
- var NftCollectionScoreDivinerPlugin = () => createPayloadSetDivinerPlugin(
140
- { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },
141
- {
142
- diviner: async (params) => {
143
- const result = await NftCollectionScoreDiviner.create(params);
144
- return result;
145
- }
146
- }
147
- );
148
- export {
149
- NftCollectionScoreDiviner,
150
- NftCollectionScoreDivinerPlugin,
151
- analyzeNftCollection,
152
- NftCollectionScoreDivinerPlugin as default,
153
- scoringCriteria
154
- };
155
- //# sourceMappingURL=index.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/Diviner.ts", "../../src/lib/rating/criteria/scoring/metadata/scoreIndividualAttributes.ts", "../../src/lib/rating/criteria/scoring/metadata/scoreTotalAttributes.ts", "../../src/lib/rating/criteria/scoring/metadata/metadata.ts", "../../src/lib/rating/criteria/scoring/total.ts", "../../src/lib/rating/criteria/index.ts", "../../src/lib/rating/analyzeNftCollection.ts", "../../src/Plugin.ts"],
4
- "sourcesContent": ["import type {\n NftCollectionInfo,\n NftCollectionMetadata,\n NftCollectionScore,\n NftCollectionScoreDivinerConfig,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport {\n isNftCollectionInfo,\n NftCollectionScoreDivinerConfigSchema,\n NftCollectionScoreSchema,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type {\n AnyConfigSchema, DivinerParams, Payload, Schema,\n} from '@xyo-network/sdk-js'\nimport { AbstractDiviner, PayloadBuilder } from '@xyo-network/sdk-js'\n\nimport type { NftCollectionAnalysis } from './lib/index.ts'\nimport { analyzeNftCollection } from './lib/index.ts'\n\nexport type NftCollectionScoreDivinerParams = DivinerParams<AnyConfigSchema<NftCollectionScoreDivinerConfig>>\n\nconst toNftCollectionScore = (nftCollectionInfo: NftCollectionInfo, scores: NftCollectionAnalysis): NftCollectionScore => {\n const {\n name, symbol, address, chainId, types,\n } = nftCollectionInfo\n const metadata: NftCollectionMetadata = {\n address, chainId, name, symbol, types,\n }\n return {\n ...metadata, schema: NftCollectionScoreSchema, scores,\n }\n}\n\nexport class NftCollectionScoreDiviner<\n TParams extends NftCollectionScoreDivinerParams = NftCollectionScoreDivinerParams,\n> extends AbstractDiviner<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftCollectionScoreDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftCollectionScoreDivinerConfigSchema\n\n protected override divineHandler = async (payloads?: Payload[]): Promise<Payload[]> => {\n const nftCollectionInfos = payloads?.filter(isNftCollectionInfo) ?? []\n const results = await Promise.all(\n nftCollectionInfos.map<Promise<NftCollectionScore>>(async (nftCollectionInfo) => {\n const score = toNftCollectionScore(nftCollectionInfo, await analyzeNftCollection(nftCollectionInfo))\n const sourceHash = await PayloadBuilder.dataHash(nftCollectionInfo)\n return {\n ...score, schema: NftCollectionScoreSchema, sources: [sourceHash],\n } as NftCollectionScore\n }),\n )\n return results\n }\n}\n", "import type { NftCollectionAttributeMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { Score } from '@xyo-network/crypto-nft-score-model'\nimport { normalize } from '@xyo-network/crypto-nft-score-model'\n\nconst maxScore = 10\n\nexport const scoreIndividualAttributes = (info: NftCollectionAttributeMetrics): Score => {\n const { attributes } = info.metrics.metadata\n const entries = Object.entries(attributes)\n if (entries.length === 0) return [0, maxScore]\n const scores = Object.entries(attributes).flatMap(([_trait, { values }]) => {\n return Object.entries(values).map<Score>(([_traitValue, metrics]) => {\n const rarity = Math.min(Math.round((1 - metrics.binomial.p) * maxScore), maxScore)\n return [rarity, maxScore]\n })\n })\n // eslint-disable-next-line unicorn/no-array-reduce\n const total = scores.reduce<Score>(([a, b], [c, d]) => [a + c, b + d], [0, 0])\n return normalize(total, maxScore)\n}\n", "import type { NftCollectionAttributeMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { Score } from '@xyo-network/crypto-nft-score-model'\nimport { normalize } from '@xyo-network/crypto-nft-score-model'\n\nconst maxScore = 10\n\n/**\n * Mean: What value is the distribution centered around\n */\nconst defaultMu = 0.15\n\n/**\n * Standard Deviation: How spread out is the distribution\n */\nconst defaultSigma = 0.1\n\n/**\n * Calculates the Gaussian probability density\n * @param x\n * @param mu Mean\n * @param sigma Standard Deviation\n * @returns\n */\nconst gaussianProbabilityDensity = (x: number, mu: number = defaultMu, sigma: number = defaultSigma): number => {\n const sqrtTwoPi = Math.sqrt(2 * Math.PI)\n const denominator = sigma * sqrtTwoPi\n const power = -0.5 * Math.pow((x - mu) / sigma, 2)\n return (1 / denominator) * Math.exp(power)\n}\n\n/**\n * For a Gaussian distribution, the peak of the distribution is the mean\n */\nconst maxProbabilityDensity = gaussianProbabilityDensity(defaultMu)\n\n/**\n * We're working on some assumptions here:\n *\n * - If you have a 100% chance of getting a trait, everyone get's a trophy\n * - If you have a 50% chance of getting a trait, it's not rare\n * - If you have a 0% chance of getting a trait, it's not fun\n *\n * So we're looking for something Pareto-ish (somewhere between\n * 80/20 or 90/10) as that's a good & sustainable model for the\n * distribution of many traits in real life.\n * However, we also don't want to maximally reward collections\n * that have a lot of single attributes distributed uniformly\n * (basically a 0% trait probably) as that's perfectly entropic\n * but not very interesting (some overlap is desirable).\n * So we're using a Gaussian distribution to model the\n * probability density of the joint probability of all traits\n * centered around 15%.\n * @param info\n * @returns\n */\nexport const scoreTotalAttributes = (info: NftCollectionAttributeMetrics): Score => {\n const { attributes } = info.metrics.metadata\n // This has somewhat of a filtering function by causing anything with 100% probability to\n // add no value to the end score\n const jointProbability = Object.entries(attributes).reduce((acc, [_trait, { metrics }]) => {\n return acc * metrics.binomial.p\n }, 1)\n const probabilityDensity = gaussianProbabilityDensity(jointProbability)\n const score: Score = [probabilityDensity, maxProbabilityDensity]\n return normalize(score, maxScore)\n}\n", "import type { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { WeightedScoringCriteria } from '@xyo-network/crypto-nft-score-model'\n\nimport { scoreIndividualAttributes } from './scoreIndividualAttributes.ts'\nimport { scoreTotalAttributes } from './scoreTotalAttributes.ts'\n\nexport const attributeScoringCriteria: Record<string, WeightedScoringCriteria<NftCollectionInfo>> = {\n 'Metadata Attributes Individual': { score: scoreIndividualAttributes, weight: 2 },\n 'Metadata Attributes Total': { score: scoreTotalAttributes, weight: 2 },\n}\n\nexport const scoreMetadata: Record<string, WeightedScoringCriteria<NftCollectionInfo>> = { ...attributeScoringCriteria }\n", "import type { NftCollectionCount } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { Score } from '@xyo-network/crypto-nft-score-model'\nimport { normalize } from '@xyo-network/crypto-nft-score-model'\n\n/**\n * This \"magic\" value was obtained using Solver in Excel\n * to find the median, with mu/sigma fixed, which maximizes\n * the distribution (the mode for lognormal) at 10,000\n */\nconst median = 81_030_839.821_735_2\nconst defaultMu = Math.log(median)\nconst defaultSigma = 3\nconst mode = Math.exp(defaultMu - Math.pow(defaultSigma, 2))\n/**\n * Calculates the log-normal probability density\n * @param x the value at which you want to calculate the probability density\n * @param mu mean of the associated normal distribution\n * @param sigma standard deviation of the associated normal distribution\n * @returns\n */\nconst logNormalProbabilityDensity = (x: number, mu: number = defaultMu, sigma: number = defaultSigma): number => {\n if (x <= 0) return 0\n const logX = Math.log(x)\n return (1 / (x * sigma * Math.sqrt(2 * Math.PI))) * Math.exp(-0.5 * Math.pow((logX - mu) / sigma, 2))\n}\n\n/**\n * For a lognormal distribution, the peak of the distribution is the mode\n */\nconst maxProbabilityDensity = logNormalProbabilityDensity(mode)\n\nconst maxScore = 10\n\n/**\n * We're working on some assumptions here:\n * - If there's < 1000 NFTs in your collection it starts becoming too niche\n * - If there's > 20,000 NFTs in your collection it starts becoming too broad\n * So there's a sweet spot somewhere between 2000 and 10,000\n * where a collection has enough NFTs to be interesting, but\n * not so many that it's teetering on a diluted money grab.\n * To model that we're using a log-normal distribution optimized\n * to maximally reward collections in the aforementioned range\n * @param nft\n * @returns\n */\nexport const scoreTotal = (nft: NftCollectionCount): Score => {\n const density = logNormalProbabilityDensity(nft.total)\n const score: Score = [density, maxProbabilityDensity]\n return normalize(score, maxScore)\n}\n", "import type { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { WeightedScoringCriteria } from '@xyo-network/crypto-nft-score-model'\n\nimport { scoreMetadata, scoreTotal } from './scoring/index.ts'\n\nexport const scoringCriteria: Record<string, WeightedScoringCriteria<NftCollectionInfo>> = {\n ...scoreMetadata,\n Total: { score: scoreTotal, weight: 2 },\n}\n", "import type { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { Score } from '@xyo-network/crypto-nft-score-model'\n\nimport { scoringCriteria } from './criteria/index.ts'\n\nexport type ScoringCriteriaKey = keyof typeof scoringCriteria & PropertyKey\n\nexport type NftCollectionAnalysis = Record<ScoringCriteriaKey, Score>\n\nexport const analyzeNftCollection = async (\n /**\n * The NFT to evaluate\n */\n nft: NftCollectionInfo,\n): Promise<NftCollectionAnalysis> => {\n const result = Object.fromEntries(\n await Promise.all(\n Object.entries(scoringCriteria).map(async ([key, { score, weight }]) => {\n const rawScore = await score(nft)\n const weighted = rawScore.map(v => v * weight) as Score\n return [key, weighted] as const\n }),\n ),\n ) as NftCollectionAnalysis\n return result\n}\n", "import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { createPayloadSetDivinerPlugin, PayloadSetSchema } from '@xyo-network/sdk-js'\n\nimport { NftCollectionScoreDiviner } from './Diviner.ts'\n\nexport const NftCollectionScoreDivinerPlugin = () =>\n createPayloadSetDivinerPlugin<NftCollectionScoreDiviner>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n diviner: async (params) => {\n const result = await NftCollectionScoreDiviner.create(params)\n return result\n },\n },\n )\n"],
5
- "mappings": "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",
6
- "names": ["normalize", "maxScore", "normalize", "defaultMu", "defaultSigma", "maxProbabilityDensity", "maxScore"]
7
- }
@@ -1,2 +0,0 @@
1
- export * from './rating/index.ts';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
@@ -1,11 +0,0 @@
1
- import type { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- import type { Score } from '@xyo-network/crypto-nft-score-model';
3
- import { scoringCriteria } from './criteria/index.ts';
4
- export type ScoringCriteriaKey = keyof typeof scoringCriteria & PropertyKey;
5
- export type NftCollectionAnalysis = Record<ScoringCriteriaKey, Score>;
6
- export declare const analyzeNftCollection: (
7
- /**
8
- * The NFT to evaluate
9
- */
10
- nft: NftCollectionInfo) => Promise<NftCollectionAnalysis>;
11
- //# sourceMappingURL=analyzeNftCollection.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analyzeNftCollection.d.ts","sourceRoot":"","sources":["../../../../src/lib/rating/analyzeNftCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mDAAmD,CAAA;AAC1F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAA;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,eAAe,GAAG,WAAW,CAAA;AAE3E,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAA;AAErE,eAAO,MAAM,oBAAoB;AAC/B;;GAEG;AACH,KAAK,iBAAiB,KACrB,OAAO,CAAC,qBAAqB,CAW/B,CAAA"}
@@ -1,4 +0,0 @@
1
- import type { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- import type { WeightedScoringCriteria } from '@xyo-network/crypto-nft-score-model';
3
- export declare const scoringCriteria: Record<string, WeightedScoringCriteria<NftCollectionInfo>>;
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/rating/criteria/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mDAAmD,CAAA;AAC1F,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAA;AAIlF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,iBAAiB,CAAC,CAGtF,CAAA"}
@@ -1,3 +0,0 @@
1
- export * from './metadata/index.ts';
2
- export * from './total.ts';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/rating/criteria/scoring/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,YAAY,CAAA"}
@@ -1,2 +0,0 @@
1
- export * from './metadata.ts';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA"}
@@ -1,5 +0,0 @@
1
- import type { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- import type { WeightedScoringCriteria } from '@xyo-network/crypto-nft-score-model';
3
- export declare const attributeScoringCriteria: Record<string, WeightedScoringCriteria<NftCollectionInfo>>;
4
- export declare const scoreMetadata: Record<string, WeightedScoringCriteria<NftCollectionInfo>>;
5
- //# sourceMappingURL=metadata.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mDAAmD,CAAA;AAC1F,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAA;AAKlF,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,iBAAiB,CAAC,CAG/F,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,iBAAiB,CAAC,CAAmC,CAAA"}
@@ -1,4 +0,0 @@
1
- import type { NftCollectionAttributeMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- import type { Score } from '@xyo-network/crypto-nft-score-model';
3
- export declare const scoreIndividualAttributes: (info: NftCollectionAttributeMetrics) => Score;
4
- //# sourceMappingURL=scoreIndividualAttributes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scoreIndividualAttributes.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/scoreIndividualAttributes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,mDAAmD,CAAA;AACtG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAA;AAKhE,eAAO,MAAM,yBAAyB,GAAI,MAAM,6BAA6B,KAAG,KAa/E,CAAA"}
@@ -1,24 +0,0 @@
1
- import type { NftCollectionAttributeMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- import type { Score } from '@xyo-network/crypto-nft-score-model';
3
- /**
4
- * We're working on some assumptions here:
5
- *
6
- * - If you have a 100% chance of getting a trait, everyone get's a trophy
7
- * - If you have a 50% chance of getting a trait, it's not rare
8
- * - If you have a 0% chance of getting a trait, it's not fun
9
- *
10
- * So we're looking for something Pareto-ish (somewhere between
11
- * 80/20 or 90/10) as that's a good & sustainable model for the
12
- * distribution of many traits in real life.
13
- * However, we also don't want to maximally reward collections
14
- * that have a lot of single attributes distributed uniformly
15
- * (basically a 0% trait probably) as that's perfectly entropic
16
- * but not very interesting (some overlap is desirable).
17
- * So we're using a Gaussian distribution to model the
18
- * probability density of the joint probability of all traits
19
- * centered around 15%.
20
- * @param info
21
- * @returns
22
- */
23
- export declare const scoreTotalAttributes: (info: NftCollectionAttributeMetrics) => Score;
24
- //# sourceMappingURL=scoreTotalAttributes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scoreTotalAttributes.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/scoreTotalAttributes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,mDAAmD,CAAA;AACtG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAA;AAkChE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,oBAAoB,GAAI,MAAM,6BAA6B,KAAG,KAU1E,CAAA"}
@@ -1,16 +0,0 @@
1
- import type { NftCollectionCount } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- import type { Score } from '@xyo-network/crypto-nft-score-model';
3
- /**
4
- * We're working on some assumptions here:
5
- * - If there's < 1000 NFTs in your collection it starts becoming too niche
6
- * - If there's > 20,000 NFTs in your collection it starts becoming too broad
7
- * So there's a sweet spot somewhere between 2000 and 10,000
8
- * where a collection has enough NFTs to be interesting, but
9
- * not so many that it's teetering on a diluted money grab.
10
- * To model that we're using a log-normal distribution optimized
11
- * to maximally reward collections in the aforementioned range
12
- * @param nft
13
- * @returns
14
- */
15
- export declare const scoreTotal: (nft: NftCollectionCount) => Score;
16
- //# sourceMappingURL=total.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"total.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/rating/criteria/scoring/total.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAA;AAC3F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAA;AAgChE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,kBAAkB,KAAG,KAIpD,CAAA"}
@@ -1,3 +0,0 @@
1
- export * from './analyzeNftCollection.ts';
2
- export * from './criteria/index.ts';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/rating/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA"}
@@ -1,10 +0,0 @@
1
- import type { NftCollectionScoreDivinerConfig } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- import type { AnyConfigSchema, DivinerParams, Payload, Schema } from '@xyo-network/sdk-js';
3
- import { AbstractDiviner } from '@xyo-network/sdk-js';
4
- export type NftCollectionScoreDivinerParams = DivinerParams<AnyConfigSchema<NftCollectionScoreDivinerConfig>>;
5
- export declare class NftCollectionScoreDiviner<TParams extends NftCollectionScoreDivinerParams = NftCollectionScoreDivinerParams> extends AbstractDiviner<TParams> {
6
- static readonly configSchemas: Schema[];
7
- static readonly defaultConfigSchema: Schema;
8
- protected divineHandler: (payloads?: Payload[]) => Promise<Payload[]>;
9
- }
10
- //# sourceMappingURL=Diviner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Diviner.d.ts","sourceRoot":"","sources":["../../src/Diviner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,+BAA+B,EAChC,MAAM,mDAAmD,CAAA;AAM1D,OAAO,KAAK,EACV,eAAe,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAChD,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAkB,MAAM,qBAAqB,CAAA;AAKrE,MAAM,MAAM,+BAA+B,GAAG,aAAa,CAAC,eAAe,CAAC,+BAA+B,CAAC,CAAC,CAAA;AAc7G,qBAAa,yBAAyB,CACpC,OAAO,SAAS,+BAA+B,GAAG,+BAA+B,CACjF,SAAQ,eAAe,CAAC,OAAO,CAAC;IAChC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAkE;IAClH,gBAAyB,mBAAmB,EAAE,MAAM,CAAwC;IAE5F,UAAmB,aAAa,GAAU,WAAW,OAAO,EAAE,KAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAYlF;CACF"}
@@ -1,3 +0,0 @@
1
- import { NftCollectionScoreDiviner } from './Diviner.ts';
2
- export declare const NftCollectionScoreDivinerPlugin: () => import("@xyo-network/sdk-js").PayloadSetDivinerPlugin<NftCollectionScoreDiviner<import("./Diviner.ts").NftCollectionScoreDivinerParams>>;
3
- //# sourceMappingURL=Plugin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AAExD,eAAO,MAAM,+BAA+B,gJASzC,CAAA"}
@@ -1,4 +0,0 @@
1
- export * from './Diviner.ts';
2
- export * from './lib/index.ts';
3
- export { NftCollectionScoreDivinerPlugin as default, NftCollectionScoreDivinerPlugin } from './Plugin.ts';
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,OAAO,EAAE,+BAA+B,IAAI,OAAO,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAA"}
@@ -1,155 +0,0 @@
1
- // src/Diviner.ts
2
- import {
3
- isNftCollectionInfo,
4
- NftCollectionScoreDivinerConfigSchema,
5
- NftCollectionScoreSchema
6
- } from "@xyo-network/crypto-nft-collection-payload-plugin";
7
- import { AbstractDiviner, PayloadBuilder } from "@xyo-network/sdk-js";
8
-
9
- // src/lib/rating/criteria/scoring/metadata/scoreIndividualAttributes.ts
10
- import { normalize } from "@xyo-network/crypto-nft-score-model";
11
- var maxScore = 10;
12
- var scoreIndividualAttributes = (info) => {
13
- const { attributes } = info.metrics.metadata;
14
- const entries = Object.entries(attributes);
15
- if (entries.length === 0) return [0, maxScore];
16
- const scores = Object.entries(attributes).flatMap(([_trait, { values }]) => {
17
- return Object.entries(values).map(([_traitValue, metrics]) => {
18
- const rarity = Math.min(Math.round((1 - metrics.binomial.p) * maxScore), maxScore);
19
- return [rarity, maxScore];
20
- });
21
- });
22
- const total = scores.reduce(([a, b], [c, d]) => [a + c, b + d], [0, 0]);
23
- return normalize(total, maxScore);
24
- };
25
-
26
- // src/lib/rating/criteria/scoring/metadata/scoreTotalAttributes.ts
27
- import { normalize as normalize2 } from "@xyo-network/crypto-nft-score-model";
28
- var maxScore2 = 10;
29
- var defaultMu = 0.15;
30
- var defaultSigma = 0.1;
31
- var gaussianProbabilityDensity = (x, mu = defaultMu, sigma = defaultSigma) => {
32
- const sqrtTwoPi = Math.sqrt(2 * Math.PI);
33
- const denominator = sigma * sqrtTwoPi;
34
- const power = -0.5 * Math.pow((x - mu) / sigma, 2);
35
- return 1 / denominator * Math.exp(power);
36
- };
37
- var maxProbabilityDensity = gaussianProbabilityDensity(defaultMu);
38
- var scoreTotalAttributes = (info) => {
39
- const { attributes } = info.metrics.metadata;
40
- const jointProbability = Object.entries(attributes).reduce((acc, [_trait, { metrics }]) => {
41
- return acc * metrics.binomial.p;
42
- }, 1);
43
- const probabilityDensity = gaussianProbabilityDensity(jointProbability);
44
- const score = [probabilityDensity, maxProbabilityDensity];
45
- return normalize2(score, maxScore2);
46
- };
47
-
48
- // src/lib/rating/criteria/scoring/metadata/metadata.ts
49
- var attributeScoringCriteria = {
50
- "Metadata Attributes Individual": { score: scoreIndividualAttributes, weight: 2 },
51
- "Metadata Attributes Total": { score: scoreTotalAttributes, weight: 2 }
52
- };
53
- var scoreMetadata = { ...attributeScoringCriteria };
54
-
55
- // src/lib/rating/criteria/scoring/total.ts
56
- import { normalize as normalize3 } from "@xyo-network/crypto-nft-score-model";
57
- var median = 810308398217352e-7;
58
- var defaultMu2 = Math.log(median);
59
- var defaultSigma2 = 3;
60
- var mode = Math.exp(defaultMu2 - Math.pow(defaultSigma2, 2));
61
- var logNormalProbabilityDensity = (x, mu = defaultMu2, sigma = defaultSigma2) => {
62
- if (x <= 0) return 0;
63
- const logX = Math.log(x);
64
- return 1 / (x * sigma * Math.sqrt(2 * Math.PI)) * Math.exp(-0.5 * Math.pow((logX - mu) / sigma, 2));
65
- };
66
- var maxProbabilityDensity2 = logNormalProbabilityDensity(mode);
67
- var maxScore3 = 10;
68
- var scoreTotal = (nft) => {
69
- const density = logNormalProbabilityDensity(nft.total);
70
- const score = [density, maxProbabilityDensity2];
71
- return normalize3(score, maxScore3);
72
- };
73
-
74
- // src/lib/rating/criteria/index.ts
75
- var scoringCriteria = {
76
- ...scoreMetadata,
77
- Total: { score: scoreTotal, weight: 2 }
78
- };
79
-
80
- // src/lib/rating/analyzeNftCollection.ts
81
- var analyzeNftCollection = async (nft) => {
82
- const result = Object.fromEntries(
83
- await Promise.all(
84
- Object.entries(scoringCriteria).map(async ([key, { score, weight }]) => {
85
- const rawScore = await score(nft);
86
- const weighted = rawScore.map((v) => v * weight);
87
- return [key, weighted];
88
- })
89
- )
90
- );
91
- return result;
92
- };
93
-
94
- // src/Diviner.ts
95
- var toNftCollectionScore = (nftCollectionInfo, scores) => {
96
- const {
97
- name,
98
- symbol,
99
- address,
100
- chainId,
101
- types
102
- } = nftCollectionInfo;
103
- const metadata = {
104
- address,
105
- chainId,
106
- name,
107
- symbol,
108
- types
109
- };
110
- return {
111
- ...metadata,
112
- schema: NftCollectionScoreSchema,
113
- scores
114
- };
115
- };
116
- var NftCollectionScoreDiviner = class extends AbstractDiviner {
117
- static configSchemas = [...super.configSchemas, NftCollectionScoreDivinerConfigSchema];
118
- static defaultConfigSchema = NftCollectionScoreDivinerConfigSchema;
119
- divineHandler = async (payloads) => {
120
- const nftCollectionInfos = payloads?.filter(isNftCollectionInfo) ?? [];
121
- const results = await Promise.all(
122
- nftCollectionInfos.map(async (nftCollectionInfo) => {
123
- const score = toNftCollectionScore(nftCollectionInfo, await analyzeNftCollection(nftCollectionInfo));
124
- const sourceHash = await PayloadBuilder.dataHash(nftCollectionInfo);
125
- return {
126
- ...score,
127
- schema: NftCollectionScoreSchema,
128
- sources: [sourceHash]
129
- };
130
- })
131
- );
132
- return results;
133
- };
134
- };
135
-
136
- // src/Plugin.ts
137
- import { NftSchema } from "@xyo-network/crypto-nft-payload-plugin";
138
- import { createPayloadSetDivinerPlugin, PayloadSetSchema } from "@xyo-network/sdk-js";
139
- var NftCollectionScoreDivinerPlugin = () => createPayloadSetDivinerPlugin(
140
- { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },
141
- {
142
- diviner: async (params) => {
143
- const result = await NftCollectionScoreDiviner.create(params);
144
- return result;
145
- }
146
- }
147
- );
148
- export {
149
- NftCollectionScoreDiviner,
150
- NftCollectionScoreDivinerPlugin,
151
- analyzeNftCollection,
152
- NftCollectionScoreDivinerPlugin as default,
153
- scoringCriteria
154
- };
155
- //# sourceMappingURL=index.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/Diviner.ts", "../../src/lib/rating/criteria/scoring/metadata/scoreIndividualAttributes.ts", "../../src/lib/rating/criteria/scoring/metadata/scoreTotalAttributes.ts", "../../src/lib/rating/criteria/scoring/metadata/metadata.ts", "../../src/lib/rating/criteria/scoring/total.ts", "../../src/lib/rating/criteria/index.ts", "../../src/lib/rating/analyzeNftCollection.ts", "../../src/Plugin.ts"],
4
- "sourcesContent": ["import type {\n NftCollectionInfo,\n NftCollectionMetadata,\n NftCollectionScore,\n NftCollectionScoreDivinerConfig,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport {\n isNftCollectionInfo,\n NftCollectionScoreDivinerConfigSchema,\n NftCollectionScoreSchema,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type {\n AnyConfigSchema, DivinerParams, Payload, Schema,\n} from '@xyo-network/sdk-js'\nimport { AbstractDiviner, PayloadBuilder } from '@xyo-network/sdk-js'\n\nimport type { NftCollectionAnalysis } from './lib/index.ts'\nimport { analyzeNftCollection } from './lib/index.ts'\n\nexport type NftCollectionScoreDivinerParams = DivinerParams<AnyConfigSchema<NftCollectionScoreDivinerConfig>>\n\nconst toNftCollectionScore = (nftCollectionInfo: NftCollectionInfo, scores: NftCollectionAnalysis): NftCollectionScore => {\n const {\n name, symbol, address, chainId, types,\n } = nftCollectionInfo\n const metadata: NftCollectionMetadata = {\n address, chainId, name, symbol, types,\n }\n return {\n ...metadata, schema: NftCollectionScoreSchema, scores,\n }\n}\n\nexport class NftCollectionScoreDiviner<\n TParams extends NftCollectionScoreDivinerParams = NftCollectionScoreDivinerParams,\n> extends AbstractDiviner<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftCollectionScoreDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftCollectionScoreDivinerConfigSchema\n\n protected override divineHandler = async (payloads?: Payload[]): Promise<Payload[]> => {\n const nftCollectionInfos = payloads?.filter(isNftCollectionInfo) ?? []\n const results = await Promise.all(\n nftCollectionInfos.map<Promise<NftCollectionScore>>(async (nftCollectionInfo) => {\n const score = toNftCollectionScore(nftCollectionInfo, await analyzeNftCollection(nftCollectionInfo))\n const sourceHash = await PayloadBuilder.dataHash(nftCollectionInfo)\n return {\n ...score, schema: NftCollectionScoreSchema, sources: [sourceHash],\n } as NftCollectionScore\n }),\n )\n return results\n }\n}\n", "import type { NftCollectionAttributeMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { Score } from '@xyo-network/crypto-nft-score-model'\nimport { normalize } from '@xyo-network/crypto-nft-score-model'\n\nconst maxScore = 10\n\nexport const scoreIndividualAttributes = (info: NftCollectionAttributeMetrics): Score => {\n const { attributes } = info.metrics.metadata\n const entries = Object.entries(attributes)\n if (entries.length === 0) return [0, maxScore]\n const scores = Object.entries(attributes).flatMap(([_trait, { values }]) => {\n return Object.entries(values).map<Score>(([_traitValue, metrics]) => {\n const rarity = Math.min(Math.round((1 - metrics.binomial.p) * maxScore), maxScore)\n return [rarity, maxScore]\n })\n })\n // eslint-disable-next-line unicorn/no-array-reduce\n const total = scores.reduce<Score>(([a, b], [c, d]) => [a + c, b + d], [0, 0])\n return normalize(total, maxScore)\n}\n", "import type { NftCollectionAttributeMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { Score } from '@xyo-network/crypto-nft-score-model'\nimport { normalize } from '@xyo-network/crypto-nft-score-model'\n\nconst maxScore = 10\n\n/**\n * Mean: What value is the distribution centered around\n */\nconst defaultMu = 0.15\n\n/**\n * Standard Deviation: How spread out is the distribution\n */\nconst defaultSigma = 0.1\n\n/**\n * Calculates the Gaussian probability density\n * @param x\n * @param mu Mean\n * @param sigma Standard Deviation\n * @returns\n */\nconst gaussianProbabilityDensity = (x: number, mu: number = defaultMu, sigma: number = defaultSigma): number => {\n const sqrtTwoPi = Math.sqrt(2 * Math.PI)\n const denominator = sigma * sqrtTwoPi\n const power = -0.5 * Math.pow((x - mu) / sigma, 2)\n return (1 / denominator) * Math.exp(power)\n}\n\n/**\n * For a Gaussian distribution, the peak of the distribution is the mean\n */\nconst maxProbabilityDensity = gaussianProbabilityDensity(defaultMu)\n\n/**\n * We're working on some assumptions here:\n *\n * - If you have a 100% chance of getting a trait, everyone get's a trophy\n * - If you have a 50% chance of getting a trait, it's not rare\n * - If you have a 0% chance of getting a trait, it's not fun\n *\n * So we're looking for something Pareto-ish (somewhere between\n * 80/20 or 90/10) as that's a good & sustainable model for the\n * distribution of many traits in real life.\n * However, we also don't want to maximally reward collections\n * that have a lot of single attributes distributed uniformly\n * (basically a 0% trait probably) as that's perfectly entropic\n * but not very interesting (some overlap is desirable).\n * So we're using a Gaussian distribution to model the\n * probability density of the joint probability of all traits\n * centered around 15%.\n * @param info\n * @returns\n */\nexport const scoreTotalAttributes = (info: NftCollectionAttributeMetrics): Score => {\n const { attributes } = info.metrics.metadata\n // This has somewhat of a filtering function by causing anything with 100% probability to\n // add no value to the end score\n const jointProbability = Object.entries(attributes).reduce((acc, [_trait, { metrics }]) => {\n return acc * metrics.binomial.p\n }, 1)\n const probabilityDensity = gaussianProbabilityDensity(jointProbability)\n const score: Score = [probabilityDensity, maxProbabilityDensity]\n return normalize(score, maxScore)\n}\n", "import type { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { WeightedScoringCriteria } from '@xyo-network/crypto-nft-score-model'\n\nimport { scoreIndividualAttributes } from './scoreIndividualAttributes.ts'\nimport { scoreTotalAttributes } from './scoreTotalAttributes.ts'\n\nexport const attributeScoringCriteria: Record<string, WeightedScoringCriteria<NftCollectionInfo>> = {\n 'Metadata Attributes Individual': { score: scoreIndividualAttributes, weight: 2 },\n 'Metadata Attributes Total': { score: scoreTotalAttributes, weight: 2 },\n}\n\nexport const scoreMetadata: Record<string, WeightedScoringCriteria<NftCollectionInfo>> = { ...attributeScoringCriteria }\n", "import type { NftCollectionCount } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { Score } from '@xyo-network/crypto-nft-score-model'\nimport { normalize } from '@xyo-network/crypto-nft-score-model'\n\n/**\n * This \"magic\" value was obtained using Solver in Excel\n * to find the median, with mu/sigma fixed, which maximizes\n * the distribution (the mode for lognormal) at 10,000\n */\nconst median = 81_030_839.821_735_2\nconst defaultMu = Math.log(median)\nconst defaultSigma = 3\nconst mode = Math.exp(defaultMu - Math.pow(defaultSigma, 2))\n/**\n * Calculates the log-normal probability density\n * @param x the value at which you want to calculate the probability density\n * @param mu mean of the associated normal distribution\n * @param sigma standard deviation of the associated normal distribution\n * @returns\n */\nconst logNormalProbabilityDensity = (x: number, mu: number = defaultMu, sigma: number = defaultSigma): number => {\n if (x <= 0) return 0\n const logX = Math.log(x)\n return (1 / (x * sigma * Math.sqrt(2 * Math.PI))) * Math.exp(-0.5 * Math.pow((logX - mu) / sigma, 2))\n}\n\n/**\n * For a lognormal distribution, the peak of the distribution is the mode\n */\nconst maxProbabilityDensity = logNormalProbabilityDensity(mode)\n\nconst maxScore = 10\n\n/**\n * We're working on some assumptions here:\n * - If there's < 1000 NFTs in your collection it starts becoming too niche\n * - If there's > 20,000 NFTs in your collection it starts becoming too broad\n * So there's a sweet spot somewhere between 2000 and 10,000\n * where a collection has enough NFTs to be interesting, but\n * not so many that it's teetering on a diluted money grab.\n * To model that we're using a log-normal distribution optimized\n * to maximally reward collections in the aforementioned range\n * @param nft\n * @returns\n */\nexport const scoreTotal = (nft: NftCollectionCount): Score => {\n const density = logNormalProbabilityDensity(nft.total)\n const score: Score = [density, maxProbabilityDensity]\n return normalize(score, maxScore)\n}\n", "import type { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { WeightedScoringCriteria } from '@xyo-network/crypto-nft-score-model'\n\nimport { scoreMetadata, scoreTotal } from './scoring/index.ts'\n\nexport const scoringCriteria: Record<string, WeightedScoringCriteria<NftCollectionInfo>> = {\n ...scoreMetadata,\n Total: { score: scoreTotal, weight: 2 },\n}\n", "import type { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport type { Score } from '@xyo-network/crypto-nft-score-model'\n\nimport { scoringCriteria } from './criteria/index.ts'\n\nexport type ScoringCriteriaKey = keyof typeof scoringCriteria & PropertyKey\n\nexport type NftCollectionAnalysis = Record<ScoringCriteriaKey, Score>\n\nexport const analyzeNftCollection = async (\n /**\n * The NFT to evaluate\n */\n nft: NftCollectionInfo,\n): Promise<NftCollectionAnalysis> => {\n const result = Object.fromEntries(\n await Promise.all(\n Object.entries(scoringCriteria).map(async ([key, { score, weight }]) => {\n const rawScore = await score(nft)\n const weighted = rawScore.map(v => v * weight) as Score\n return [key, weighted] as const\n }),\n ),\n ) as NftCollectionAnalysis\n return result\n}\n", "import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { createPayloadSetDivinerPlugin, PayloadSetSchema } from '@xyo-network/sdk-js'\n\nimport { NftCollectionScoreDiviner } from './Diviner.ts'\n\nexport const NftCollectionScoreDivinerPlugin = () =>\n createPayloadSetDivinerPlugin<NftCollectionScoreDiviner>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n diviner: async (params) => {\n const result = await NftCollectionScoreDiviner.create(params)\n return result\n },\n },\n )\n"],
5
- "mappings": "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",
6
- "names": ["normalize", "maxScore", "normalize", "defaultMu", "defaultSigma", "maxProbabilityDensity", "maxScore"]
7
- }
@@ -1,2 +0,0 @@
1
- export * from './rating/index.ts';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
@@ -1,11 +0,0 @@
1
- import type { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- import type { Score } from '@xyo-network/crypto-nft-score-model';
3
- import { scoringCriteria } from './criteria/index.ts';
4
- export type ScoringCriteriaKey = keyof typeof scoringCriteria & PropertyKey;
5
- export type NftCollectionAnalysis = Record<ScoringCriteriaKey, Score>;
6
- export declare const analyzeNftCollection: (
7
- /**
8
- * The NFT to evaluate
9
- */
10
- nft: NftCollectionInfo) => Promise<NftCollectionAnalysis>;
11
- //# sourceMappingURL=analyzeNftCollection.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analyzeNftCollection.d.ts","sourceRoot":"","sources":["../../../../src/lib/rating/analyzeNftCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mDAAmD,CAAA;AAC1F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAA;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,eAAe,GAAG,WAAW,CAAA;AAE3E,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAA;AAErE,eAAO,MAAM,oBAAoB;AAC/B;;GAEG;AACH,KAAK,iBAAiB,KACrB,OAAO,CAAC,qBAAqB,CAW/B,CAAA"}
@@ -1,4 +0,0 @@
1
- import type { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- import type { WeightedScoringCriteria } from '@xyo-network/crypto-nft-score-model';
3
- export declare const scoringCriteria: Record<string, WeightedScoringCriteria<NftCollectionInfo>>;
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/rating/criteria/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mDAAmD,CAAA;AAC1F,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAA;AAIlF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,iBAAiB,CAAC,CAGtF,CAAA"}
@@ -1,3 +0,0 @@
1
- export * from './metadata/index.ts';
2
- export * from './total.ts';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/rating/criteria/scoring/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,YAAY,CAAA"}
@@ -1,2 +0,0 @@
1
- export * from './metadata.ts';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA"}
@@ -1,5 +0,0 @@
1
- import type { NftCollectionInfo } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- import type { WeightedScoringCriteria } from '@xyo-network/crypto-nft-score-model';
3
- export declare const attributeScoringCriteria: Record<string, WeightedScoringCriteria<NftCollectionInfo>>;
4
- export declare const scoreMetadata: Record<string, WeightedScoringCriteria<NftCollectionInfo>>;
5
- //# sourceMappingURL=metadata.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mDAAmD,CAAA;AAC1F,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAA;AAKlF,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,iBAAiB,CAAC,CAG/F,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,iBAAiB,CAAC,CAAmC,CAAA"}
@@ -1,4 +0,0 @@
1
- import type { NftCollectionAttributeMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- import type { Score } from '@xyo-network/crypto-nft-score-model';
3
- export declare const scoreIndividualAttributes: (info: NftCollectionAttributeMetrics) => Score;
4
- //# sourceMappingURL=scoreIndividualAttributes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scoreIndividualAttributes.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/scoreIndividualAttributes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,mDAAmD,CAAA;AACtG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAA;AAKhE,eAAO,MAAM,yBAAyB,GAAI,MAAM,6BAA6B,KAAG,KAa/E,CAAA"}
@@ -1,24 +0,0 @@
1
- import type { NftCollectionAttributeMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- import type { Score } from '@xyo-network/crypto-nft-score-model';
3
- /**
4
- * We're working on some assumptions here:
5
- *
6
- * - If you have a 100% chance of getting a trait, everyone get's a trophy
7
- * - If you have a 50% chance of getting a trait, it's not rare
8
- * - If you have a 0% chance of getting a trait, it's not fun
9
- *
10
- * So we're looking for something Pareto-ish (somewhere between
11
- * 80/20 or 90/10) as that's a good & sustainable model for the
12
- * distribution of many traits in real life.
13
- * However, we also don't want to maximally reward collections
14
- * that have a lot of single attributes distributed uniformly
15
- * (basically a 0% trait probably) as that's perfectly entropic
16
- * but not very interesting (some overlap is desirable).
17
- * So we're using a Gaussian distribution to model the
18
- * probability density of the joint probability of all traits
19
- * centered around 15%.
20
- * @param info
21
- * @returns
22
- */
23
- export declare const scoreTotalAttributes: (info: NftCollectionAttributeMetrics) => Score;
24
- //# sourceMappingURL=scoreTotalAttributes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scoreTotalAttributes.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/scoreTotalAttributes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,mDAAmD,CAAA;AACtG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAA;AAkChE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,oBAAoB,GAAI,MAAM,6BAA6B,KAAG,KAU1E,CAAA"}
@@ -1,16 +0,0 @@
1
- import type { NftCollectionCount } from '@xyo-network/crypto-nft-collection-payload-plugin';
2
- import type { Score } from '@xyo-network/crypto-nft-score-model';
3
- /**
4
- * We're working on some assumptions here:
5
- * - If there's < 1000 NFTs in your collection it starts becoming too niche
6
- * - If there's > 20,000 NFTs in your collection it starts becoming too broad
7
- * So there's a sweet spot somewhere between 2000 and 10,000
8
- * where a collection has enough NFTs to be interesting, but
9
- * not so many that it's teetering on a diluted money grab.
10
- * To model that we're using a log-normal distribution optimized
11
- * to maximally reward collections in the aforementioned range
12
- * @param nft
13
- * @returns
14
- */
15
- export declare const scoreTotal: (nft: NftCollectionCount) => Score;
16
- //# sourceMappingURL=total.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"total.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/rating/criteria/scoring/total.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAA;AAC3F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAA;AAgChE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,kBAAkB,KAAG,KAIpD,CAAA"}
@@ -1,3 +0,0 @@
1
- export * from './analyzeNftCollection.ts';
2
- export * from './criteria/index.ts';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/rating/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA"}