@xyo-network/crypto-nft-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 (116) hide show
  1. package/README.md +5 -0
  2. package/dist/neutral/index.mjs +31 -27
  3. package/dist/neutral/index.mjs.map +2 -2
  4. package/dist/neutral/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.d.ts +2 -2
  5. package/dist/neutral/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.d.ts.map +1 -1
  6. package/dist/neutral/lib/rating/criteria/scoring/metadata/image.d.ts.map +1 -1
  7. package/dist/neutral/lib/rating/criteria/scoring/metadata/imageData.d.ts.map +1 -1
  8. package/package.json +19 -20
  9. package/dist/browser/Diviner.d.ts +0 -11
  10. package/dist/browser/Diviner.d.ts.map +0 -1
  11. package/dist/browser/Plugin.d.ts +0 -3
  12. package/dist/browser/Plugin.d.ts.map +0 -1
  13. package/dist/browser/index.d.ts +0 -4
  14. package/dist/browser/index.d.ts.map +0 -1
  15. package/dist/browser/index.mjs +0 -368
  16. package/dist/browser/index.mjs.map +0 -7
  17. package/dist/browser/lib/index.d.ts +0 -2
  18. package/dist/browser/lib/index.d.ts.map +0 -1
  19. package/dist/browser/lib/rating/analyzeNft.d.ts +0 -11
  20. package/dist/browser/lib/rating/analyzeNft.d.ts.map +0 -1
  21. package/dist/browser/lib/rating/criteria/index.d.ts +0 -2
  22. package/dist/browser/lib/rating/criteria/index.d.ts.map +0 -1
  23. package/dist/browser/lib/rating/criteria/scoring/contract.d.ts +0 -4
  24. package/dist/browser/lib/rating/criteria/scoring/contract.d.ts.map +0 -1
  25. package/dist/browser/lib/rating/criteria/scoring/index.d.ts +0 -6
  26. package/dist/browser/lib/rating/criteria/scoring/index.d.ts.map +0 -1
  27. package/dist/browser/lib/rating/criteria/scoring/metadata/animationUrl.d.ts +0 -5
  28. package/dist/browser/lib/rating/criteria/scoring/metadata/animationUrl.d.ts.map +0 -1
  29. package/dist/browser/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.d.ts +0 -6
  30. package/dist/browser/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.d.ts.map +0 -1
  31. package/dist/browser/lib/rating/criteria/scoring/metadata/attributes/index.d.ts +0 -2
  32. package/dist/browser/lib/rating/criteria/scoring/metadata/attributes/index.d.ts.map +0 -1
  33. package/dist/browser/lib/rating/criteria/scoring/metadata/backgroundColor.d.ts +0 -5
  34. package/dist/browser/lib/rating/criteria/scoring/metadata/backgroundColor.d.ts.map +0 -1
  35. package/dist/browser/lib/rating/criteria/scoring/metadata/description.d.ts +0 -5
  36. package/dist/browser/lib/rating/criteria/scoring/metadata/description.d.ts.map +0 -1
  37. package/dist/browser/lib/rating/criteria/scoring/metadata/externalUrl.d.ts +0 -5
  38. package/dist/browser/lib/rating/criteria/scoring/metadata/externalUrl.d.ts.map +0 -1
  39. package/dist/browser/lib/rating/criteria/scoring/metadata/image.d.ts +0 -5
  40. package/dist/browser/lib/rating/criteria/scoring/metadata/image.d.ts.map +0 -1
  41. package/dist/browser/lib/rating/criteria/scoring/metadata/imageData.d.ts +0 -5
  42. package/dist/browser/lib/rating/criteria/scoring/metadata/imageData.d.ts.map +0 -1
  43. package/dist/browser/lib/rating/criteria/scoring/metadata/index.d.ts +0 -10
  44. package/dist/browser/lib/rating/criteria/scoring/metadata/index.d.ts.map +0 -1
  45. package/dist/browser/lib/rating/criteria/scoring/metadata/lib/index.d.ts +0 -2
  46. package/dist/browser/lib/rating/criteria/scoring/metadata/lib/index.d.ts.map +0 -1
  47. package/dist/browser/lib/rating/criteria/scoring/metadata/lib/urlHelpers.d.ts +0 -7
  48. package/dist/browser/lib/rating/criteria/scoring/metadata/lib/urlHelpers.d.ts.map +0 -1
  49. package/dist/browser/lib/rating/criteria/scoring/metadata/name.d.ts +0 -5
  50. package/dist/browser/lib/rating/criteria/scoring/metadata/name.d.ts.map +0 -1
  51. package/dist/browser/lib/rating/criteria/scoring/metadata/youtubeUrl.d.ts +0 -5
  52. package/dist/browser/lib/rating/criteria/scoring/metadata/youtubeUrl.d.ts.map +0 -1
  53. package/dist/browser/lib/rating/criteria/scoring/supply.d.ts +0 -4
  54. package/dist/browser/lib/rating/criteria/scoring/supply.d.ts.map +0 -1
  55. package/dist/browser/lib/rating/criteria/scoring/tokenId.d.ts +0 -10
  56. package/dist/browser/lib/rating/criteria/scoring/tokenId.d.ts.map +0 -1
  57. package/dist/browser/lib/rating/criteria/scoring/type.d.ts +0 -4
  58. package/dist/browser/lib/rating/criteria/scoring/type.d.ts.map +0 -1
  59. package/dist/browser/lib/rating/criteria/scoringCriteria.d.ts +0 -55
  60. package/dist/browser/lib/rating/criteria/scoringCriteria.d.ts.map +0 -1
  61. package/dist/browser/lib/rating/index.d.ts +0 -3
  62. package/dist/browser/lib/rating/index.d.ts.map +0 -1
  63. package/dist/node/Diviner.d.ts +0 -11
  64. package/dist/node/Diviner.d.ts.map +0 -1
  65. package/dist/node/Plugin.d.ts +0 -3
  66. package/dist/node/Plugin.d.ts.map +0 -1
  67. package/dist/node/index.d.ts +0 -4
  68. package/dist/node/index.d.ts.map +0 -1
  69. package/dist/node/index.mjs +0 -368
  70. package/dist/node/index.mjs.map +0 -7
  71. package/dist/node/lib/index.d.ts +0 -2
  72. package/dist/node/lib/index.d.ts.map +0 -1
  73. package/dist/node/lib/rating/analyzeNft.d.ts +0 -11
  74. package/dist/node/lib/rating/analyzeNft.d.ts.map +0 -1
  75. package/dist/node/lib/rating/criteria/index.d.ts +0 -2
  76. package/dist/node/lib/rating/criteria/index.d.ts.map +0 -1
  77. package/dist/node/lib/rating/criteria/scoring/contract.d.ts +0 -4
  78. package/dist/node/lib/rating/criteria/scoring/contract.d.ts.map +0 -1
  79. package/dist/node/lib/rating/criteria/scoring/index.d.ts +0 -6
  80. package/dist/node/lib/rating/criteria/scoring/index.d.ts.map +0 -1
  81. package/dist/node/lib/rating/criteria/scoring/metadata/animationUrl.d.ts +0 -5
  82. package/dist/node/lib/rating/criteria/scoring/metadata/animationUrl.d.ts.map +0 -1
  83. package/dist/node/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.d.ts +0 -6
  84. package/dist/node/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.d.ts.map +0 -1
  85. package/dist/node/lib/rating/criteria/scoring/metadata/attributes/index.d.ts +0 -2
  86. package/dist/node/lib/rating/criteria/scoring/metadata/attributes/index.d.ts.map +0 -1
  87. package/dist/node/lib/rating/criteria/scoring/metadata/backgroundColor.d.ts +0 -5
  88. package/dist/node/lib/rating/criteria/scoring/metadata/backgroundColor.d.ts.map +0 -1
  89. package/dist/node/lib/rating/criteria/scoring/metadata/description.d.ts +0 -5
  90. package/dist/node/lib/rating/criteria/scoring/metadata/description.d.ts.map +0 -1
  91. package/dist/node/lib/rating/criteria/scoring/metadata/externalUrl.d.ts +0 -5
  92. package/dist/node/lib/rating/criteria/scoring/metadata/externalUrl.d.ts.map +0 -1
  93. package/dist/node/lib/rating/criteria/scoring/metadata/image.d.ts +0 -5
  94. package/dist/node/lib/rating/criteria/scoring/metadata/image.d.ts.map +0 -1
  95. package/dist/node/lib/rating/criteria/scoring/metadata/imageData.d.ts +0 -5
  96. package/dist/node/lib/rating/criteria/scoring/metadata/imageData.d.ts.map +0 -1
  97. package/dist/node/lib/rating/criteria/scoring/metadata/index.d.ts +0 -10
  98. package/dist/node/lib/rating/criteria/scoring/metadata/index.d.ts.map +0 -1
  99. package/dist/node/lib/rating/criteria/scoring/metadata/lib/index.d.ts +0 -2
  100. package/dist/node/lib/rating/criteria/scoring/metadata/lib/index.d.ts.map +0 -1
  101. package/dist/node/lib/rating/criteria/scoring/metadata/lib/urlHelpers.d.ts +0 -7
  102. package/dist/node/lib/rating/criteria/scoring/metadata/lib/urlHelpers.d.ts.map +0 -1
  103. package/dist/node/lib/rating/criteria/scoring/metadata/name.d.ts +0 -5
  104. package/dist/node/lib/rating/criteria/scoring/metadata/name.d.ts.map +0 -1
  105. package/dist/node/lib/rating/criteria/scoring/metadata/youtubeUrl.d.ts +0 -5
  106. package/dist/node/lib/rating/criteria/scoring/metadata/youtubeUrl.d.ts.map +0 -1
  107. package/dist/node/lib/rating/criteria/scoring/supply.d.ts +0 -4
  108. package/dist/node/lib/rating/criteria/scoring/supply.d.ts.map +0 -1
  109. package/dist/node/lib/rating/criteria/scoring/tokenId.d.ts +0 -10
  110. package/dist/node/lib/rating/criteria/scoring/tokenId.d.ts.map +0 -1
  111. package/dist/node/lib/rating/criteria/scoring/type.d.ts +0 -4
  112. package/dist/node/lib/rating/criteria/scoring/type.d.ts.map +0 -1
  113. package/dist/node/lib/rating/criteria/scoringCriteria.d.ts +0 -55
  114. package/dist/node/lib/rating/criteria/scoringCriteria.d.ts.map +0 -1
  115. package/dist/node/lib/rating/index.d.ts +0 -3
  116. 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-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-diviner-score-plugin.svg
42
46
  [npm-link]: https://www.npmjs.com/package/@xyo-network/crypto-nft-diviner-score-plugin
43
47
  [license-badge]: https://img.shields.io/npm/l/@xyo-network/crypto-nft-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
@@ -27,7 +27,7 @@ import {
27
27
  // src/lib/rating/criteria/scoring/metadata/lib/urlHelpers.ts
28
28
  var web3Protocols = ["ipfs:", "ar:"];
29
29
  var toUrl = (url) => {
30
- if (!url) return void 0;
30
+ if (url == null || url === "") return void 0;
31
31
  try {
32
32
  return new URL(url);
33
33
  } catch {
@@ -43,8 +43,8 @@ var scoreNftAnimationUrl = (nft) => {
43
43
  return scoreAnimationUrl(nft.metadata?.animation_url);
44
44
  };
45
45
  var scoreAnimationUrl = (animation_url) => {
46
- const score = [0, 0];
47
46
  if (animation_url === void 0 || animation_url === null) return PASS2;
47
+ const score = [0, 0];
48
48
  incrementPossible(score);
49
49
  if (typeof animation_url !== "string") return score;
50
50
  incrementTotalAndPossible(score);
@@ -62,6 +62,7 @@ import {
62
62
  incrementTotal as incrementTotal2,
63
63
  incrementTotalAndPossible as incrementTotalAndPossible2
64
64
  } from "@xyo-network/crypto-nft-score-model";
65
+ var isRecord = (value) => typeof value === "object" && value !== null;
65
66
  var isDate = (value) => {
66
67
  if (isNumber(value)) {
67
68
  try {
@@ -77,9 +78,9 @@ var isNumber = (value) => typeof value === "number";
77
78
  var isPercentage = (value) => isNumber(value) && value >= 0 && value <= 100;
78
79
  var isNonEmptyString = (value) => typeof value === "string" && value.length > 0;
79
80
  var isNonEmptyStringOrNumber = (value) => value === "number" || isNonEmptyString(value);
80
- var evaluateNftAttributes = (nft) => nft?.metadata?.attributes ? evaluateAttributes(nft?.metadata?.attributes) : [0, 1];
81
+ var evaluateNftAttributes = (nft) => evaluateAttributes(nft?.metadata?.attributes);
81
82
  var evaluateAttributes = (attributes) => {
82
- if (!attributes || !Array.isArray(attributes) || attributes.length === 0) return [0, 1];
83
+ if (!Array.isArray(attributes) || attributes.length === 0) return [0, 1];
83
84
  const score = [0, 0];
84
85
  for (const attribute of attributes) {
85
86
  const [attributeTotal, attributePossible] = evaluateAttribute(attribute);
@@ -89,10 +90,11 @@ var evaluateAttributes = (attributes) => {
89
90
  };
90
91
  var evaluateAttribute = (attribute) => {
91
92
  const score = [0, 1];
92
- const max_value = attribute?.max_value;
93
- const trait_type = attribute?.trait_type;
94
- const value = attribute?.value;
95
- if (!attribute || typeof attribute !== "object" || !isNonEmptyString(trait_type) || !isNonEmptyStringOrNumber(value)) return score;
93
+ if (!isRecord(attribute)) return score;
94
+ const max_value = attribute.max_value;
95
+ const trait_type = attribute.trait_type;
96
+ const value = attribute.value;
97
+ if (!isNonEmptyString(trait_type) || !isNonEmptyStringOrNumber(value)) return score;
96
98
  incrementTotal2(score);
97
99
  incrementPossible2(score);
98
100
  if (validDisplayType(attribute)) incrementTotal2(score);
@@ -103,23 +105,23 @@ var evaluateAttribute = (attribute) => {
103
105
  return score;
104
106
  };
105
107
  var validDisplayType = (attribute) => {
106
- switch (attribute?.display_type) {
108
+ switch (attribute.display_type) {
107
109
  case "number":
108
110
  case "boost_number": {
109
- if (isNumber(attribute?.value)) return true;
111
+ if (isNumber(attribute.value)) return true;
110
112
  break;
111
113
  }
112
114
  case "boost_percentage": {
113
- if (isPercentage(attribute?.value)) return true;
115
+ if (isPercentage(attribute.value)) return true;
114
116
  break;
115
117
  }
116
118
  case "date": {
117
- if (isDate(attribute?.value)) return true;
119
+ if (isDate(attribute.value)) return true;
118
120
  break;
119
121
  }
120
122
  case "string":
121
123
  case void 0: {
122
- if (isNonEmptyString(attribute?.value)) return true;
124
+ if (isNonEmptyString(attribute.value)) return true;
123
125
  break;
124
126
  }
125
127
  default: {
@@ -141,8 +143,8 @@ var scoreNftBackgroundColor = (nft) => {
141
143
  return scoreBackgroundColor(nft.metadata?.background_color);
142
144
  };
143
145
  var scoreBackgroundColor = (background_color) => {
144
- const score = [0, 0];
145
146
  if (background_color === void 0 || background_color === null) return PASS3;
147
+ const score = [0, 0];
146
148
  incrementPossible3(score);
147
149
  if (typeof background_color !== "string") return score;
148
150
  incrementTotalAndPossible3(score);
@@ -157,7 +159,7 @@ var scoreNftDescription = (nft) => {
157
159
  };
158
160
  var scoreDescription = (description) => {
159
161
  const score = [0, 1];
160
- if (!description || typeof description !== "string") return score;
162
+ if (typeof description !== "string" || description.length === 0) return score;
161
163
  return incrementTotal4(score);
162
164
  };
163
165
 
@@ -178,15 +180,16 @@ var scoreExternalUrl = (external_url) => {
178
180
  import { incrementTotal as incrementTotal6, PASS as PASS4 } from "@xyo-network/crypto-nft-score-model";
179
181
  var MaxPossibleImageScore = 3;
180
182
  var scoreNftImage = (nft) => {
181
- if (nft?.metadata?.image) {
182
- return scoreImage(nft.metadata?.image);
183
- } else {
184
- return nft.metadata?.image_data ? PASS4 : [0, MaxPossibleImageScore];
183
+ const image = nft?.metadata?.image;
184
+ if (image != null && image !== "") {
185
+ return scoreImage(image);
185
186
  }
187
+ const imageData = nft.metadata?.image_data;
188
+ return imageData != null && imageData !== "" ? PASS4 : [0, MaxPossibleImageScore];
186
189
  };
187
190
  var scoreImage = (image) => {
188
191
  const score = [0, MaxPossibleImageScore];
189
- if (!image || typeof image !== "string" || !isValidUrl(image)) return score;
192
+ if (typeof image !== "string" || image.length === 0 || !isValidUrl(image)) return score;
190
193
  incrementTotal6(score);
191
194
  if (!isSecure(image)) return score;
192
195
  incrementTotal6(score);
@@ -209,14 +212,15 @@ var isValidImageData = (image_data) => {
209
212
  }
210
213
  };
211
214
  var scoreNftImageData = (nft) => {
212
- if (nft?.metadata?.image_data) {
213
- return scoreImageData(nft.metadata?.image_data);
214
- } else {
215
- return nft.metadata?.image ? PASS5 : [0, MaxPossibleImageDataScore];
215
+ const imageData = nft?.metadata?.image_data;
216
+ if (imageData != null && imageData !== "") {
217
+ return scoreImageData(imageData);
216
218
  }
219
+ const image = nft.metadata?.image;
220
+ return image != null && image !== "" ? PASS5 : [0, MaxPossibleImageDataScore];
217
221
  };
218
222
  var scoreImageData = (image_data) => {
219
- return !image_data || typeof image_data !== "string" || !isValidImageData(image_data) ? [0, MaxPossibleImageDataScore] : [MaxPossibleImageDataScore, MaxPossibleImageDataScore];
223
+ return typeof image_data !== "string" || image_data.length === 0 || !isValidImageData(image_data) ? [0, MaxPossibleImageDataScore] : [MaxPossibleImageDataScore, MaxPossibleImageDataScore];
220
224
  };
221
225
 
222
226
  // src/lib/rating/criteria/scoring/metadata/name.ts
@@ -226,7 +230,7 @@ var scoreNftName = (nft) => {
226
230
  };
227
231
  var scoreName = (name) => {
228
232
  const score = [0, 1];
229
- if (!name || typeof name !== "string") return score;
233
+ if (typeof name !== "string" || name.length === 0) return score;
230
234
  return incrementTotal7(score);
231
235
  };
232
236
 
@@ -271,7 +275,7 @@ var scoreTokenId = (nft) => {
271
275
  // src/lib/rating/criteria/scoring/type.ts
272
276
  import { FAIL as FAIL4, PASS as PASS9 } from "@xyo-network/crypto-nft-score-model";
273
277
  var scoreType = (nft) => {
274
- if (!((nft.types?.length ?? 0) > 0)) return FAIL4;
278
+ if ((nft.types?.length ?? 0) <= 0) return FAIL4;
275
279
  if (!Array.isArray(nft.types)) return FAIL4;
276
280
  const typesUpper = new Set(nft.types.map((t) => t?.toUpperCase()));
277
281
  if (!typesUpper.has("ERC721") && !typesUpper.has("ERC1155")) return FAIL4;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/Diviner.ts", "../../src/lib/rating/criteria/scoring/contract.ts", "../../src/lib/rating/criteria/scoring/metadata/animationUrl.ts", "../../src/lib/rating/criteria/scoring/metadata/lib/urlHelpers.ts", "../../src/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.ts", "../../src/lib/rating/criteria/scoring/metadata/backgroundColor.ts", "../../src/lib/rating/criteria/scoring/metadata/description.ts", "../../src/lib/rating/criteria/scoring/metadata/externalUrl.ts", "../../src/lib/rating/criteria/scoring/metadata/image.ts", "../../src/lib/rating/criteria/scoring/metadata/imageData.ts", "../../src/lib/rating/criteria/scoring/metadata/name.ts", "../../src/lib/rating/criteria/scoring/metadata/youtubeUrl.ts", "../../src/lib/rating/criteria/scoring/supply.ts", "../../src/lib/rating/criteria/scoring/tokenId.ts", "../../src/lib/rating/criteria/scoring/type.ts", "../../src/lib/rating/criteria/scoringCriteria.ts", "../../src/lib/rating/analyzeNft.ts", "../../src/Plugin.ts"],
4
- "sourcesContent": ["import type {\n NftInfo,\n NftScore,\n NftScoreDivinerConfig,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport {\n isNftInfo,\n NftScoreDivinerConfigSchema,\n NftScoreSchema,\n} from '@xyo-network/crypto-nft-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 { NftAnalysis } from './lib/index.ts'\nimport { analyzeNft } from './lib/index.ts'\n\nexport type NftScoreDivinerParams = DivinerParams<AnyConfigSchema<NftScoreDivinerConfig>>\n\nconst toNftScorePayload = (nftInfo: NftInfo, scores: NftAnalysis): NftScore => {\n const {\n\n address, chainId, types,\n } = nftInfo\n return {\n address, chainId, schema: NftScoreSchema, scores, types,\n }\n}\n\nexport const isNftScore = (payload: Payload): payload is NftScore => payload.schema === NftScoreSchema\n\nexport class NftScoreDiviner<TParams extends NftScoreDivinerParams = NftScoreDivinerParams> extends AbstractDiviner<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftScoreDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftScoreDivinerConfigSchema\n\n protected override divineHandler = async (payloads?: Payload[]): Promise<Payload[]> => {\n const nftInfos = payloads?.filter(isNftInfo) ?? []\n const results = await Promise.all(\n nftInfos.map<Promise<NftScore>>(async (nftInfo) => {\n const score = toNftScorePayload(nftInfo, await analyzeNft(nftInfo))\n const sourceHash = await PayloadBuilder.dataHash(nftInfo)\n return { ...score, sources: [sourceHash] }\n }),\n )\n return results\n }\n}\n", "import type { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { PassFailScoringFunction } from '@xyo-network/crypto-nft-score-model'\nimport { FAIL, PASS } from '@xyo-network/crypto-nft-score-model'\nimport { isAddress } from 'ethers'\n\nexport const scoreContractAddress: PassFailScoringFunction<NftInfoFields> = (nft: NftInfoFields) => {\n if (!nft.address) return FAIL\n if (typeof nft.address !== 'string') return FAIL\n if (!isAddress(nft.address)) return FAIL\n return PASS\n}\n", "import type { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport {\n incrementPossible, incrementTotal, incrementTotalAndPossible, PASS,\n} from '@xyo-network/crypto-nft-score-model'\n\nimport {\n isSecure, isValidUrl, isWeb3,\n} from './lib/index.ts'\n\nexport const scoreNftAnimationUrl = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreAnimationUrl(nft.metadata?.animation_url)\n}\n\nexport const scoreAnimationUrl = (animation_url: unknown): ScaledScore => {\n const score: ScaledScore = [0, 0]\n if (animation_url === undefined || animation_url === null) return PASS\n incrementPossible(score)\n if (typeof animation_url !== 'string') return score\n incrementTotalAndPossible(score)\n if (!isValidUrl(animation_url)) return score\n incrementTotalAndPossible(score)\n if (!isSecure(animation_url)) return score\n incrementTotalAndPossible(score)\n if (!isWeb3(animation_url)) return score\n return incrementTotal(score)\n}\n", "export const web3Protocols = ['ipfs:', 'ar:']\n\nexport const toUrl = (url?: string | null): URL | undefined => {\n if (!url) return undefined\n try {\n return new URL(url)\n } catch {\n return undefined\n }\n}\n\nexport const isValidUrl = (url?: string | null): boolean => toUrl(url) !== undefined\n// eslint-disable-next-line unicorn/prefer-includes\nexport const isWeb3 = (url?: string | null): boolean => web3Protocols.some(protocol => protocol === toUrl(url)?.protocol)\nexport const isWeb2 = (url?: string | null): boolean => !isWeb3(url)\nexport const isSecure = (url?: string | null): boolean => isWeb3(url) || toUrl(url)?.protocol === 'https:'\n", "import type {\n NftInfoFields, OpenSeaNftAttribute, OpenSeaNftInfoFields,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport type { ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport {\n incrementPossible, incrementTotal, incrementTotalAndPossible,\n} from '@xyo-network/crypto-nft-score-model'\n\nconst isDate = (value: unknown): value is Date => {\n if (isNumber(value)) {\n try {\n new Date(value)\n return true\n } catch {\n return false\n }\n }\n return false\n}\n\nconst isNumber = (value: unknown): value is number => typeof value === 'number'\n\nconst isPercentage = (value: unknown): boolean => isNumber(value) && value >= 0 && value <= 100\n\nconst isNonEmptyString = (value: unknown): value is string => typeof value === 'string' && value.length > 0\n\nconst isNonEmptyStringOrNumber = (value: unknown): value is string | number => value === 'number' || isNonEmptyString(value)\n\nexport const evaluateNftAttributes = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore =>\n nft?.metadata?.attributes ? evaluateAttributes(nft?.metadata?.attributes) : [0, 1]\n\nexport const evaluateAttributes = (attributes: unknown): ScaledScore => {\n if (!attributes || !Array.isArray(attributes) || attributes.length === 0) return [0, 1]\n const score: ScaledScore = [0, 0]\n for (const attribute of attributes) {\n const [attributeTotal, attributePossible] = evaluateAttribute(attribute)\n incrementTotalAndPossible(score, attributeTotal, attributePossible)\n }\n return [1, 1]\n}\n\nexport const evaluateAttribute = (attribute: OpenSeaNftAttribute): ScaledScore => {\n const score: ScaledScore = [0, 1]\n const max_value = attribute?.max_value\n const trait_type = attribute?.trait_type\n const value = attribute?.value\n\n // Validate trait_type & value\n if (!attribute || typeof attribute !== 'object' || !isNonEmptyString(trait_type) || !isNonEmptyStringOrNumber(value)) return score\n incrementTotal(score)\n\n // Validate display_type\n incrementPossible(score)\n if (validDisplayType(attribute)) incrementTotal(score)\n\n // Validate max_value\n if (max_value !== undefined) {\n incrementPossible(score)\n if (isNumber(max_value) && isNumber(value) && value <= max_value) incrementTotal(score)\n }\n\n return score\n}\n\nconst validDisplayType = (attribute: OpenSeaNftAttribute): boolean => {\n switch (attribute?.display_type) {\n case 'number':\n case 'boost_number': {\n if (isNumber(attribute?.value)) return true\n break\n }\n case 'boost_percentage': {\n if (isPercentage(attribute?.value)) return true\n break\n }\n case 'date': {\n if (isDate(attribute?.value)) return true\n break\n }\n case 'string':\n case undefined: {\n if (isNonEmptyString(attribute?.value)) return true\n break\n }\n default: {\n break\n }\n }\n return false\n}\n", "import type { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport {\n incrementPossible, incrementTotal, incrementTotalAndPossible, PASS,\n} from '@xyo-network/crypto-nft-score-model'\n\nconst isHexColor = /^[\\da-f]{6}$/i\n\nexport const scoreNftBackgroundColor = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreBackgroundColor(nft.metadata?.background_color)\n}\n\nexport const scoreBackgroundColor = (background_color: unknown): ScaledScore => {\n const score: ScaledScore = [0, 0]\n if (background_color === undefined || background_color === null) return PASS\n incrementPossible(score)\n if (typeof background_color !== 'string') return score\n incrementTotalAndPossible(score)\n if (!isHexColor.test(background_color.toUpperCase())) return score\n return incrementTotal(score)\n}\n", "import type { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport { incrementTotal } from '@xyo-network/crypto-nft-score-model'\n\nexport const scoreNftDescription = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreDescription(nft.metadata?.description)\n}\n\nexport const scoreDescription = (description: unknown): ScaledScore => {\n const score: ScaledScore = [0, 1]\n if (!description || typeof description !== 'string') return score\n return incrementTotal(score)\n}\n", "import type { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport { incrementTotal } from '@xyo-network/crypto-nft-score-model'\n\nimport { isSecure, isValidUrl } from './lib/index.ts'\n\nexport const scoreNftExternalUrl = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreExternalUrl(nft?.metadata?.external_url)\n}\nexport const scoreExternalUrl = (external_url: unknown): ScaledScore => {\n const score: ScaledScore = [0, 2]\n if (external_url === undefined || external_url === null || typeof external_url !== 'string' || !isValidUrl(external_url)) return score\n incrementTotal(score)\n if (!isSecure(external_url)) return score\n return incrementTotal(score)\n}\n", "import type { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport { incrementTotal, PASS } from '@xyo-network/crypto-nft-score-model'\n\nimport {\n isSecure, isValidUrl, isWeb3,\n} from './lib/index.ts'\n\nconst MaxPossibleImageScore = 3\n\nexport const scoreNftImage = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n // If there's no image data\n if (nft?.metadata?.image) {\n return scoreImage(nft.metadata?.image)\n } else {\n // but there is image data, skip this scoring criteria, otherwise fail it completely\n return nft.metadata?.image_data ? PASS : [0, MaxPossibleImageScore]\n }\n}\n\nexport const scoreImage = (image: unknown): ScaledScore => {\n const score: ScaledScore = [0, MaxPossibleImageScore]\n if (!image || typeof image !== 'string' || !isValidUrl(image)) return score\n incrementTotal(score)\n if (!isSecure(image)) return score\n incrementTotal(score)\n if (!isWeb3(image)) return score\n incrementTotal(score)\n return score\n}\n", "import type { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport { PASS } from '@xyo-network/crypto-nft-score-model'\nimport { parse } from 'svg-parser'\n\nconst MaxPossibleImageDataScore = 1\n\n// TODO: There is probably a deeper check we can do\n// here, but this is a good start\nconst isValidImageData = (image_data: string): boolean => {\n // If it doesn't start with an svg tag, it's not an svg\n if (!image_data.startsWith('<svg')) return false\n try {\n // If it can't be parsed, it's not an svg\n parse(image_data)\n return true\n } catch {\n return false\n }\n}\n\nexport const scoreNftImageData = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n // If there's no image data\n if (nft?.metadata?.image_data) {\n return scoreImageData(nft.metadata?.image_data)\n } else {\n // but there is an image, skip this scoring criteria, otherwise fail it completely\n return nft.metadata?.image ? PASS : [0, MaxPossibleImageDataScore]\n }\n}\n\nexport const scoreImageData = (image_data: unknown): ScaledScore => {\n return !image_data || typeof image_data !== 'string' || !isValidImageData(image_data)\n ? [0, MaxPossibleImageDataScore]\n : [MaxPossibleImageDataScore, MaxPossibleImageDataScore]\n}\n", "import type { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport { incrementTotal } from '@xyo-network/crypto-nft-score-model'\n\nexport const scoreNftName = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreName(nft.metadata?.name)\n}\nexport const scoreName = (name: unknown): ScaledScore => {\n const score: ScaledScore = [0, 1]\n if (!name || typeof name !== 'string') return score\n return incrementTotal(score)\n}\n", "import type { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport { incrementTotal, PASS } from '@xyo-network/crypto-nft-score-model'\n\nimport { isSecure, isValidUrl } from './lib/index.ts'\n\nexport const scoreNftYoutubeUrl = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreYoutubeUrl(nft?.metadata?.youtube_url)\n}\nexport const scoreYoutubeUrl = (youtube_url: unknown): ScaledScore => {\n if (youtube_url === undefined || youtube_url === null) return PASS\n const score: ScaledScore = [0, 2]\n if (typeof youtube_url !== 'string' || !isValidUrl(youtube_url)) return score\n incrementTotal(score)\n if (!isSecure(youtube_url)) return score\n return incrementTotal(score)\n}\n", "import type { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { PassFailScoringFunction } from '@xyo-network/crypto-nft-score-model'\nimport { FAIL, PASS } from '@xyo-network/crypto-nft-score-model'\n\nexport const scoreSupply: PassFailScoringFunction<NftInfoFields> = (nft: NftInfoFields) => {\n if (!nft.supply) return FAIL\n if (typeof nft.supply !== 'string') return FAIL\n try {\n return BigInt(nft.tokenId) >= 0n && BigInt(nft.tokenId) < 2n ** 256n ? PASS : FAIL\n } catch {\n return FAIL\n }\n}\n", "import type { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { PassFailScoringFunction } from '@xyo-network/crypto-nft-score-model'\nimport { FAIL, PASS } from '@xyo-network/crypto-nft-score-model'\n\n/**\n * Callers SHALL NOT assume that ID numbers have any specific pattern to them, and\n * MUST treat the ID as a \"black box\"\n * @param nft\n * @returns\n */\nexport const scoreTokenId: PassFailScoringFunction<NftInfoFields> = (nft: NftInfoFields) => {\n if (!nft.tokenId) return FAIL\n if (typeof nft.tokenId !== 'string') return FAIL\n try {\n return BigInt(nft.tokenId) >= 0n && BigInt(nft.tokenId) < 2n ** 256n ? PASS : FAIL\n } catch {\n return FAIL\n }\n}\n", "import type { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { PassFailScoringFunction } from '@xyo-network/crypto-nft-score-model'\nimport { FAIL, PASS } from '@xyo-network/crypto-nft-score-model'\n\nexport const scoreType: PassFailScoringFunction<NftInfoFields> = (nft: NftInfoFields) => {\n if (!((nft.types?.length ?? 0) > 0)) return FAIL\n if (!Array.isArray(nft.types)) return FAIL\n const typesUpper = new Set(nft.types.map(t => t?.toUpperCase()))\n if (!typesUpper.has('ERC721') && !typesUpper.has('ERC1155')) return FAIL\n return PASS\n}\n", "import {\n evaluateNftAttributes,\n scoreContractAddress,\n scoreNftAnimationUrl,\n scoreNftBackgroundColor,\n scoreNftDescription,\n scoreNftExternalUrl,\n scoreNftImage,\n scoreNftImageData,\n scoreNftName,\n scoreNftYoutubeUrl,\n scoreSupply,\n scoreTokenId,\n scoreType,\n} from './scoring/index.ts'\n\nconst attributesScoringCriteria = { Attributes: { score: evaluateNftAttributes, weight: 1 } }\n\nconst metadataScoringCriteria = {\n 'Animation URL': { score: scoreNftAnimationUrl, weight: 1 },\n 'Background Color': { score: scoreNftBackgroundColor, weight: 1 },\n 'Description': { score: scoreNftDescription, weight: 1 },\n 'External Url': { score: scoreNftExternalUrl, weight: 1 },\n 'Image': { score: scoreNftImage, weight: 1 },\n 'Image Data': { score: scoreNftImageData, weight: 1 },\n 'Name': { score: scoreNftName, weight: 1 },\n 'YouTube URL': { score: scoreNftYoutubeUrl, weight: 1 },\n ...attributesScoringCriteria,\n}\n\nexport const scoringCriteria = {\n 'Contract Address': { score: scoreContractAddress, weight: 1 },\n 'Supply': { score: scoreSupply, weight: 1 },\n 'Token Id': { score: scoreTokenId, weight: 1 },\n 'Type': { score: scoreType, weight: 1 },\n ...metadataScoringCriteria,\n}\n", "import type { NftInfoFields } from '@xyo-network/crypto-nft-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\n\nexport type NftAnalysis = Record<ScoringCriteriaKey, Score>\n\nexport const analyzeNft = async (\n /**\n * The NFT to evaluate\n */\n nft: NftInfoFields,\n): Promise<NftAnalysis> => {\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 NftAnalysis\n return result\n}\n", "import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { createPayloadSetDivinerPlugin, PayloadSetSchema } from '@xyo-network/sdk-js'\n\nimport { NftScoreDiviner } from './Diviner.ts'\n\nexport const NftScoreDivinerPlugin = () =>\n createPayloadSetDivinerPlugin<NftScoreDiviner>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n diviner: async (params) => {\n const result = await NftScoreDiviner.create(params)\n return result\n },\n },\n )\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type {\n NftInfo,\n NftScore,\n NftScoreDivinerConfig,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport {\n isNftInfo,\n NftScoreDivinerConfigSchema,\n NftScoreSchema,\n} from '@xyo-network/crypto-nft-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 { NftAnalysis } from './lib/index.ts'\nimport { analyzeNft } from './lib/index.ts'\n\nexport type NftScoreDivinerParams = DivinerParams<AnyConfigSchema<NftScoreDivinerConfig>>\n\nconst toNftScorePayload = (nftInfo: NftInfo, scores: NftAnalysis): NftScore => {\n const {\n\n address, chainId, types,\n } = nftInfo\n return {\n address, chainId, schema: NftScoreSchema, scores, types,\n }\n}\n\nexport const isNftScore = (payload: Payload): payload is NftScore => payload.schema === NftScoreSchema\n\nexport class NftScoreDiviner<TParams extends NftScoreDivinerParams = NftScoreDivinerParams> extends AbstractDiviner<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftScoreDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftScoreDivinerConfigSchema\n\n protected override divineHandler = async (payloads?: Payload[]): Promise<Payload[]> => {\n const nftInfos = payloads?.filter(isNftInfo) ?? []\n const results = await Promise.all(\n nftInfos.map<Promise<NftScore>>(async (nftInfo) => {\n const score = toNftScorePayload(nftInfo, await analyzeNft(nftInfo))\n const sourceHash = await PayloadBuilder.dataHash(nftInfo)\n return { ...score, sources: [sourceHash] }\n }),\n )\n return results\n }\n}\n", "import type { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { PassFailScoringFunction } from '@xyo-network/crypto-nft-score-model'\nimport { FAIL, PASS } from '@xyo-network/crypto-nft-score-model'\nimport { isAddress } from 'ethers'\n\nexport const scoreContractAddress: PassFailScoringFunction<NftInfoFields> = (nft: NftInfoFields) => {\n if (!nft.address) return FAIL\n if (typeof nft.address !== 'string') return FAIL\n if (!isAddress(nft.address)) return FAIL\n return PASS\n}\n", "import type { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport {\n incrementPossible, incrementTotal, incrementTotalAndPossible, PASS,\n} from '@xyo-network/crypto-nft-score-model'\n\nimport {\n isSecure, isValidUrl, isWeb3,\n} from './lib/index.ts'\n\nexport const scoreNftAnimationUrl = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreAnimationUrl(nft.metadata?.animation_url)\n}\n\nexport const scoreAnimationUrl = (animation_url: unknown): ScaledScore => {\n if (animation_url === undefined || animation_url === null) return PASS\n const score: ScaledScore = [0, 0]\n incrementPossible(score)\n if (typeof animation_url !== 'string') return score\n incrementTotalAndPossible(score)\n if (!isValidUrl(animation_url)) return score\n incrementTotalAndPossible(score)\n if (!isSecure(animation_url)) return score\n incrementTotalAndPossible(score)\n if (!isWeb3(animation_url)) return score\n return incrementTotal(score)\n}\n", "export const web3Protocols = ['ipfs:', 'ar:']\n\nexport const toUrl = (url?: string | null): URL | undefined => {\n if (url == null || url === '') return undefined\n try {\n return new URL(url)\n } catch {\n return undefined\n }\n}\n\nexport const isValidUrl = (url?: string | null): boolean => toUrl(url) !== undefined\n// eslint-disable-next-line unicorn/prefer-includes\nexport const isWeb3 = (url?: string | null): boolean => web3Protocols.some(protocol => protocol === toUrl(url)?.protocol)\nexport const isWeb2 = (url?: string | null): boolean => !isWeb3(url)\nexport const isSecure = (url?: string | null): boolean => isWeb3(url) || toUrl(url)?.protocol === 'https:'\n", "import type { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport {\n incrementPossible, incrementTotal, incrementTotalAndPossible,\n} from '@xyo-network/crypto-nft-score-model'\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === 'object' && value !== null\n\nconst isDate = (value: unknown): value is Date => {\n if (isNumber(value)) {\n try {\n new Date(value)\n return true\n } catch {\n return false\n }\n }\n return false\n}\n\nconst isNumber = (value: unknown): value is number => typeof value === 'number'\n\nconst isPercentage = (value: unknown): boolean => isNumber(value) && value >= 0 && value <= 100\n\nconst isNonEmptyString = (value: unknown): value is string => typeof value === 'string' && value.length > 0\n\nconst isNonEmptyStringOrNumber = (value: unknown): value is string | number => value === 'number' || isNonEmptyString(value)\n\nexport const evaluateNftAttributes = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore =>\n evaluateAttributes(nft?.metadata?.attributes)\n\nexport const evaluateAttributes = (attributes: unknown): ScaledScore => {\n if (!Array.isArray(attributes) || attributes.length === 0) return [0, 1]\n const score: ScaledScore = [0, 0]\n for (const attribute of attributes) {\n const [attributeTotal, attributePossible] = evaluateAttribute(attribute)\n incrementTotalAndPossible(score, attributeTotal, attributePossible)\n }\n return [1, 1]\n}\n\nexport const evaluateAttribute = (attribute: unknown): ScaledScore => {\n const score: ScaledScore = [0, 1]\n\n // Validate trait_type & value\n if (!isRecord(attribute)) return score\n const max_value = attribute.max_value\n const trait_type = attribute.trait_type\n const value = attribute.value\n if (!isNonEmptyString(trait_type) || !isNonEmptyStringOrNumber(value)) return score\n incrementTotal(score)\n\n // Validate display_type\n incrementPossible(score)\n if (validDisplayType(attribute)) incrementTotal(score)\n\n // Validate max_value\n if (max_value !== undefined) {\n incrementPossible(score)\n if (isNumber(max_value) && isNumber(value) && value <= max_value) incrementTotal(score)\n }\n\n return score\n}\n\nconst validDisplayType = (attribute: Record<string, unknown>): boolean => {\n switch (attribute.display_type) {\n case 'number':\n case 'boost_number': {\n if (isNumber(attribute.value)) return true\n break\n }\n case 'boost_percentage': {\n if (isPercentage(attribute.value)) return true\n break\n }\n case 'date': {\n if (isDate(attribute.value)) return true\n break\n }\n case 'string':\n case undefined: {\n if (isNonEmptyString(attribute.value)) return true\n break\n }\n default: {\n break\n }\n }\n return false\n}\n", "import type { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport {\n incrementPossible, incrementTotal, incrementTotalAndPossible, PASS,\n} from '@xyo-network/crypto-nft-score-model'\n\nconst isHexColor = /^[\\da-f]{6}$/i\n\nexport const scoreNftBackgroundColor = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreBackgroundColor(nft.metadata?.background_color)\n}\n\nexport const scoreBackgroundColor = (background_color: unknown): ScaledScore => {\n if (background_color === undefined || background_color === null) return PASS\n const score: ScaledScore = [0, 0]\n incrementPossible(score)\n if (typeof background_color !== 'string') return score\n incrementTotalAndPossible(score)\n if (!isHexColor.test(background_color.toUpperCase())) return score\n return incrementTotal(score)\n}\n", "import type { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport { incrementTotal } from '@xyo-network/crypto-nft-score-model'\n\nexport const scoreNftDescription = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreDescription(nft.metadata?.description)\n}\n\nexport const scoreDescription = (description: unknown): ScaledScore => {\n const score: ScaledScore = [0, 1]\n if (typeof description !== 'string' || description.length === 0) return score\n return incrementTotal(score)\n}\n", "import type { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport { incrementTotal } from '@xyo-network/crypto-nft-score-model'\n\nimport { isSecure, isValidUrl } from './lib/index.ts'\n\nexport const scoreNftExternalUrl = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreExternalUrl(nft?.metadata?.external_url)\n}\nexport const scoreExternalUrl = (external_url: unknown): ScaledScore => {\n const score: ScaledScore = [0, 2]\n if (external_url === undefined || external_url === null || typeof external_url !== 'string' || !isValidUrl(external_url)) return score\n incrementTotal(score)\n if (!isSecure(external_url)) return score\n return incrementTotal(score)\n}\n", "import type { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport { incrementTotal, PASS } from '@xyo-network/crypto-nft-score-model'\n\nimport {\n isSecure, isValidUrl, isWeb3,\n} from './lib/index.ts'\n\nconst MaxPossibleImageScore = 3\n\nexport const scoreNftImage = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n const image = nft?.metadata?.image\n // If there is image data\n if (image != null && image !== '') {\n return scoreImage(image)\n }\n // but there is no image data, skip this scoring criteria if image_data is present, otherwise fail it completely\n const imageData = nft.metadata?.image_data\n return imageData != null && imageData !== '' ? PASS : [0, MaxPossibleImageScore]\n}\n\nexport const scoreImage = (image: unknown): ScaledScore => {\n const score: ScaledScore = [0, MaxPossibleImageScore]\n if (typeof image !== 'string' || image.length === 0 || !isValidUrl(image)) return score\n incrementTotal(score)\n if (!isSecure(image)) return score\n incrementTotal(score)\n if (!isWeb3(image)) return score\n incrementTotal(score)\n return score\n}\n", "import type { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport { PASS } from '@xyo-network/crypto-nft-score-model'\nimport { parse } from 'svg-parser'\n\nconst MaxPossibleImageDataScore = 1\n\n// TODO: There is probably a deeper check we can do\n// here, but this is a good start\nconst isValidImageData = (image_data: string): boolean => {\n // If it doesn't start with an SVG tag, it's not an SVG\n if (!image_data.startsWith('<svg')) return false\n try {\n // If it can't be parsed, it's not an SVG\n parse(image_data)\n return true\n } catch {\n return false\n }\n}\n\nexport const scoreNftImageData = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n const imageData = nft?.metadata?.image_data\n // If there is image data\n if (imageData != null && imageData !== '') {\n return scoreImageData(imageData)\n }\n // but there is no image data, skip this scoring criteria if an image is present, otherwise fail it completely\n const image = nft.metadata?.image\n return image != null && image !== '' ? PASS : [0, MaxPossibleImageDataScore]\n}\n\nexport const scoreImageData = (image_data: unknown): ScaledScore => {\n return typeof image_data !== 'string' || image_data.length === 0 || !isValidImageData(image_data)\n ? [0, MaxPossibleImageDataScore]\n : [MaxPossibleImageDataScore, MaxPossibleImageDataScore]\n}\n", "import type { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport { incrementTotal } from '@xyo-network/crypto-nft-score-model'\n\nexport const scoreNftName = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreName(nft.metadata?.name)\n}\nexport const scoreName = (name: unknown): ScaledScore => {\n const score: ScaledScore = [0, 1]\n if (typeof name !== 'string' || name.length === 0) return score\n return incrementTotal(score)\n}\n", "import type { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport { incrementTotal, PASS } from '@xyo-network/crypto-nft-score-model'\n\nimport { isSecure, isValidUrl } from './lib/index.ts'\n\nexport const scoreNftYoutubeUrl = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreYoutubeUrl(nft?.metadata?.youtube_url)\n}\nexport const scoreYoutubeUrl = (youtube_url: unknown): ScaledScore => {\n if (youtube_url === undefined || youtube_url === null) return PASS\n const score: ScaledScore = [0, 2]\n if (typeof youtube_url !== 'string' || !isValidUrl(youtube_url)) return score\n incrementTotal(score)\n if (!isSecure(youtube_url)) return score\n return incrementTotal(score)\n}\n", "import type { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { PassFailScoringFunction } from '@xyo-network/crypto-nft-score-model'\nimport { FAIL, PASS } from '@xyo-network/crypto-nft-score-model'\n\nexport const scoreSupply: PassFailScoringFunction<NftInfoFields> = (nft: NftInfoFields) => {\n if (!nft.supply) return FAIL\n if (typeof nft.supply !== 'string') return FAIL\n try {\n return BigInt(nft.tokenId) >= 0n && BigInt(nft.tokenId) < 2n ** 256n ? PASS : FAIL\n } catch {\n return FAIL\n }\n}\n", "import type { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { PassFailScoringFunction } from '@xyo-network/crypto-nft-score-model'\nimport { FAIL, PASS } from '@xyo-network/crypto-nft-score-model'\n\n/**\n * Callers SHALL NOT assume that ID numbers have any specific pattern to them, and\n * MUST treat the ID as a \"black box\"\n * @param nft\n * @returns\n */\nexport const scoreTokenId: PassFailScoringFunction<NftInfoFields> = (nft: NftInfoFields) => {\n if (!nft.tokenId) return FAIL\n if (typeof nft.tokenId !== 'string') return FAIL\n try {\n return BigInt(nft.tokenId) >= 0n && BigInt(nft.tokenId) < 2n ** 256n ? PASS : FAIL\n } catch {\n return FAIL\n }\n}\n", "import type { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport type { PassFailScoringFunction } from '@xyo-network/crypto-nft-score-model'\nimport { FAIL, PASS } from '@xyo-network/crypto-nft-score-model'\n\nexport const scoreType: PassFailScoringFunction<NftInfoFields> = (nft: NftInfoFields) => {\n if ((nft.types?.length ?? 0) <= 0) return FAIL\n if (!Array.isArray(nft.types)) return FAIL\n const typesUpper = new Set(nft.types.map(t => t?.toUpperCase()))\n if (!typesUpper.has('ERC721') && !typesUpper.has('ERC1155')) return FAIL\n return PASS\n}\n", "import {\n evaluateNftAttributes,\n scoreContractAddress,\n scoreNftAnimationUrl,\n scoreNftBackgroundColor,\n scoreNftDescription,\n scoreNftExternalUrl,\n scoreNftImage,\n scoreNftImageData,\n scoreNftName,\n scoreNftYoutubeUrl,\n scoreSupply,\n scoreTokenId,\n scoreType,\n} from './scoring/index.ts'\n\nconst attributesScoringCriteria = { Attributes: { score: evaluateNftAttributes, weight: 1 } }\n\nconst metadataScoringCriteria = {\n 'Animation URL': { score: scoreNftAnimationUrl, weight: 1 },\n 'Background Color': { score: scoreNftBackgroundColor, weight: 1 },\n 'Description': { score: scoreNftDescription, weight: 1 },\n 'External Url': { score: scoreNftExternalUrl, weight: 1 },\n 'Image': { score: scoreNftImage, weight: 1 },\n 'Image Data': { score: scoreNftImageData, weight: 1 },\n 'Name': { score: scoreNftName, weight: 1 },\n 'YouTube URL': { score: scoreNftYoutubeUrl, weight: 1 },\n ...attributesScoringCriteria,\n}\n\nexport const scoringCriteria = {\n 'Contract Address': { score: scoreContractAddress, weight: 1 },\n 'Supply': { score: scoreSupply, weight: 1 },\n 'Token Id': { score: scoreTokenId, weight: 1 },\n 'Type': { score: scoreType, weight: 1 },\n ...metadataScoringCriteria,\n}\n", "import type { NftInfoFields } from '@xyo-network/crypto-nft-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\n\nexport type NftAnalysis = Record<ScoringCriteriaKey, Score>\n\nexport const analyzeNft = async (\n /**\n * The NFT to evaluate\n */\n nft: NftInfoFields,\n): Promise<NftAnalysis> => {\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 NftAnalysis\n return result\n}\n", "import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { createPayloadSetDivinerPlugin, PayloadSetSchema } from '@xyo-network/sdk-js'\n\nimport { NftScoreDiviner } from './Diviner.ts'\n\nexport const NftScoreDivinerPlugin = () =>\n createPayloadSetDivinerPlugin<NftScoreDiviner>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n diviner: async (params) => {\n const result = await NftScoreDiviner.create(params)\n return result\n },\n },\n )\n"],
5
+ "mappings": "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",
6
6
  "names": ["PASS", "PASS", "incrementPossible", "incrementTotal", "incrementTotalAndPossible", "incrementPossible", "incrementTotal", "incrementTotalAndPossible", "PASS", "incrementTotal", "incrementTotal", "incrementTotal", "incrementTotal", "PASS", "PASS", "incrementTotal", "PASS", "incrementTotal", "incrementTotal", "PASS", "PASS", "incrementTotal", "FAIL", "PASS", "FAIL", "PASS", "FAIL", "PASS"]
7
7
  }
@@ -1,6 +1,6 @@
1
- import type { NftInfoFields, OpenSeaNftAttribute, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin';
1
+ import type { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin';
2
2
  import type { ScaledScore } from '@xyo-network/crypto-nft-score-model';
3
3
  export declare const evaluateNftAttributes: (nft: NftInfoFields | OpenSeaNftInfoFields) => ScaledScore;
4
4
  export declare const evaluateAttributes: (attributes: unknown) => ScaledScore;
5
- export declare const evaluateAttribute: (attribute: OpenSeaNftAttribute) => ScaledScore;
5
+ export declare const evaluateAttribute: (attribute: unknown) => ScaledScore;
6
6
  //# sourceMappingURL=evaluateAttributes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"evaluateAttributes.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAAE,mBAAmB,EAAE,oBAAoB,EACzD,MAAM,wCAAwC,CAAA;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAyBtE,eAAO,MAAM,qBAAqB,GAAI,KAAK,aAAa,GAAG,oBAAoB,KAAG,WACE,CAAA;AAEpF,eAAO,MAAM,kBAAkB,GAAI,YAAY,OAAO,KAAG,WAQxD,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,WAAW,mBAAmB,KAAG,WAqBlE,CAAA"}
1
+ {"version":3,"file":"evaluateAttributes.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AACjG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AA2BtE,eAAO,MAAM,qBAAqB,GAAI,KAAK,aAAa,GAAG,oBAAoB,KAAG,WACnC,CAAA;AAE/C,eAAO,MAAM,kBAAkB,GAAI,YAAY,OAAO,KAAG,WAQxD,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,WAAW,OAAO,KAAG,WAsBtD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/image.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AACjG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAStE,eAAO,MAAM,aAAa,GAAI,KAAK,aAAa,GAAG,oBAAoB,KAAG,WAQzE,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,OAAO,OAAO,KAAG,WAS3C,CAAA"}
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/image.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AACjG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAStE,eAAO,MAAM,aAAa,GAAI,KAAK,aAAa,GAAG,oBAAoB,KAAG,WASzE,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,OAAO,OAAO,KAAG,WAS3C,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"imageData.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/imageData.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AACjG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAoBtE,eAAO,MAAM,iBAAiB,GAAI,KAAK,aAAa,GAAG,oBAAoB,KAAG,WAQ7E,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,YAAY,OAAO,KAAG,WAIpD,CAAA"}
1
+ {"version":3,"file":"imageData.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/imageData.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AACjG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAoBtE,eAAO,MAAM,iBAAiB,GAAI,KAAK,aAAa,GAAG,oBAAoB,KAAG,WAS7E,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,YAAY,OAAO,KAAG,WAIpD,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/crypto-nft-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-score-model": "~6.0.3",
35
- "@xyo-network/crypto-nft-payload-plugin": "~6.0.3"
34
+ "@xyo-network/crypto-nft-score-model": "~7.0.0",
35
+ "@xyo-network/crypto-nft-payload-plugin": "~7.0.0"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@bitauth/libauth": "~3.0.0",
39
39
  "@metamask/providers": "^22.1.1",
40
40
  "@noble/post-quantum": "~0.6.1",
41
41
  "@opentelemetry/api": "^1.9.1",
42
- "@opentelemetry/sdk-trace-base": "^2.7.1",
42
+ "@opentelemetry/sdk-trace-base": "^2.8.0",
43
43
  "@scure/base": "^2.2.0",
44
44
  "@scure/bip39": "~2.2.0",
45
45
  "@types/svg-parser": "~2.0.6",
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",
@@ -65,7 +63,7 @@
65
63
  "svg-parser": "^2.0.4",
66
64
  "typescript": "~6.0.3",
67
65
  "vite": "^8.0.16",
68
- "vitest": "^4.1.8",
66
+ "vitest": "^4.1.9",
69
67
  "webextension-polyfill": "^0.12.0",
70
68
  "zod": "^4.4.3"
71
69
  },
@@ -80,12 +78,10 @@
80
78
  "@xylabs/geo": "^6.0",
81
79
  "@xylabs/sdk-js": "^6.0",
82
80
  "@xylabs/threads": "^6.0",
83
- "@xyo-network/sdk-js": "^6.0",
84
- "@xyo-network/sdk-protocol-js": "~6.0",
81
+ "@xyo-network/sdk-js": "^7.0",
82
+ "@xyo-network/sdk-protocol-js": "^7.0",
85
83
  "ajv": "^8.20",
86
84
  "async-mutex": "^0.5",
87
- "bn.js": "^5.2",
88
- "buffer": "^6.0",
89
85
  "debug": "~4.4",
90
86
  "ethers": "^6.16",
91
87
  "hash-wasm": "^4.12",
@@ -96,6 +92,9 @@
96
92
  "webextension-polyfill": "^0.12",
97
93
  "zod": "^4.4"
98
94
  },
95
+ "engines": {
96
+ "node": "^24"
97
+ },
99
98
  "publishConfig": {
100
99
  "access": "public"
101
100
  }
@@ -1,11 +0,0 @@
1
- import type { NftScore, NftScoreDivinerConfig } from '@xyo-network/crypto-nft-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 NftScoreDivinerParams = DivinerParams<AnyConfigSchema<NftScoreDivinerConfig>>;
5
- export declare const isNftScore: (payload: Payload) => payload is NftScore;
6
- export declare class NftScoreDiviner<TParams extends NftScoreDivinerParams = NftScoreDivinerParams> extends AbstractDiviner<TParams> {
7
- static readonly configSchemas: Schema[];
8
- static readonly defaultConfigSchema: Schema;
9
- protected divineHandler: (payloads?: Payload[]) => Promise<Payload[]>;
10
- }
11
- //# 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,EAEV,QAAQ,EACR,qBAAqB,EACtB,MAAM,wCAAwC,CAAA;AAM/C,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,qBAAqB,GAAG,aAAa,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,CAAA;AAYzF,eAAO,MAAM,UAAU,GAAI,SAAS,OAAO,KAAG,OAAO,IAAI,QAA6C,CAAA;AAEtG,qBAAa,eAAe,CAAC,OAAO,SAAS,qBAAqB,GAAG,qBAAqB,CAAE,SAAQ,eAAe,CAAC,OAAO,CAAC;IAC1H,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAwD;IACxG,gBAAyB,mBAAmB,EAAE,MAAM,CAA8B;IAElF,UAAmB,aAAa,GAAU,WAAW,OAAO,EAAE,KAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAUlF;CACF"}
@@ -1,3 +0,0 @@
1
- import { NftScoreDiviner } from './Diviner.ts';
2
- export declare const NftScoreDivinerPlugin: () => import("@xyo-network/sdk-js").PayloadSetDivinerPlugin<NftScoreDiviner<import("./Diviner.ts").NftScoreDivinerParams>>;
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,eAAe,EAAE,MAAM,cAAc,CAAA;AAE9C,eAAO,MAAM,qBAAqB,4HAS/B,CAAA"}
@@ -1,4 +0,0 @@
1
- export * from './Diviner.ts';
2
- export * from './lib/index.ts';
3
- export { NftScoreDivinerPlugin as default, NftScoreDivinerPlugin } 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,qBAAqB,IAAI,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA"}