@xyo-network/crypto-nft-diviner-score-plugin 2.99.3 → 2.99.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/Plugin.d.cts +1 -1
- package/dist/browser/Plugin.d.mts +1 -1
- package/dist/browser/Plugin.d.ts +1 -1
- package/dist/browser/index.cjs +233 -126
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.d.cts +3 -3
- package/dist/browser/index.d.mts +3 -3
- package/dist/browser/index.d.ts +3 -3
- package/dist/browser/{index.js → index.mjs} +237 -132
- package/dist/browser/index.mjs.map +1 -0
- package/dist/browser/lib/index.d.cts +1 -1
- package/dist/browser/lib/index.d.mts +1 -1
- package/dist/browser/lib/index.d.ts +1 -1
- package/dist/browser/lib/rating/analyzeNft.d.cts +1 -1
- package/dist/browser/lib/rating/analyzeNft.d.mts +1 -1
- package/dist/browser/lib/rating/analyzeNft.d.ts +1 -1
- package/dist/browser/lib/rating/criteria/index.d.cts +1 -1
- package/dist/browser/lib/rating/criteria/index.d.mts +1 -1
- package/dist/browser/lib/rating/criteria/index.d.ts +1 -1
- package/dist/browser/lib/rating/criteria/scoring/index.d.cts +5 -5
- package/dist/browser/lib/rating/criteria/scoring/index.d.mts +5 -5
- package/dist/browser/lib/rating/criteria/scoring/index.d.ts +5 -5
- package/dist/browser/lib/rating/criteria/scoring/metadata/attributes/index.d.cts +1 -1
- package/dist/browser/lib/rating/criteria/scoring/metadata/attributes/index.d.mts +1 -1
- package/dist/browser/lib/rating/criteria/scoring/metadata/attributes/index.d.ts +1 -1
- package/dist/browser/lib/rating/criteria/scoring/metadata/index.d.cts +9 -9
- package/dist/browser/lib/rating/criteria/scoring/metadata/index.d.mts +9 -9
- package/dist/browser/lib/rating/criteria/scoring/metadata/index.d.ts +9 -9
- package/dist/browser/lib/rating/criteria/scoring/metadata/lib/index.d.cts +1 -1
- package/dist/browser/lib/rating/criteria/scoring/metadata/lib/index.d.mts +1 -1
- package/dist/browser/lib/rating/criteria/scoring/metadata/lib/index.d.ts +1 -1
- package/dist/browser/lib/rating/criteria/scoring/metadata/lib/urlHelpers.d.cts.map +1 -1
- package/dist/browser/lib/rating/criteria/scoring/metadata/lib/urlHelpers.d.mts.map +1 -1
- package/dist/browser/lib/rating/criteria/scoring/metadata/lib/urlHelpers.d.ts.map +1 -1
- package/dist/browser/lib/rating/index.d.cts +2 -2
- package/dist/browser/lib/rating/index.d.mts +2 -2
- package/dist/browser/lib/rating/index.d.ts +2 -2
- package/dist/neutral/Plugin.d.cts +1 -1
- package/dist/neutral/Plugin.d.mts +1 -1
- package/dist/neutral/Plugin.d.ts +1 -1
- package/dist/neutral/index.cjs +233 -126
- package/dist/neutral/index.cjs.map +1 -1
- package/dist/neutral/index.d.cts +3 -3
- package/dist/neutral/index.d.mts +3 -3
- package/dist/neutral/index.d.ts +3 -3
- package/dist/neutral/{index.js → index.mjs} +237 -132
- package/dist/neutral/index.mjs.map +1 -0
- package/dist/neutral/lib/index.d.cts +1 -1
- package/dist/neutral/lib/index.d.mts +1 -1
- package/dist/neutral/lib/index.d.ts +1 -1
- package/dist/neutral/lib/rating/analyzeNft.d.cts +1 -1
- package/dist/neutral/lib/rating/analyzeNft.d.mts +1 -1
- package/dist/neutral/lib/rating/analyzeNft.d.ts +1 -1
- package/dist/neutral/lib/rating/criteria/index.d.cts +1 -1
- package/dist/neutral/lib/rating/criteria/index.d.mts +1 -1
- package/dist/neutral/lib/rating/criteria/index.d.ts +1 -1
- package/dist/neutral/lib/rating/criteria/scoring/index.d.cts +5 -5
- package/dist/neutral/lib/rating/criteria/scoring/index.d.mts +5 -5
- package/dist/neutral/lib/rating/criteria/scoring/index.d.ts +5 -5
- package/dist/neutral/lib/rating/criteria/scoring/metadata/attributes/index.d.cts +1 -1
- package/dist/neutral/lib/rating/criteria/scoring/metadata/attributes/index.d.mts +1 -1
- package/dist/neutral/lib/rating/criteria/scoring/metadata/attributes/index.d.ts +1 -1
- package/dist/neutral/lib/rating/criteria/scoring/metadata/index.d.cts +9 -9
- package/dist/neutral/lib/rating/criteria/scoring/metadata/index.d.mts +9 -9
- package/dist/neutral/lib/rating/criteria/scoring/metadata/index.d.ts +9 -9
- package/dist/neutral/lib/rating/criteria/scoring/metadata/lib/index.d.cts +1 -1
- package/dist/neutral/lib/rating/criteria/scoring/metadata/lib/index.d.mts +1 -1
- package/dist/neutral/lib/rating/criteria/scoring/metadata/lib/index.d.ts +1 -1
- package/dist/neutral/lib/rating/criteria/scoring/metadata/lib/urlHelpers.d.cts.map +1 -1
- package/dist/neutral/lib/rating/criteria/scoring/metadata/lib/urlHelpers.d.mts.map +1 -1
- package/dist/neutral/lib/rating/criteria/scoring/metadata/lib/urlHelpers.d.ts.map +1 -1
- package/dist/neutral/lib/rating/index.d.cts +2 -2
- package/dist/neutral/lib/rating/index.d.mts +2 -2
- package/dist/neutral/lib/rating/index.d.ts +2 -2
- package/dist/node/Plugin.d.cts +1 -1
- package/dist/node/Plugin.d.mts +1 -1
- package/dist/node/Plugin.d.ts +1 -1
- package/dist/node/index.cjs +244 -133
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +3 -3
- package/dist/node/index.d.mts +3 -3
- package/dist/node/index.d.ts +3 -3
- package/dist/node/{index.js → index.mjs} +248 -139
- package/dist/node/index.mjs.map +1 -0
- package/dist/node/lib/index.d.cts +1 -1
- package/dist/node/lib/index.d.mts +1 -1
- package/dist/node/lib/index.d.ts +1 -1
- package/dist/node/lib/rating/analyzeNft.d.cts +1 -1
- package/dist/node/lib/rating/analyzeNft.d.mts +1 -1
- package/dist/node/lib/rating/analyzeNft.d.ts +1 -1
- package/dist/node/lib/rating/criteria/index.d.cts +1 -1
- package/dist/node/lib/rating/criteria/index.d.mts +1 -1
- package/dist/node/lib/rating/criteria/index.d.ts +1 -1
- package/dist/node/lib/rating/criteria/scoring/index.d.cts +5 -5
- package/dist/node/lib/rating/criteria/scoring/index.d.mts +5 -5
- package/dist/node/lib/rating/criteria/scoring/index.d.ts +5 -5
- package/dist/node/lib/rating/criteria/scoring/metadata/attributes/index.d.cts +1 -1
- package/dist/node/lib/rating/criteria/scoring/metadata/attributes/index.d.mts +1 -1
- package/dist/node/lib/rating/criteria/scoring/metadata/attributes/index.d.ts +1 -1
- package/dist/node/lib/rating/criteria/scoring/metadata/index.d.cts +9 -9
- package/dist/node/lib/rating/criteria/scoring/metadata/index.d.mts +9 -9
- package/dist/node/lib/rating/criteria/scoring/metadata/index.d.ts +9 -9
- package/dist/node/lib/rating/criteria/scoring/metadata/lib/index.d.cts +1 -1
- package/dist/node/lib/rating/criteria/scoring/metadata/lib/index.d.mts +1 -1
- package/dist/node/lib/rating/criteria/scoring/metadata/lib/index.d.ts +1 -1
- package/dist/node/lib/rating/criteria/scoring/metadata/lib/urlHelpers.d.cts.map +1 -1
- package/dist/node/lib/rating/criteria/scoring/metadata/lib/urlHelpers.d.mts.map +1 -1
- package/dist/node/lib/rating/criteria/scoring/metadata/lib/urlHelpers.d.ts.map +1 -1
- package/dist/node/lib/rating/index.d.cts +2 -2
- package/dist/node/lib/rating/index.d.mts +2 -2
- package/dist/node/lib/rating/index.d.ts +2 -2
- package/package.json +19 -20
- package/src/Diviner.ts +1 -1
- package/src/Plugin.ts +1 -1
- package/src/index.ts +3 -3
- package/src/lib/index.ts +1 -1
- package/src/lib/rating/analyzeNft.ts +2 -2
- package/src/lib/rating/criteria/index.ts +1 -1
- package/src/lib/rating/criteria/scoring/index.ts +5 -5
- package/src/lib/rating/criteria/scoring/metadata/animationUrl.ts +1 -1
- package/src/lib/rating/criteria/scoring/metadata/attributes/index.ts +1 -1
- package/src/lib/rating/criteria/scoring/metadata/externalUrl.ts +1 -1
- package/src/lib/rating/criteria/scoring/metadata/image.ts +1 -1
- package/src/lib/rating/criteria/scoring/metadata/imageData.ts +2 -2
- package/src/lib/rating/criteria/scoring/metadata/index.ts +9 -9
- package/src/lib/rating/criteria/scoring/metadata/lib/index.ts +1 -1
- package/src/lib/rating/criteria/scoring/metadata/lib/urlHelpers.ts +1 -1
- package/src/lib/rating/criteria/scoring/metadata/youtubeUrl.ts +1 -1
- package/src/lib/rating/criteria/scoringCriteria.ts +6 -6
- package/src/lib/rating/index.ts +2 -2
- package/dist/browser/index.js.map +0 -1
- package/dist/neutral/index.js.map +0 -1
- package/dist/node/index.js.map +0 -1
|
@@ -1,46 +1,51 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
1
4
|
// src/Diviner.ts
|
|
2
|
-
import {
|
|
3
|
-
isNftInfo,
|
|
4
|
-
NftScoreDivinerConfigSchema,
|
|
5
|
-
NftScoreSchema
|
|
6
|
-
} from "@xyo-network/crypto-nft-payload-plugin";
|
|
5
|
+
import { isNftInfo, NftScoreDivinerConfigSchema, NftScoreSchema } from "@xyo-network/crypto-nft-payload-plugin";
|
|
7
6
|
import { AbstractDiviner } from "@xyo-network/diviner-abstract";
|
|
8
7
|
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
9
8
|
|
|
10
9
|
// src/lib/rating/criteria/scoring/contract.ts
|
|
11
10
|
import { FAIL, PASS } from "@xyo-network/crypto-nft-score-model";
|
|
12
11
|
import { isAddress } from "ethers";
|
|
13
|
-
var scoreContractAddress = (nft) => {
|
|
12
|
+
var scoreContractAddress = /* @__PURE__ */ __name((nft) => {
|
|
14
13
|
if (!nft.address) return FAIL;
|
|
15
14
|
if (typeof nft.address !== "string") return FAIL;
|
|
16
15
|
if (!isAddress(nft.address)) return FAIL;
|
|
17
16
|
return PASS;
|
|
18
|
-
};
|
|
17
|
+
}, "scoreContractAddress");
|
|
19
18
|
|
|
20
19
|
// src/lib/rating/criteria/scoring/metadata/animationUrl.ts
|
|
21
20
|
import { incrementPossible, incrementTotal, incrementTotalAndPossible, PASS as PASS2 } from "@xyo-network/crypto-nft-score-model";
|
|
22
21
|
|
|
23
22
|
// src/lib/rating/criteria/scoring/metadata/lib/urlHelpers.ts
|
|
24
23
|
import { URL } from "@xylabs/url";
|
|
25
|
-
var web3Protocols = [
|
|
26
|
-
|
|
24
|
+
var web3Protocols = [
|
|
25
|
+
"ipfs:",
|
|
26
|
+
"ar:"
|
|
27
|
+
];
|
|
28
|
+
var toUrl = /* @__PURE__ */ __name((url) => {
|
|
27
29
|
if (!url) return void 0;
|
|
28
30
|
try {
|
|
29
31
|
return new URL(url);
|
|
30
32
|
} catch {
|
|
31
33
|
return void 0;
|
|
32
34
|
}
|
|
33
|
-
};
|
|
34
|
-
var isValidUrl = (url) => toUrl(url) !== void 0;
|
|
35
|
-
var isWeb3 = (url) => web3Protocols.some((protocol) => protocol === toUrl(url)?.protocol);
|
|
36
|
-
var isSecure = (url) => isWeb3(url) || toUrl(url)?.protocol === "https:";
|
|
35
|
+
}, "toUrl");
|
|
36
|
+
var isValidUrl = /* @__PURE__ */ __name((url) => toUrl(url) !== void 0, "isValidUrl");
|
|
37
|
+
var isWeb3 = /* @__PURE__ */ __name((url) => web3Protocols.some((protocol) => protocol === toUrl(url)?.protocol), "isWeb3");
|
|
38
|
+
var isSecure = /* @__PURE__ */ __name((url) => isWeb3(url) || toUrl(url)?.protocol === "https:", "isSecure");
|
|
37
39
|
|
|
38
40
|
// src/lib/rating/criteria/scoring/metadata/animationUrl.ts
|
|
39
|
-
var scoreNftAnimationUrl = (nft) => {
|
|
41
|
+
var scoreNftAnimationUrl = /* @__PURE__ */ __name((nft) => {
|
|
40
42
|
return scoreAnimationUrl(nft.metadata?.animation_url);
|
|
41
|
-
};
|
|
42
|
-
var scoreAnimationUrl = (animation_url) => {
|
|
43
|
-
const score = [
|
|
43
|
+
}, "scoreNftAnimationUrl");
|
|
44
|
+
var scoreAnimationUrl = /* @__PURE__ */ __name((animation_url) => {
|
|
45
|
+
const score = [
|
|
46
|
+
0,
|
|
47
|
+
0
|
|
48
|
+
];
|
|
44
49
|
if (animation_url === void 0 || animation_url === null) return PASS2;
|
|
45
50
|
incrementPossible(score);
|
|
46
51
|
if (typeof animation_url !== "string") return score;
|
|
@@ -51,11 +56,11 @@ var scoreAnimationUrl = (animation_url) => {
|
|
|
51
56
|
incrementTotalAndPossible(score);
|
|
52
57
|
if (!isWeb3(animation_url)) return score;
|
|
53
58
|
return incrementTotal(score);
|
|
54
|
-
};
|
|
59
|
+
}, "scoreAnimationUrl");
|
|
55
60
|
|
|
56
61
|
// src/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.ts
|
|
57
62
|
import { incrementPossible as incrementPossible2, incrementTotal as incrementTotal2, incrementTotalAndPossible as incrementTotalAndPossible2 } from "@xyo-network/crypto-nft-score-model";
|
|
58
|
-
var isDate = (value) => {
|
|
63
|
+
var isDate = /* @__PURE__ */ __name((value) => {
|
|
59
64
|
if (isNumber(value)) {
|
|
60
65
|
try {
|
|
61
66
|
new Date(value);
|
|
@@ -65,23 +70,38 @@ var isDate = (value) => {
|
|
|
65
70
|
}
|
|
66
71
|
}
|
|
67
72
|
return false;
|
|
68
|
-
};
|
|
69
|
-
var isNumber = (value) => typeof value === "number";
|
|
70
|
-
var isPercentage = (value) => isNumber(value) && value >= 0 && value <= 100;
|
|
71
|
-
var isNonEmptyString = (value) => typeof value === "string" && value.length > 0;
|
|
72
|
-
var isNonEmptyStringOrNumber = (value) => value === "number" || isNonEmptyString(value);
|
|
73
|
-
var evaluateNftAttributes = (nft) => nft?.metadata?.attributes ? evaluateAttributes(nft?.metadata?.attributes) : [
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
}, "isDate");
|
|
74
|
+
var isNumber = /* @__PURE__ */ __name((value) => typeof value === "number", "isNumber");
|
|
75
|
+
var isPercentage = /* @__PURE__ */ __name((value) => isNumber(value) && value >= 0 && value <= 100, "isPercentage");
|
|
76
|
+
var isNonEmptyString = /* @__PURE__ */ __name((value) => typeof value === "string" && value.length > 0, "isNonEmptyString");
|
|
77
|
+
var isNonEmptyStringOrNumber = /* @__PURE__ */ __name((value) => value === "number" || isNonEmptyString(value), "isNonEmptyStringOrNumber");
|
|
78
|
+
var evaluateNftAttributes = /* @__PURE__ */ __name((nft) => nft?.metadata?.attributes ? evaluateAttributes(nft?.metadata?.attributes) : [
|
|
79
|
+
0,
|
|
80
|
+
1
|
|
81
|
+
], "evaluateNftAttributes");
|
|
82
|
+
var evaluateAttributes = /* @__PURE__ */ __name((attributes) => {
|
|
83
|
+
if (!attributes || !Array.isArray(attributes) || attributes.length === 0) return [
|
|
84
|
+
0,
|
|
85
|
+
1
|
|
86
|
+
];
|
|
87
|
+
const score = [
|
|
88
|
+
0,
|
|
89
|
+
0
|
|
90
|
+
];
|
|
77
91
|
for (const attribute of attributes) {
|
|
78
92
|
const [attributeTotal, attributePossible] = evaluateAttribute(attribute);
|
|
79
93
|
incrementTotalAndPossible2(score, attributeTotal, attributePossible);
|
|
80
94
|
}
|
|
81
|
-
return [
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
95
|
+
return [
|
|
96
|
+
1,
|
|
97
|
+
1
|
|
98
|
+
];
|
|
99
|
+
}, "evaluateAttributes");
|
|
100
|
+
var evaluateAttribute = /* @__PURE__ */ __name((attribute) => {
|
|
101
|
+
const score = [
|
|
102
|
+
0,
|
|
103
|
+
1
|
|
104
|
+
];
|
|
85
105
|
const max_value = attribute?.max_value;
|
|
86
106
|
const trait_type = attribute?.trait_type;
|
|
87
107
|
const value = attribute?.value;
|
|
@@ -94,8 +114,8 @@ var evaluateAttribute = (attribute) => {
|
|
|
94
114
|
if (isNumber(max_value) && isNumber(value) && value <= max_value) incrementTotal2(score);
|
|
95
115
|
}
|
|
96
116
|
return score;
|
|
97
|
-
};
|
|
98
|
-
var validDisplayType = (attribute) => {
|
|
117
|
+
}, "evaluateAttribute");
|
|
118
|
+
var validDisplayType = /* @__PURE__ */ __name((attribute) => {
|
|
99
119
|
switch (attribute?.display_type) {
|
|
100
120
|
case "number":
|
|
101
121
|
case "boost_number": {
|
|
@@ -120,60 +140,75 @@ var validDisplayType = (attribute) => {
|
|
|
120
140
|
}
|
|
121
141
|
}
|
|
122
142
|
return false;
|
|
123
|
-
};
|
|
143
|
+
}, "validDisplayType");
|
|
124
144
|
|
|
125
145
|
// src/lib/rating/criteria/scoring/metadata/backgroundColor.ts
|
|
126
146
|
import { incrementPossible as incrementPossible3, incrementTotal as incrementTotal3, incrementTotalAndPossible as incrementTotalAndPossible3, PASS as PASS3 } from "@xyo-network/crypto-nft-score-model";
|
|
127
147
|
var isHexColor = /^[\da-f]{6}$/i;
|
|
128
|
-
var scoreNftBackgroundColor = (nft) => {
|
|
148
|
+
var scoreNftBackgroundColor = /* @__PURE__ */ __name((nft) => {
|
|
129
149
|
return scoreBackgroundColor(nft.metadata?.background_color);
|
|
130
|
-
};
|
|
131
|
-
var scoreBackgroundColor = (background_color) => {
|
|
132
|
-
const score = [
|
|
150
|
+
}, "scoreNftBackgroundColor");
|
|
151
|
+
var scoreBackgroundColor = /* @__PURE__ */ __name((background_color) => {
|
|
152
|
+
const score = [
|
|
153
|
+
0,
|
|
154
|
+
0
|
|
155
|
+
];
|
|
133
156
|
if (background_color === void 0 || background_color === null) return PASS3;
|
|
134
157
|
incrementPossible3(score);
|
|
135
158
|
if (typeof background_color !== "string") return score;
|
|
136
159
|
incrementTotalAndPossible3(score);
|
|
137
160
|
if (!isHexColor.test(background_color.toUpperCase())) return score;
|
|
138
161
|
return incrementTotal3(score);
|
|
139
|
-
};
|
|
162
|
+
}, "scoreBackgroundColor");
|
|
140
163
|
|
|
141
164
|
// src/lib/rating/criteria/scoring/metadata/description.ts
|
|
142
165
|
import { incrementTotal as incrementTotal4 } from "@xyo-network/crypto-nft-score-model";
|
|
143
|
-
var scoreNftDescription = (nft) => {
|
|
166
|
+
var scoreNftDescription = /* @__PURE__ */ __name((nft) => {
|
|
144
167
|
return scoreDescription(nft.metadata?.description);
|
|
145
|
-
};
|
|
146
|
-
var scoreDescription = (description) => {
|
|
147
|
-
const score = [
|
|
168
|
+
}, "scoreNftDescription");
|
|
169
|
+
var scoreDescription = /* @__PURE__ */ __name((description) => {
|
|
170
|
+
const score = [
|
|
171
|
+
0,
|
|
172
|
+
1
|
|
173
|
+
];
|
|
148
174
|
if (!description || typeof description !== "string") return score;
|
|
149
175
|
return incrementTotal4(score);
|
|
150
|
-
};
|
|
176
|
+
}, "scoreDescription");
|
|
151
177
|
|
|
152
178
|
// src/lib/rating/criteria/scoring/metadata/externalUrl.ts
|
|
153
179
|
import { incrementTotal as incrementTotal5 } from "@xyo-network/crypto-nft-score-model";
|
|
154
|
-
var scoreNftExternalUrl = (nft) => {
|
|
180
|
+
var scoreNftExternalUrl = /* @__PURE__ */ __name((nft) => {
|
|
155
181
|
return scoreExternalUrl(nft?.metadata?.external_url);
|
|
156
|
-
};
|
|
157
|
-
var scoreExternalUrl = (external_url) => {
|
|
158
|
-
const score = [
|
|
182
|
+
}, "scoreNftExternalUrl");
|
|
183
|
+
var scoreExternalUrl = /* @__PURE__ */ __name((external_url) => {
|
|
184
|
+
const score = [
|
|
185
|
+
0,
|
|
186
|
+
2
|
|
187
|
+
];
|
|
159
188
|
if (external_url === void 0 || external_url === null || typeof external_url !== "string" || !isValidUrl(external_url)) return score;
|
|
160
189
|
incrementTotal5(score);
|
|
161
190
|
if (!isSecure(external_url)) return score;
|
|
162
191
|
return incrementTotal5(score);
|
|
163
|
-
};
|
|
192
|
+
}, "scoreExternalUrl");
|
|
164
193
|
|
|
165
194
|
// src/lib/rating/criteria/scoring/metadata/image.ts
|
|
166
195
|
import { incrementTotal as incrementTotal6, PASS as PASS4 } from "@xyo-network/crypto-nft-score-model";
|
|
167
196
|
var MaxPossibleImageScore = 3;
|
|
168
|
-
var scoreNftImage = (nft) => {
|
|
197
|
+
var scoreNftImage = /* @__PURE__ */ __name((nft) => {
|
|
169
198
|
if (nft?.metadata?.image) {
|
|
170
199
|
return scoreImage(nft.metadata?.image);
|
|
171
200
|
} else {
|
|
172
|
-
return nft.metadata?.image_data ? PASS4 : [
|
|
201
|
+
return nft.metadata?.image_data ? PASS4 : [
|
|
202
|
+
0,
|
|
203
|
+
MaxPossibleImageScore
|
|
204
|
+
];
|
|
173
205
|
}
|
|
174
|
-
};
|
|
175
|
-
var scoreImage = (image) => {
|
|
176
|
-
const score = [
|
|
206
|
+
}, "scoreNftImage");
|
|
207
|
+
var scoreImage = /* @__PURE__ */ __name((image) => {
|
|
208
|
+
const score = [
|
|
209
|
+
0,
|
|
210
|
+
MaxPossibleImageScore
|
|
211
|
+
];
|
|
177
212
|
if (!image || typeof image !== "string" || !isValidUrl(image)) return score;
|
|
178
213
|
incrementTotal6(score);
|
|
179
214
|
if (!isSecure(image)) return score;
|
|
@@ -181,13 +216,13 @@ var scoreImage = (image) => {
|
|
|
181
216
|
if (!isWeb3(image)) return score;
|
|
182
217
|
incrementTotal6(score);
|
|
183
218
|
return score;
|
|
184
|
-
};
|
|
219
|
+
}, "scoreImage");
|
|
185
220
|
|
|
186
221
|
// src/lib/rating/criteria/scoring/metadata/imageData.ts
|
|
187
222
|
import { PASS as PASS5 } from "@xyo-network/crypto-nft-score-model";
|
|
188
223
|
import { parse } from "svg-parser";
|
|
189
224
|
var MaxPossibleImageDataScore = 1;
|
|
190
|
-
var isValidImageData = (image_data) => {
|
|
225
|
+
var isValidImageData = /* @__PURE__ */ __name((image_data) => {
|
|
191
226
|
if (!image_data.startsWith("<svg")) return false;
|
|
192
227
|
try {
|
|
193
228
|
parse(image_data);
|
|
@@ -195,46 +230,61 @@ var isValidImageData = (image_data) => {
|
|
|
195
230
|
} catch {
|
|
196
231
|
return false;
|
|
197
232
|
}
|
|
198
|
-
};
|
|
199
|
-
var scoreNftImageData = (nft) => {
|
|
233
|
+
}, "isValidImageData");
|
|
234
|
+
var scoreNftImageData = /* @__PURE__ */ __name((nft) => {
|
|
200
235
|
if (nft?.metadata?.image_data) {
|
|
201
236
|
return scoreImageData(nft.metadata?.image_data);
|
|
202
237
|
} else {
|
|
203
|
-
return nft.metadata?.image ? PASS5 : [
|
|
238
|
+
return nft.metadata?.image ? PASS5 : [
|
|
239
|
+
0,
|
|
240
|
+
MaxPossibleImageDataScore
|
|
241
|
+
];
|
|
204
242
|
}
|
|
205
|
-
};
|
|
206
|
-
var scoreImageData = (image_data) => {
|
|
207
|
-
return !image_data || typeof image_data !== "string" || !isValidImageData(image_data) ? [
|
|
208
|
-
|
|
243
|
+
}, "scoreNftImageData");
|
|
244
|
+
var scoreImageData = /* @__PURE__ */ __name((image_data) => {
|
|
245
|
+
return !image_data || typeof image_data !== "string" || !isValidImageData(image_data) ? [
|
|
246
|
+
0,
|
|
247
|
+
MaxPossibleImageDataScore
|
|
248
|
+
] : [
|
|
249
|
+
MaxPossibleImageDataScore,
|
|
250
|
+
MaxPossibleImageDataScore
|
|
251
|
+
];
|
|
252
|
+
}, "scoreImageData");
|
|
209
253
|
|
|
210
254
|
// src/lib/rating/criteria/scoring/metadata/name.ts
|
|
211
255
|
import { incrementTotal as incrementTotal7 } from "@xyo-network/crypto-nft-score-model";
|
|
212
|
-
var scoreNftName = (nft) => {
|
|
256
|
+
var scoreNftName = /* @__PURE__ */ __name((nft) => {
|
|
213
257
|
return scoreName(nft.metadata?.name);
|
|
214
|
-
};
|
|
215
|
-
var scoreName = (name) => {
|
|
216
|
-
const score = [
|
|
258
|
+
}, "scoreNftName");
|
|
259
|
+
var scoreName = /* @__PURE__ */ __name((name) => {
|
|
260
|
+
const score = [
|
|
261
|
+
0,
|
|
262
|
+
1
|
|
263
|
+
];
|
|
217
264
|
if (!name || typeof name !== "string") return score;
|
|
218
265
|
return incrementTotal7(score);
|
|
219
|
-
};
|
|
266
|
+
}, "scoreName");
|
|
220
267
|
|
|
221
268
|
// src/lib/rating/criteria/scoring/metadata/youtubeUrl.ts
|
|
222
269
|
import { incrementTotal as incrementTotal8, PASS as PASS6 } from "@xyo-network/crypto-nft-score-model";
|
|
223
|
-
var scoreNftYoutubeUrl = (nft) => {
|
|
270
|
+
var scoreNftYoutubeUrl = /* @__PURE__ */ __name((nft) => {
|
|
224
271
|
return scoreYoutubeUrl(nft?.metadata?.youtube_url);
|
|
225
|
-
};
|
|
226
|
-
var scoreYoutubeUrl = (youtube_url) => {
|
|
272
|
+
}, "scoreNftYoutubeUrl");
|
|
273
|
+
var scoreYoutubeUrl = /* @__PURE__ */ __name((youtube_url) => {
|
|
227
274
|
if (youtube_url === void 0 || youtube_url === null) return PASS6;
|
|
228
|
-
const score = [
|
|
275
|
+
const score = [
|
|
276
|
+
0,
|
|
277
|
+
2
|
|
278
|
+
];
|
|
229
279
|
if (typeof youtube_url !== "string" || !isValidUrl(youtube_url)) return score;
|
|
230
280
|
incrementTotal8(score);
|
|
231
281
|
if (!isSecure(youtube_url)) return score;
|
|
232
282
|
return incrementTotal8(score);
|
|
233
|
-
};
|
|
283
|
+
}, "scoreYoutubeUrl");
|
|
234
284
|
|
|
235
285
|
// src/lib/rating/criteria/scoring/supply.ts
|
|
236
286
|
import { FAIL as FAIL2, PASS as PASS7 } from "@xyo-network/crypto-nft-score-model";
|
|
237
|
-
var scoreSupply = (nft) => {
|
|
287
|
+
var scoreSupply = /* @__PURE__ */ __name((nft) => {
|
|
238
288
|
if (!nft.supply) return FAIL2;
|
|
239
289
|
if (typeof nft.supply !== "string") return FAIL2;
|
|
240
290
|
try {
|
|
@@ -242,11 +292,11 @@ var scoreSupply = (nft) => {
|
|
|
242
292
|
} catch {
|
|
243
293
|
return FAIL2;
|
|
244
294
|
}
|
|
245
|
-
};
|
|
295
|
+
}, "scoreSupply");
|
|
246
296
|
|
|
247
297
|
// src/lib/rating/criteria/scoring/tokenId.ts
|
|
248
298
|
import { FAIL as FAIL3, PASS as PASS8 } from "@xyo-network/crypto-nft-score-model";
|
|
249
|
-
var scoreTokenId = (nft) => {
|
|
299
|
+
var scoreTokenId = /* @__PURE__ */ __name((nft) => {
|
|
250
300
|
if (!nft.tokenId) return FAIL3;
|
|
251
301
|
if (typeof nft.tokenId !== "string") return FAIL3;
|
|
252
302
|
try {
|
|
@@ -254,94 +304,149 @@ var scoreTokenId = (nft) => {
|
|
|
254
304
|
} catch {
|
|
255
305
|
return FAIL3;
|
|
256
306
|
}
|
|
257
|
-
};
|
|
307
|
+
}, "scoreTokenId");
|
|
258
308
|
|
|
259
309
|
// src/lib/rating/criteria/scoring/type.ts
|
|
260
310
|
import { FAIL as FAIL4, PASS as PASS9 } from "@xyo-network/crypto-nft-score-model";
|
|
261
|
-
var scoreType = (nft) => {
|
|
311
|
+
var scoreType = /* @__PURE__ */ __name((nft) => {
|
|
262
312
|
if (!nft.type) return FAIL4;
|
|
263
313
|
if (typeof nft.type !== "string") return FAIL4;
|
|
264
314
|
const type = nft.type.toUpperCase();
|
|
265
315
|
if (type !== "ERC721" && type !== "ERC1155") return FAIL4;
|
|
266
316
|
return PASS9;
|
|
267
|
-
};
|
|
317
|
+
}, "scoreType");
|
|
268
318
|
|
|
269
319
|
// src/lib/rating/criteria/scoringCriteria.ts
|
|
270
320
|
var attributesScoringCriteria = {
|
|
271
|
-
Attributes: {
|
|
321
|
+
Attributes: {
|
|
322
|
+
score: evaluateNftAttributes,
|
|
323
|
+
weight: 1
|
|
324
|
+
}
|
|
272
325
|
};
|
|
273
326
|
var metadataScoringCriteria = {
|
|
274
|
-
"Animation URL": {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
327
|
+
"Animation URL": {
|
|
328
|
+
score: scoreNftAnimationUrl,
|
|
329
|
+
weight: 1
|
|
330
|
+
},
|
|
331
|
+
"Background Color": {
|
|
332
|
+
score: scoreNftBackgroundColor,
|
|
333
|
+
weight: 1
|
|
334
|
+
},
|
|
335
|
+
"Description": {
|
|
336
|
+
score: scoreNftDescription,
|
|
337
|
+
weight: 1
|
|
338
|
+
},
|
|
339
|
+
"External Url": {
|
|
340
|
+
score: scoreNftExternalUrl,
|
|
341
|
+
weight: 1
|
|
342
|
+
},
|
|
343
|
+
"Image": {
|
|
344
|
+
score: scoreNftImage,
|
|
345
|
+
weight: 1
|
|
346
|
+
},
|
|
347
|
+
"Image Data": {
|
|
348
|
+
score: scoreNftImageData,
|
|
349
|
+
weight: 1
|
|
350
|
+
},
|
|
351
|
+
"Name": {
|
|
352
|
+
score: scoreNftName,
|
|
353
|
+
weight: 1
|
|
354
|
+
},
|
|
355
|
+
"YouTube URL": {
|
|
356
|
+
score: scoreNftYoutubeUrl,
|
|
357
|
+
weight: 1
|
|
358
|
+
},
|
|
282
359
|
...attributesScoringCriteria
|
|
283
360
|
};
|
|
284
361
|
var scoringCriteria = {
|
|
285
|
-
"Contract Address": {
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
362
|
+
"Contract Address": {
|
|
363
|
+
score: scoreContractAddress,
|
|
364
|
+
weight: 1
|
|
365
|
+
},
|
|
366
|
+
"Supply": {
|
|
367
|
+
score: scoreSupply,
|
|
368
|
+
weight: 1
|
|
369
|
+
},
|
|
370
|
+
"Token Id": {
|
|
371
|
+
score: scoreTokenId,
|
|
372
|
+
weight: 1
|
|
373
|
+
},
|
|
374
|
+
"Type": {
|
|
375
|
+
score: scoreType,
|
|
376
|
+
weight: 1
|
|
377
|
+
},
|
|
289
378
|
...metadataScoringCriteria
|
|
290
379
|
};
|
|
291
380
|
|
|
292
381
|
// src/lib/rating/analyzeNft.ts
|
|
293
|
-
var analyzeNft = async (nft) => {
|
|
294
|
-
const result = Object.fromEntries(
|
|
295
|
-
await
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
);
|
|
382
|
+
var analyzeNft = /* @__PURE__ */ __name(async (nft) => {
|
|
383
|
+
const result = Object.fromEntries(await Promise.all(Object.entries(scoringCriteria).map(async ([key, { score, weight }]) => {
|
|
384
|
+
const rawScore = await score(nft);
|
|
385
|
+
const weighted = rawScore.map((v) => v * weight);
|
|
386
|
+
return [
|
|
387
|
+
key,
|
|
388
|
+
weighted
|
|
389
|
+
];
|
|
390
|
+
})));
|
|
303
391
|
return result;
|
|
304
|
-
};
|
|
392
|
+
}, "analyzeNft");
|
|
305
393
|
|
|
306
394
|
// src/Diviner.ts
|
|
307
|
-
var toNftScorePayload = (nftInfo, scores) => {
|
|
395
|
+
var toNftScorePayload = /* @__PURE__ */ __name((nftInfo, scores) => {
|
|
308
396
|
const { address, chainId, type } = nftInfo;
|
|
309
|
-
return {
|
|
310
|
-
|
|
311
|
-
|
|
397
|
+
return {
|
|
398
|
+
address,
|
|
399
|
+
chainId,
|
|
400
|
+
schema: NftScoreSchema,
|
|
401
|
+
scores,
|
|
402
|
+
type
|
|
403
|
+
};
|
|
404
|
+
}, "toNftScorePayload");
|
|
405
|
+
var isNftScore = /* @__PURE__ */ __name((payload) => payload.schema === NftScoreSchema, "isNftScore");
|
|
312
406
|
var NftScoreDiviner = class extends AbstractDiviner {
|
|
313
|
-
static
|
|
407
|
+
static {
|
|
408
|
+
__name(this, "NftScoreDiviner");
|
|
409
|
+
}
|
|
410
|
+
static configSchemas = [
|
|
411
|
+
...super.configSchemas,
|
|
412
|
+
NftScoreDivinerConfigSchema
|
|
413
|
+
];
|
|
314
414
|
static defaultConfigSchema = NftScoreDivinerConfigSchema;
|
|
315
|
-
divineHandler = async (payloads) => {
|
|
415
|
+
divineHandler = /* @__PURE__ */ __name(async (payloads) => {
|
|
316
416
|
const nftInfos = payloads?.filter(isNftInfo) ?? [];
|
|
317
|
-
const results = await Promise.all(
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
417
|
+
const results = await Promise.all(nftInfos.map(async (nftInfo) => {
|
|
418
|
+
const [score, sourceHash] = await Promise.all([
|
|
419
|
+
// Analyze the NFT
|
|
420
|
+
toNftScorePayload(nftInfo, await analyzeNft(nftInfo)),
|
|
421
|
+
// Hash the source payload
|
|
422
|
+
PayloadBuilder.dataHash(nftInfo)
|
|
423
|
+
]);
|
|
424
|
+
return {
|
|
425
|
+
...score,
|
|
426
|
+
sources: [
|
|
427
|
+
sourceHash
|
|
428
|
+
]
|
|
429
|
+
};
|
|
430
|
+
}));
|
|
328
431
|
return results;
|
|
329
|
-
};
|
|
432
|
+
}, "divineHandler");
|
|
330
433
|
};
|
|
331
434
|
|
|
332
435
|
// src/Plugin.ts
|
|
333
436
|
import { NftSchema } from "@xyo-network/crypto-nft-payload-plugin";
|
|
334
437
|
import { PayloadSetSchema } from "@xyo-network/payload-model";
|
|
335
438
|
import { createPayloadSetDivinerPlugin } from "@xyo-network/payloadset-plugin";
|
|
336
|
-
var NftScoreDivinerPlugin = () => createPayloadSetDivinerPlugin(
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
439
|
+
var NftScoreDivinerPlugin = /* @__PURE__ */ __name(() => createPayloadSetDivinerPlugin({
|
|
440
|
+
required: {
|
|
441
|
+
[NftSchema]: 1
|
|
442
|
+
},
|
|
443
|
+
schema: PayloadSetSchema
|
|
444
|
+
}, {
|
|
445
|
+
diviner: /* @__PURE__ */ __name(async (params) => {
|
|
446
|
+
const result = await NftScoreDiviner.create(params);
|
|
447
|
+
return result;
|
|
448
|
+
}, "diviner")
|
|
449
|
+
}), "NftScoreDivinerPlugin");
|
|
345
450
|
export {
|
|
346
451
|
NftScoreDiviner,
|
|
347
452
|
NftScoreDivinerPlugin,
|
|
@@ -350,4 +455,4 @@ export {
|
|
|
350
455
|
isNftScore,
|
|
351
456
|
scoringCriteria
|
|
352
457
|
};
|
|
353
|
-
//# sourceMappingURL=index.
|
|
458
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":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"],"sourcesContent":["import {\n isNftInfo,\n NftInfo,\n NftScore,\n NftScoreDivinerConfig,\n NftScoreDivinerConfigSchema,\n NftScoreSchema,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerParams } from '@xyo-network/diviner-model'\nimport { AnyConfigSchema } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, Schema } from '@xyo-network/payload-model'\n\nimport { analyzeNft, NftAnalysis } from './lib/index.ts'\n\nexport type NftScoreDivinerParams = DivinerParams<AnyConfigSchema<NftScoreDivinerConfig>>\n\nconst toNftScorePayload = (nftInfo: NftInfo, scores: NftAnalysis): NftScore => {\n const { address, chainId, type } = nftInfo\n return { address, chainId, schema: NftScoreSchema, scores, type }\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, sourceHash] = await Promise.all([\n // Analyze the NFT\n toNftScorePayload(nftInfo, await analyzeNft(nftInfo)),\n // Hash the source payload\n PayloadBuilder.dataHash(nftInfo),\n ])\n return { ...score, sources: [sourceHash] }\n }),\n )\n return results\n }\n}\n","import { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { FAIL, PASS, PassFailScoringFunction } 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 { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementPossible, incrementTotal, incrementTotalAndPossible, PASS, ScaledScore } from '@xyo-network/crypto-nft-score-model'\n\nimport { isSecure, isValidUrl, isWeb3 } 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","import { URL } from '@xylabs/url'\n\nexport 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 { NftAttribute, NftInfoFields, OpenSeaNftAttribute, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementPossible, incrementTotal, incrementTotalAndPossible, ScaledScore } 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: NftAttribute[] | OpenSeaNftAttribute[] | 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 { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementPossible, incrementTotal, incrementTotalAndPossible, PASS, ScaledScore } 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 { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementTotal, ScaledScore } 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 { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementTotal, ScaledScore } 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 { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementTotal, PASS, ScaledScore } from '@xyo-network/crypto-nft-score-model'\n\nimport { isSecure, isValidUrl, isWeb3 } 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 { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PASS, ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport { parse } from 'svg-parser'\n\nconst MaxPossibleImageDataScore = 1\n\n// NOTE: 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 { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementTotal, ScaledScore } 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 { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementTotal, PASS, ScaledScore } 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 { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { FAIL, PASS, PassFailScoringFunction } 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 { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { FAIL, PASS, PassFailScoringFunction } 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 { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { FAIL, PASS, PassFailScoringFunction } from '@xyo-network/crypto-nft-score-model'\n\nexport const scoreType: PassFailScoringFunction<NftInfoFields> = (nft: NftInfoFields) => {\n if (!nft.type) return FAIL\n if (typeof nft.type !== 'string') return FAIL\n const type = nft.type.toUpperCase()\n if (type !== 'ERC721' && type !== '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 = {\n Attributes: { score: evaluateNftAttributes, weight: 1 },\n}\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 { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { 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 NftAnalysis = {\n [key in ScoringCriteriaKey]: Score\n}\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 { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetDivinerPlugin } from '@xyo-network/payloadset-plugin'\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"],"mappings":";;;;AAAA,SACEA,WAIAC,6BACAC,sBACK;AACP,SAASC,uBAAuB;AAGhC,SAASC,sBAAsB;;;ACV/B,SAASC,MAAMC,YAAqC;AACpD,SAASC,iBAAiB;AAEnB,IAAMC,uBAA+D,wBAACC,QAAAA;AAC3E,MAAI,CAACA,IAAIC,QAAS,QAAOC;AACzB,MAAI,OAAOF,IAAIC,YAAY,SAAU,QAAOC;AAC5C,MAAI,CAACC,UAAUH,IAAIC,OAAO,EAAG,QAAOC;AACpC,SAAOE;AACT,GAL4E;;;ACH5E,SAASC,mBAAmBC,gBAAgBC,2BAA2BC,QAAAA,aAAyB;;;ACDhG,SAASC,WAAW;AAEb,IAAMC,gBAAgB;EAAC;EAAS;;AAEhC,IAAMC,QAAQ,wBAACC,QAAAA;AACpB,MAAI,CAACA,IAAK,QAAOC;AACjB,MAAI;AACF,WAAO,IAAIC,IAAIF,GAAAA;EACjB,QAAQ;AACN,WAAOC;EACT;AACF,GAPqB;AASd,IAAME,aAAa,wBAACH,QAAiCD,MAAMC,GAAAA,MAASC,QAAjD;AAEnB,IAAMG,SAAS,wBAACJ,QAAiCF,cAAcO,KAAKC,CAAAA,aAAYA,aAAaP,MAAMC,GAAAA,GAAMM,QAAAA,GAA1F;AAEf,IAAMC,WAAW,wBAACC,QAAiCC,OAAOD,GAAAA,KAAQE,MAAMF,GAAAA,GAAMG,aAAa,UAA1E;;;ADZjB,IAAMC,uBAAuB,wBAACC,QAAAA;AACnC,SAAOC,kBAAkBD,IAAIE,UAAUC,aAAAA;AACzC,GAFoC;AAI7B,IAAMF,oBAAoB,wBAACE,kBAAAA;AAChC,QAAMC,QAAqB;IAAC;IAAG;;AAC/B,MAAID,kBAAkBE,UAAaF,kBAAkB,KAAM,QAAOG;AAClEC,oBAAkBH,KAAAA;AAClB,MAAI,OAAOD,kBAAkB,SAAU,QAAOC;AAC9CI,4BAA0BJ,KAAAA;AAC1B,MAAI,CAACK,WAAWN,aAAAA,EAAgB,QAAOC;AACvCI,4BAA0BJ,KAAAA;AAC1B,MAAI,CAACM,SAASP,aAAAA,EAAgB,QAAOC;AACrCI,4BAA0BJ,KAAAA;AAC1B,MAAI,CAACO,OAAOR,aAAAA,EAAgB,QAAOC;AACnC,SAAOQ,eAAeR,KAAAA;AACxB,GAZiC;;;AERjC,SAASS,qBAAAA,oBAAmBC,kBAAAA,iBAAgBC,6BAAAA,kCAA8C;AAE1F,IAAMC,SAAS,wBAACC,UAAAA;AACd,MAAIC,SAASD,KAAAA,GAAQ;AACnB,QAAI;AACF,UAAIE,KAAKF,KAAAA;AACT,aAAO;IACT,QAAQ;AACN,aAAO;IACT;EACF;AACA,SAAO;AACT,GAVe;AAYf,IAAMC,WAAW,wBAACD,UAAoC,OAAOA,UAAU,UAAtD;AAEjB,IAAMG,eAAe,wBAACH,UAA4BC,SAASD,KAAAA,KAAUA,SAAS,KAAKA,SAAS,KAAvE;AAErB,IAAMI,mBAAmB,wBAACJ,UAAoC,OAAOA,UAAU,YAAYA,MAAMK,SAAS,GAAjF;AAEzB,IAAMC,2BAA2B,wBAACN,UAA6CA,UAAU,YAAYI,iBAAiBJ,KAAAA,GAArF;AAE1B,IAAMO,wBAAwB,wBAACC,QACpCA,KAAKC,UAAUC,aAAaC,mBAAmBH,KAAKC,UAAUC,UAAAA,IAAc;EAAC;EAAG;GAD7C;AAG9B,IAAMC,qBAAqB,wBAACD,eAAAA;AACjC,MAAI,CAACA,cAAc,CAACE,MAAMC,QAAQH,UAAAA,KAAeA,WAAWL,WAAW,EAAG,QAAO;IAAC;IAAG;;AACrF,QAAMS,QAAqB;IAAC;IAAG;;AAC/B,aAAWC,aAAaL,YAAY;AAClC,UAAM,CAACM,gBAAgBC,iBAAAA,IAAqBC,kBAAkBH,SAAAA;AAC9DI,IAAAA,2BAA0BL,OAAOE,gBAAgBC,iBAAAA;EACnD;AACA,SAAO;IAAC;IAAG;;AACb,GARkC;AAU3B,IAAMC,oBAAoB,wBAACH,cAAAA;AAChC,QAAMD,QAAqB;IAAC;IAAG;;AAC/B,QAAMM,YAAYL,WAAWK;AAC7B,QAAMC,aAAaN,WAAWM;AAC9B,QAAMrB,QAAQe,WAAWf;AAGzB,MAAI,CAACe,aAAa,OAAOA,cAAc,YAAY,CAACX,iBAAiBiB,UAAAA,KAAe,CAACf,yBAAyBN,KAAAA,EAAQ,QAAOc;AAC7HQ,EAAAA,gBAAeR,KAAAA;AAGfS,EAAAA,mBAAkBT,KAAAA;AAClB,MAAIU,iBAAiBT,SAAAA,EAAYO,CAAAA,gBAAeR,KAAAA;AAGhD,MAAIM,cAAcK,QAAW;AAC3BF,IAAAA,mBAAkBT,KAAAA;AAClB,QAAIb,SAASmB,SAAAA,KAAcnB,SAASD,KAAAA,KAAUA,SAASoB,UAAWE,CAAAA,gBAAeR,KAAAA;EACnF;AAEA,SAAOA;AACT,GArBiC;AAuBjC,IAAMU,mBAAmB,wBAACT,cAAAA;AACxB,UAAQA,WAAWW,cAAAA;IACjB,KAAK;IACL,KAAK,gBAAgB;AACnB,UAAIzB,SAASc,WAAWf,KAAAA,EAAQ,QAAO;AACvC;IACF;IACA,KAAK,oBAAoB;AACvB,UAAIG,aAAaY,WAAWf,KAAAA,EAAQ,QAAO;AAC3C;IACF;IACA,KAAK,QAAQ;AACX,UAAID,OAAOgB,WAAWf,KAAAA,EAAQ,QAAO;AACrC;IACF;IACA,KAAK;IACL,KAAKyB,QAAW;AACd,UAAIrB,iBAAiBW,WAAWf,KAAAA,EAAQ,QAAO;AAC/C;IACF;IACA,SAAS;AACP;IACF;EACF;AACA,SAAO;AACT,GAzByB;;;AC1DzB,SAAS2B,qBAAAA,oBAAmBC,kBAAAA,iBAAgBC,6BAAAA,4BAA2BC,QAAAA,aAAyB;AAEhG,IAAMC,aAAa;AAEZ,IAAMC,0BAA0B,wBAACC,QAAAA;AACtC,SAAOC,qBAAqBD,IAAIE,UAAUC,gBAAAA;AAC5C,GAFuC;AAIhC,IAAMF,uBAAuB,wBAACE,qBAAAA;AACnC,QAAMC,QAAqB;IAAC;IAAG;;AAC/B,MAAID,qBAAqBE,UAAaF,qBAAqB,KAAM,QAAOG;AACxEC,EAAAA,mBAAkBH,KAAAA;AAClB,MAAI,OAAOD,qBAAqB,SAAU,QAAOC;AACjDI,EAAAA,2BAA0BJ,KAAAA;AAC1B,MAAI,CAACN,WAAWW,KAAKN,iBAAiBO,YAAW,CAAA,EAAK,QAAON;AAC7D,SAAOO,gBAAeP,KAAAA;AACxB,GARoC;;;ACRpC,SAASQ,kBAAAA,uBAAmC;AAErC,IAAMC,sBAAsB,wBAACC,QAAAA;AAClC,SAAOC,iBAAiBD,IAAIE,UAAUC,WAAAA;AACxC,GAFmC;AAI5B,IAAMF,mBAAmB,wBAACE,gBAAAA;AAC/B,QAAMC,QAAqB;IAAC;IAAG;;AAC/B,MAAI,CAACD,eAAe,OAAOA,gBAAgB,SAAU,QAAOC;AAC5D,SAAOC,gBAAeD,KAAAA;AACxB,GAJgC;;;ACNhC,SAASE,kBAAAA,uBAAmC;AAIrC,IAAMC,sBAAsB,wBAACC,QAAAA;AAClC,SAAOC,iBAAiBD,KAAKE,UAAUC,YAAAA;AACzC,GAFmC;AAG5B,IAAMF,mBAAmB,wBAACE,iBAAAA;AAC/B,QAAMC,QAAqB;IAAC;IAAG;;AAC/B,MAAID,iBAAiBE,UAAaF,iBAAiB,QAAQ,OAAOA,iBAAiB,YAAY,CAACG,WAAWH,YAAAA,EAAe,QAAOC;AACjIG,EAAAA,gBAAeH,KAAAA;AACf,MAAI,CAACI,SAASL,YAAAA,EAAe,QAAOC;AACpC,SAAOG,gBAAeH,KAAAA;AACxB,GANgC;;;ACPhC,SAASK,kBAAAA,iBAAgBC,QAAAA,aAAyB;AAIlD,IAAMC,wBAAwB;AAEvB,IAAMC,gBAAgB,wBAACC,QAAAA;AAE5B,MAAIA,KAAKC,UAAUC,OAAO;AACxB,WAAOC,WAAWH,IAAIC,UAAUC,KAAAA;EAClC,OAAO;AAEL,WAAOF,IAAIC,UAAUG,aAAaC,QAAO;MAAC;MAAGP;;EAC/C;AACF,GAR6B;AAUtB,IAAMK,aAAa,wBAACD,UAAAA;AACzB,QAAMI,QAAqB;IAAC;IAAGR;;AAC/B,MAAI,CAACI,SAAS,OAAOA,UAAU,YAAY,CAACK,WAAWL,KAAAA,EAAQ,QAAOI;AACtEE,EAAAA,gBAAeF,KAAAA;AACf,MAAI,CAACG,SAASP,KAAAA,EAAQ,QAAOI;AAC7BE,EAAAA,gBAAeF,KAAAA;AACf,MAAI,CAACI,OAAOR,KAAAA,EAAQ,QAAOI;AAC3BE,EAAAA,gBAAeF,KAAAA;AACf,SAAOA;AACT,GAT0B;;;AChB1B,SAASK,QAAAA,aAAyB;AAClC,SAASC,aAAa;AAEtB,IAAMC,4BAA4B;AAIlC,IAAMC,mBAAmB,wBAACC,eAAAA;AAExB,MAAI,CAACA,WAAWC,WAAW,MAAA,EAAS,QAAO;AAC3C,MAAI;AAEFC,UAAMF,UAAAA;AACN,WAAO;EACT,QAAQ;AACN,WAAO;EACT;AACF,GAVyB;AAYlB,IAAMG,oBAAoB,wBAACC,QAAAA;AAEhC,MAAIA,KAAKC,UAAUL,YAAY;AAC7B,WAAOM,eAAeF,IAAIC,UAAUL,UAAAA;EACtC,OAAO;AAEL,WAAOI,IAAIC,UAAUE,QAAQC,QAAO;MAAC;MAAGV;;EAC1C;AACF,GARiC;AAU1B,IAAMQ,iBAAiB,wBAACN,eAAAA;AAC7B,SAAO,CAACA,cAAc,OAAOA,eAAe,YAAY,CAACD,iBAAiBC,UAAAA,IACtE;IAAC;IAAGF;MACJ;IAACA;IAA2BA;;AAClC,GAJ8B;;;AC7B9B,SAASW,kBAAAA,uBAAmC;AAErC,IAAMC,eAAe,wBAACC,QAAAA;AAC3B,SAAOC,UAAUD,IAAIE,UAAUC,IAAAA;AACjC,GAF4B;AAGrB,IAAMF,YAAY,wBAACE,SAAAA;AACxB,QAAMC,QAAqB;IAAC;IAAG;;AAC/B,MAAI,CAACD,QAAQ,OAAOA,SAAS,SAAU,QAAOC;AAC9C,SAAOC,gBAAeD,KAAAA;AACxB,GAJyB;;;ACLzB,SAASE,kBAAAA,iBAAgBC,QAAAA,aAAyB;AAI3C,IAAMC,qBAAqB,wBAACC,QAAAA;AACjC,SAAOC,gBAAgBD,KAAKE,UAAUC,WAAAA;AACxC,GAFkC;AAG3B,IAAMF,kBAAkB,wBAACE,gBAAAA;AAC9B,MAAIA,gBAAgBC,UAAaD,gBAAgB,KAAM,QAAOE;AAC9D,QAAMC,QAAqB;IAAC;IAAG;;AAC/B,MAAI,OAAOH,gBAAgB,YAAY,CAACI,WAAWJ,WAAAA,EAAc,QAAOG;AACxEE,EAAAA,gBAAeF,KAAAA;AACf,MAAI,CAACG,SAASN,WAAAA,EAAc,QAAOG;AACnC,SAAOE,gBAAeF,KAAAA;AACxB,GAP+B;;;ACP/B,SAASI,QAAAA,OAAMC,QAAAA,aAAqC;AAE7C,IAAMC,cAAsD,wBAACC,QAAAA;AAClE,MAAI,CAACA,IAAIC,OAAQ,QAAOC;AACxB,MAAI,OAAOF,IAAIC,WAAW,SAAU,QAAOC;AAC3C,MAAI;AACF,WAAOC,OAAOH,IAAII,OAAO,KAAK,MAAMD,OAAOH,IAAII,OAAO,IAAI,MAAM,OAAOC,QAAOH;EAChF,QAAQ;AACN,WAAOA;EACT;AACF,GARmE;;;ACFnE,SAASI,QAAAA,OAAMC,QAAAA,aAAqC;AAQ7C,IAAMC,eAAuD,wBAACC,QAAAA;AACnE,MAAI,CAACA,IAAIC,QAAS,QAAOC;AACzB,MAAI,OAAOF,IAAIC,YAAY,SAAU,QAAOC;AAC5C,MAAI;AACF,WAAOC,OAAOH,IAAIC,OAAO,KAAK,MAAME,OAAOH,IAAIC,OAAO,IAAI,MAAM,OAAOG,QAAOF;EAChF,QAAQ;AACN,WAAOA;EACT;AACF,GARoE;;;ACRpE,SAASG,QAAAA,OAAMC,QAAAA,aAAqC;AAE7C,IAAMC,YAAoD,wBAACC,QAAAA;AAChE,MAAI,CAACA,IAAIC,KAAM,QAAOC;AACtB,MAAI,OAAOF,IAAIC,SAAS,SAAU,QAAOC;AACzC,QAAMD,OAAOD,IAAIC,KAAKE,YAAW;AACjC,MAAIF,SAAS,YAAYA,SAAS,UAAW,QAAOC;AACpD,SAAOE;AACT,GANiE;;;ACajE,IAAMC,4BAA4B;EAChCC,YAAY;IAAEC,OAAOC;IAAuBC,QAAQ;EAAE;AACxD;AAEA,IAAMC,0BAA0B;EAC9B,iBAAiB;IAAEH,OAAOI;IAAsBF,QAAQ;EAAE;EAC1D,oBAAoB;IAAEF,OAAOK;IAAyBH,QAAQ;EAAE;EAChE,eAAe;IAAEF,OAAOM;IAAqBJ,QAAQ;EAAE;EACvD,gBAAgB;IAAEF,OAAOO;IAAqBL,QAAQ;EAAE;EACxD,SAAS;IAAEF,OAAOQ;IAAeN,QAAQ;EAAE;EAC3C,cAAc;IAAEF,OAAOS;IAAmBP,QAAQ;EAAE;EACpD,QAAQ;IAAEF,OAAOU;IAAcR,QAAQ;EAAE;EACzC,eAAe;IAAEF,OAAOW;IAAoBT,QAAQ;EAAE;EACtD,GAAGJ;AACL;AAEO,IAAMc,kBAAkB;EAC7B,oBAAoB;IAAEZ,OAAOa;IAAsBX,QAAQ;EAAE;EAC7D,UAAU;IAAEF,OAAOc;IAAaZ,QAAQ;EAAE;EAC1C,YAAY;IAAEF,OAAOe;IAAcb,QAAQ;EAAE;EAC7C,QAAQ;IAAEF,OAAOgB;IAAWd,QAAQ;EAAE;EACtC,GAAGC;AACL;;;AC3BO,IAAMc,aAAa,8BAIxBC,QAAAA;AAEA,QAAMC,SAASC,OAAOC,YACpB,MAAMC,QAAQC,IACZH,OAAOI,QAAQC,eAAAA,EAAiBC,IAAI,OAAO,CAACC,KAAK,EAAEC,OAAOC,OAAM,CAAE,MAAC;AACjE,UAAMC,WAAW,MAAMF,MAAMV,GAAAA;AAC7B,UAAMa,WAAWD,SAASJ,IAAIM,CAAAA,MAAKA,IAAIH,MAAAA;AACvC,WAAO;MAACF;MAAKI;;EACf,CAAA,CAAA,CAAA;AAGJ,SAAOZ;AACT,GAhB0B;;;AhBO1B,IAAMc,oBAAoB,wBAACC,SAAkBC,WAAAA;AAC3C,QAAM,EAAEC,SAASC,SAASC,KAAI,IAAKJ;AACnC,SAAO;IAAEE;IAASC;IAASE,QAAQC;IAAgBL;IAAQG;EAAK;AAClE,GAH0B;AAKnB,IAAMG,aAAa,wBAACC,YAA0CA,QAAQH,WAAWC,gBAA9D;AAEnB,IAAMG,kBAAN,cAA6FC,gBAAAA;EAzBpG,OAyBoGA;;;EAClG,OAAyBC,gBAA0B;OAAI,MAAMA;IAAeC;;EAC5E,OAAyBC,sBAA8BD;EAEpCE,gBAAgB,8BAAOC,aAAAA;AACxC,UAAMC,WAAWD,UAAUE,OAAOC,SAAAA,KAAc,CAAA;AAChD,UAAMC,UAAU,MAAMC,QAAQC,IAC5BL,SAASM,IAAuB,OAAOtB,YAAAA;AACrC,YAAM,CAACuB,OAAOC,UAAAA,IAAc,MAAMJ,QAAQC,IAAI;;QAE5CtB,kBAAkBC,SAAS,MAAMyB,WAAWzB,OAAAA,CAAAA;;QAE5C0B,eAAeC,SAAS3B,OAAAA;OACzB;AACD,aAAO;QAAE,GAAGuB;QAAOK,SAAS;UAACJ;;MAAY;IAC3C,CAAA,CAAA;AAEF,WAAOL;EACT,GAdmC;AAerC;;;AiB5CA,SAASU,iBAAiB;AAC1B,SAASC,wBAAwB;AACjC,SAASC,qCAAqC;AAIvC,IAAMC,wBAAwB,6BACnCC,8BACE;EAAEC,UAAU;IAAE,CAACC,SAAAA,GAAY;EAAE;EAAGC,QAAQC;AAAiB,GACzD;EACEC,SAAS,8BAAOC,WAAAA;AACd,UAAMC,SAAS,MAAMC,gBAAgBC,OAAOH,MAAAA;AAC5C,WAAOC;EACT,GAHS;AAIX,CAAA,GARiC;","names":["isNftInfo","NftScoreDivinerConfigSchema","NftScoreSchema","AbstractDiviner","PayloadBuilder","FAIL","PASS","isAddress","scoreContractAddress","nft","address","FAIL","isAddress","PASS","incrementPossible","incrementTotal","incrementTotalAndPossible","PASS","URL","web3Protocols","toUrl","url","undefined","URL","isValidUrl","isWeb3","some","protocol","isSecure","url","isWeb3","toUrl","protocol","scoreNftAnimationUrl","nft","scoreAnimationUrl","metadata","animation_url","score","undefined","PASS","incrementPossible","incrementTotalAndPossible","isValidUrl","isSecure","isWeb3","incrementTotal","incrementPossible","incrementTotal","incrementTotalAndPossible","isDate","value","isNumber","Date","isPercentage","isNonEmptyString","length","isNonEmptyStringOrNumber","evaluateNftAttributes","nft","metadata","attributes","evaluateAttributes","Array","isArray","score","attribute","attributeTotal","attributePossible","evaluateAttribute","incrementTotalAndPossible","max_value","trait_type","incrementTotal","incrementPossible","validDisplayType","undefined","display_type","incrementPossible","incrementTotal","incrementTotalAndPossible","PASS","isHexColor","scoreNftBackgroundColor","nft","scoreBackgroundColor","metadata","background_color","score","undefined","PASS","incrementPossible","incrementTotalAndPossible","test","toUpperCase","incrementTotal","incrementTotal","scoreNftDescription","nft","scoreDescription","metadata","description","score","incrementTotal","incrementTotal","scoreNftExternalUrl","nft","scoreExternalUrl","metadata","external_url","score","undefined","isValidUrl","incrementTotal","isSecure","incrementTotal","PASS","MaxPossibleImageScore","scoreNftImage","nft","metadata","image","scoreImage","image_data","PASS","score","isValidUrl","incrementTotal","isSecure","isWeb3","PASS","parse","MaxPossibleImageDataScore","isValidImageData","image_data","startsWith","parse","scoreNftImageData","nft","metadata","scoreImageData","image","PASS","incrementTotal","scoreNftName","nft","scoreName","metadata","name","score","incrementTotal","incrementTotal","PASS","scoreNftYoutubeUrl","nft","scoreYoutubeUrl","metadata","youtube_url","undefined","PASS","score","isValidUrl","incrementTotal","isSecure","FAIL","PASS","scoreSupply","nft","supply","FAIL","BigInt","tokenId","PASS","FAIL","PASS","scoreTokenId","nft","tokenId","FAIL","BigInt","PASS","FAIL","PASS","scoreType","nft","type","FAIL","toUpperCase","PASS","attributesScoringCriteria","Attributes","score","evaluateNftAttributes","weight","metadataScoringCriteria","scoreNftAnimationUrl","scoreNftBackgroundColor","scoreNftDescription","scoreNftExternalUrl","scoreNftImage","scoreNftImageData","scoreNftName","scoreNftYoutubeUrl","scoringCriteria","scoreContractAddress","scoreSupply","scoreTokenId","scoreType","analyzeNft","nft","result","Object","fromEntries","Promise","all","entries","scoringCriteria","map","key","score","weight","rawScore","weighted","v","toNftScorePayload","nftInfo","scores","address","chainId","type","schema","NftScoreSchema","isNftScore","payload","NftScoreDiviner","AbstractDiviner","configSchemas","NftScoreDivinerConfigSchema","defaultConfigSchema","divineHandler","payloads","nftInfos","filter","isNftInfo","results","Promise","all","map","score","sourceHash","analyzeNft","PayloadBuilder","dataHash","sources","NftSchema","PayloadSetSchema","createPayloadSetDivinerPlugin","NftScoreDivinerPlugin","createPayloadSetDivinerPlugin","required","NftSchema","schema","PayloadSetSchema","diviner","params","result","NftScoreDiviner","create"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './rating/index.
|
|
1
|
+
export * from './rating/index.ts';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './rating/index.
|
|
1
|
+
export * from './rating/index.ts';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './rating/index.
|
|
1
|
+
export * from './rating/index.ts';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|