@xyo-network/crypto-nft-collection-witness-plugin 2.99.4 → 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 +175 -127
- 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.mjs +325 -0
- package/dist/browser/index.mjs.map +1 -0
- package/dist/browser/lib/collectionMetrics/index.d.cts +1 -1
- package/dist/browser/lib/collectionMetrics/index.d.mts +1 -1
- package/dist/browser/lib/collectionMetrics/index.d.ts +1 -1
- package/dist/browser/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.cts +1 -1
- package/dist/browser/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.mts +1 -1
- package/dist/browser/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.ts +1 -1
- package/dist/browser/lib/collectionMetrics/lib/calculatePropertyDistribution.d.cts +1 -1
- package/dist/browser/lib/collectionMetrics/lib/calculatePropertyDistribution.d.mts +1 -1
- package/dist/browser/lib/collectionMetrics/lib/calculatePropertyDistribution.d.ts +1 -1
- package/dist/browser/lib/collectionMetrics/lib/index.d.cts +3 -3
- package/dist/browser/lib/collectionMetrics/lib/index.d.mts +3 -3
- package/dist/browser/lib/collectionMetrics/lib/index.d.ts +3 -3
- package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.cts +2 -2
- package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.mts +2 -2
- package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.ts +2 -2
- package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/index.d.cts +1 -1
- package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/index.d.mts +1 -1
- package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/index.d.ts +1 -1
- package/dist/browser/lib/index.d.cts +4 -4
- package/dist/browser/lib/index.d.mts +4 -4
- package/dist/browser/lib/index.d.ts +4 -4
- package/dist/browser/lib/nonEvaluableContractAddresses.d.cts.map +1 -1
- package/dist/browser/lib/nonEvaluableContractAddresses.d.mts.map +1 -1
- package/dist/browser/lib/nonEvaluableContractAddresses.d.ts.map +1 -1
- 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 +175 -127
- 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.mjs +325 -0
- package/dist/neutral/index.mjs.map +1 -0
- package/dist/neutral/lib/collectionMetrics/index.d.cts +1 -1
- package/dist/neutral/lib/collectionMetrics/index.d.mts +1 -1
- package/dist/neutral/lib/collectionMetrics/index.d.ts +1 -1
- package/dist/neutral/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.cts +1 -1
- package/dist/neutral/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.mts +1 -1
- package/dist/neutral/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.ts +1 -1
- package/dist/neutral/lib/collectionMetrics/lib/calculatePropertyDistribution.d.cts +1 -1
- package/dist/neutral/lib/collectionMetrics/lib/calculatePropertyDistribution.d.mts +1 -1
- package/dist/neutral/lib/collectionMetrics/lib/calculatePropertyDistribution.d.ts +1 -1
- package/dist/neutral/lib/collectionMetrics/lib/index.d.cts +3 -3
- package/dist/neutral/lib/collectionMetrics/lib/index.d.mts +3 -3
- package/dist/neutral/lib/collectionMetrics/lib/index.d.ts +3 -3
- package/dist/neutral/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.cts +2 -2
- package/dist/neutral/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.mts +2 -2
- package/dist/neutral/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.ts +2 -2
- package/dist/neutral/lib/collectionMetrics/lib/probabilityDistributions/index.d.cts +1 -1
- package/dist/neutral/lib/collectionMetrics/lib/probabilityDistributions/index.d.mts +1 -1
- package/dist/neutral/lib/collectionMetrics/lib/probabilityDistributions/index.d.ts +1 -1
- package/dist/neutral/lib/index.d.cts +4 -4
- package/dist/neutral/lib/index.d.mts +4 -4
- package/dist/neutral/lib/index.d.ts +4 -4
- package/dist/neutral/lib/nonEvaluableContractAddresses.d.cts.map +1 -1
- package/dist/neutral/lib/nonEvaluableContractAddresses.d.mts.map +1 -1
- package/dist/neutral/lib/nonEvaluableContractAddresses.d.ts.map +1 -1
- 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 +181 -129
- 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.mjs +333 -0
- package/dist/node/index.mjs.map +1 -0
- package/dist/node/lib/collectionMetrics/index.d.cts +1 -1
- package/dist/node/lib/collectionMetrics/index.d.mts +1 -1
- package/dist/node/lib/collectionMetrics/index.d.ts +1 -1
- package/dist/node/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.cts +1 -1
- package/dist/node/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.mts +1 -1
- package/dist/node/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.d.ts +1 -1
- package/dist/node/lib/collectionMetrics/lib/calculatePropertyDistribution.d.cts +1 -1
- package/dist/node/lib/collectionMetrics/lib/calculatePropertyDistribution.d.mts +1 -1
- package/dist/node/lib/collectionMetrics/lib/calculatePropertyDistribution.d.ts +1 -1
- package/dist/node/lib/collectionMetrics/lib/index.d.cts +3 -3
- package/dist/node/lib/collectionMetrics/lib/index.d.mts +3 -3
- package/dist/node/lib/collectionMetrics/lib/index.d.ts +3 -3
- package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.cts +2 -2
- package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.mts +2 -2
- package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.d.ts +2 -2
- package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/index.d.cts +1 -1
- package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/index.d.mts +1 -1
- package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/index.d.ts +1 -1
- package/dist/node/lib/index.d.cts +4 -4
- package/dist/node/lib/index.d.mts +4 -4
- package/dist/node/lib/index.d.ts +4 -4
- package/dist/node/lib/nonEvaluableContractAddresses.d.cts.map +1 -1
- package/dist/node/lib/nonEvaluableContractAddresses.d.mts.map +1 -1
- package/dist/node/lib/nonEvaluableContractAddresses.d.ts.map +1 -1
- package/package.json +25 -25
- package/src/Plugin.ts +1 -1
- package/src/Witness.ts +3 -3
- package/src/index.ts +3 -3
- package/src/lib/collectionMetrics/getNftCollectionMetrics.ts +3 -3
- package/src/lib/collectionMetrics/index.ts +1 -1
- package/src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts +1 -1
- package/src/lib/collectionMetrics/lib/calculatePropertyDistribution.ts +1 -1
- package/src/lib/collectionMetrics/lib/index.ts +3 -3
- package/src/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.ts +2 -2
- package/src/lib/collectionMetrics/lib/probabilityDistributions/index.ts +1 -1
- package/src/lib/getNftCollectionNfts.ts +13 -13
- package/src/lib/index.ts +4 -4
- package/src/lib/nonEvaluableContractAddresses.ts +1 -1
- package/src/lib/tokenTypes.ts +1 -1
- package/dist/browser/index.js +0 -279
- package/dist/browser/index.js.map +0 -1
- package/dist/neutral/index.js +0 -279
- package/dist/neutral/index.js.map +0 -1
- package/dist/node/index.js +0 -283
- package/dist/node/index.js.map +0 -1
package/dist/node/index.cjs
CHANGED
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
6
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __reflectGet = Reflect.get;
|
|
8
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
6
10
|
var __export = (target, all) => {
|
|
7
11
|
for (var name in all)
|
|
8
12
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -16,6 +20,8 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
20
|
return to;
|
|
17
21
|
};
|
|
18
22
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
23
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
24
|
+
var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
|
|
19
25
|
|
|
20
26
|
// src/index.ts
|
|
21
27
|
var src_exports = {};
|
|
@@ -33,7 +39,7 @@ __export(src_exports, {
|
|
|
33
39
|
module.exports = __toCommonJS(src_exports);
|
|
34
40
|
|
|
35
41
|
// src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts
|
|
36
|
-
var calculateAllPropertiesDistribution = (array) => {
|
|
42
|
+
var calculateAllPropertiesDistribution = /* @__PURE__ */ __name((array) => {
|
|
37
43
|
const distribution = {};
|
|
38
44
|
for (const item of array) {
|
|
39
45
|
for (const property in item) {
|
|
@@ -42,12 +48,12 @@ var calculateAllPropertiesDistribution = (array) => {
|
|
|
42
48
|
if (value !== void 0 && value !== null) {
|
|
43
49
|
const valueString = value.toString();
|
|
44
50
|
if (!distribution[property]) {
|
|
45
|
-
distribution[property] = {
|
|
51
|
+
distribution[property] = {
|
|
52
|
+
[valueString]: 1
|
|
53
|
+
};
|
|
46
54
|
} else if (distribution[property][valueString]) {
|
|
47
|
-
;
|
|
48
55
|
distribution[property][valueString] += 1;
|
|
49
56
|
} else {
|
|
50
|
-
;
|
|
51
57
|
distribution[property][valueString] = 1;
|
|
52
58
|
}
|
|
53
59
|
}
|
|
@@ -55,46 +61,73 @@ var calculateAllPropertiesDistribution = (array) => {
|
|
|
55
61
|
}
|
|
56
62
|
}
|
|
57
63
|
return distribution;
|
|
58
|
-
};
|
|
64
|
+
}, "calculateAllPropertiesDistribution");
|
|
59
65
|
|
|
60
66
|
// src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts
|
|
61
|
-
var calculateBinomialParamsFromProbability = (n, p) => {
|
|
67
|
+
var calculateBinomialParamsFromProbability = /* @__PURE__ */ __name((n, p) => {
|
|
62
68
|
const mean = n * p;
|
|
63
69
|
const variance = n * p * (1 - p);
|
|
64
70
|
const stdDev = Math.sqrt(variance);
|
|
65
|
-
return {
|
|
66
|
-
|
|
71
|
+
return {
|
|
72
|
+
mean,
|
|
73
|
+
p,
|
|
74
|
+
stdDev,
|
|
75
|
+
variance
|
|
76
|
+
};
|
|
77
|
+
}, "calculateBinomialParamsFromProbability");
|
|
67
78
|
|
|
68
79
|
// src/lib/collectionMetrics/getNftCollectionMetrics.ts
|
|
69
|
-
var getNftCollectionMetrics = (nfts) => {
|
|
80
|
+
var getNftCollectionMetrics = /* @__PURE__ */ __name((nfts) => {
|
|
70
81
|
const traits = nfts.map((nft) => {
|
|
71
82
|
var _a;
|
|
72
83
|
return (_a = nft == null ? void 0 : nft.metadata) == null ? void 0 : _a.attributes;
|
|
73
84
|
}).filter((v) => v !== void 0).map((attributes2) => {
|
|
74
|
-
return Object.fromEntries(attributes2.map((attribute) => [
|
|
85
|
+
return Object.fromEntries(attributes2.map((attribute) => [
|
|
86
|
+
attribute.trait_type,
|
|
87
|
+
attribute.value
|
|
88
|
+
]));
|
|
75
89
|
});
|
|
76
90
|
const distribution = calculateAllPropertiesDistribution(traits);
|
|
77
91
|
const n = nfts.length;
|
|
78
|
-
const attributes = Object.fromEntries(
|
|
79
|
-
Object.entries
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
return [
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
};
|
|
92
|
+
const attributes = Object.fromEntries(Object.entries(distribution).filter((v) => v[1] !== void 0).map(([trait, entries]) => {
|
|
93
|
+
const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0);
|
|
94
|
+
const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n);
|
|
95
|
+
const values = Object.fromEntries(Object.entries(entries).map(([value, traitValueCount]) => {
|
|
96
|
+
const { p: p2 } = calculateBinomialParamsFromProbability(n, traitValueCount / n);
|
|
97
|
+
const metrics = {
|
|
98
|
+
binomial: {
|
|
99
|
+
p: p2
|
|
100
|
+
},
|
|
101
|
+
count: traitValueCount
|
|
102
|
+
};
|
|
103
|
+
return [
|
|
104
|
+
value,
|
|
105
|
+
metrics
|
|
106
|
+
];
|
|
107
|
+
}));
|
|
108
|
+
return [
|
|
109
|
+
trait,
|
|
110
|
+
{
|
|
111
|
+
metrics: {
|
|
112
|
+
binomial: {
|
|
113
|
+
p
|
|
114
|
+
},
|
|
115
|
+
count: traitCount
|
|
116
|
+
},
|
|
117
|
+
values
|
|
118
|
+
}
|
|
119
|
+
];
|
|
120
|
+
}));
|
|
121
|
+
return {
|
|
122
|
+
metadata: {
|
|
123
|
+
attributes
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
}, "getNftCollectionMetrics");
|
|
94
127
|
|
|
95
128
|
// src/lib/contractHasFunctions.ts
|
|
96
129
|
var import_assert = require("@xylabs/assert");
|
|
97
|
-
var contractHasFunctions = async (provider, address, contractInterface, functionNames) => {
|
|
130
|
+
var contractHasFunctions = /* @__PURE__ */ __name(async (provider, address, contractInterface, functionNames) => {
|
|
98
131
|
var _a;
|
|
99
132
|
try {
|
|
100
133
|
const bytecode = await provider.getCode(address, "latest");
|
|
@@ -111,7 +144,7 @@ var contractHasFunctions = async (provider, address, contractInterface, function
|
|
|
111
144
|
console.log(error);
|
|
112
145
|
return false;
|
|
113
146
|
}
|
|
114
|
-
};
|
|
147
|
+
}, "contractHasFunctions");
|
|
115
148
|
|
|
116
149
|
// src/lib/getNftCollectionNfts.ts
|
|
117
150
|
var import_axios = require("@xylabs/axios");
|
|
@@ -125,14 +158,23 @@ var import_witness_blockchain_abstract = require("@xyo-network/witness-blockchai
|
|
|
125
158
|
|
|
126
159
|
// src/lib/tokenTypes.ts
|
|
127
160
|
var import_open_zeppelin_typechain = require("@xyo-network/open-zeppelin-typechain");
|
|
128
|
-
var isErc1155 = async (provider, address) => {
|
|
129
|
-
return await contractHasFunctions(provider, address, import_open_zeppelin_typechain.ERC1155URIStorage__factory.createInterface(), [
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
161
|
+
var isErc1155 = /* @__PURE__ */ __name(async (provider, address) => {
|
|
162
|
+
return await contractHasFunctions(provider, address, import_open_zeppelin_typechain.ERC1155URIStorage__factory.createInterface(), [
|
|
163
|
+
"uri"
|
|
164
|
+
]);
|
|
165
|
+
}, "isErc1155");
|
|
166
|
+
var isErc721 = /* @__PURE__ */ __name(async (provider, address) => {
|
|
167
|
+
return await contractHasFunctions(provider, address, import_open_zeppelin_typechain.ERC721__factory.createInterface(), [
|
|
168
|
+
"name",
|
|
169
|
+
"symbol",
|
|
170
|
+
"tokenURI"
|
|
171
|
+
]);
|
|
172
|
+
}, "isErc721");
|
|
173
|
+
var tokenTypes = /* @__PURE__ */ __name(async (provider, address) => {
|
|
174
|
+
const [erc721, erc1155] = await Promise.all([
|
|
175
|
+
isErc721(provider, address),
|
|
176
|
+
isErc1155(provider, address)
|
|
177
|
+
]);
|
|
136
178
|
const result = [];
|
|
137
179
|
if (erc721) {
|
|
138
180
|
result.push("ERC721");
|
|
@@ -141,10 +183,10 @@ var tokenTypes = async (provider, address) => {
|
|
|
141
183
|
result.push("ERC1155");
|
|
142
184
|
}
|
|
143
185
|
return result;
|
|
144
|
-
};
|
|
186
|
+
}, "tokenTypes");
|
|
145
187
|
|
|
146
188
|
// src/lib/tryCall.ts
|
|
147
|
-
var tryCall = async (func, name) => {
|
|
189
|
+
var tryCall = /* @__PURE__ */ __name(async (func, name) => {
|
|
148
190
|
try {
|
|
149
191
|
return await func();
|
|
150
192
|
} catch (ex) {
|
|
@@ -154,59 +196,66 @@ var tryCall = async (func, name) => {
|
|
|
154
196
|
}
|
|
155
197
|
return void 0;
|
|
156
198
|
}
|
|
157
|
-
};
|
|
199
|
+
}, "tryCall");
|
|
158
200
|
|
|
159
201
|
// src/lib/getNftCollectionNfts.ts
|
|
160
202
|
var ipfsGateway = "5d7b6582.beta.decentralnetworkservices.com";
|
|
161
203
|
function range(size, startAt = 0) {
|
|
162
|
-
return [
|
|
204
|
+
return [
|
|
205
|
+
...Array(size).keys()
|
|
206
|
+
].map((i) => i + startAt);
|
|
163
207
|
}
|
|
164
|
-
|
|
208
|
+
__name(range, "range");
|
|
209
|
+
var getNftCollectionNfts = /* @__PURE__ */ __name(async (contractAddress, provider, types, maxNfts = 100) => {
|
|
165
210
|
try {
|
|
166
211
|
const block = await provider.getBlockNumber();
|
|
167
212
|
const erc1967Status = await (0, import_erc1967_witness.getErc1967SlotStatus)(provider, contractAddress, block);
|
|
168
213
|
const erc1822Status = await (0, import_erc1822_witness.getErc1822SlotStatus)(provider, contractAddress, block);
|
|
169
214
|
const implementation = !erc1967Status.slots.implementation || (0, import_hex.isHexZero)(erc1967Status.slots.implementation) ? erc1822Status.implementation : erc1967Status.implementation;
|
|
170
|
-
const axios = new import_axios.AxiosJson({
|
|
215
|
+
const axios = new import_axios.AxiosJson({
|
|
216
|
+
timeout: 2e3
|
|
217
|
+
});
|
|
171
218
|
const enumerable = import_open_zeppelin_typechain2.ERC721Enumerable__factory.connect(implementation, provider);
|
|
172
219
|
const storage = import_open_zeppelin_typechain2.ERC721URIStorage__factory.connect(implementation, provider);
|
|
173
220
|
const supply1155 = import_open_zeppelin_typechain2.ERC1155Supply__factory.connect(implementation, provider);
|
|
174
221
|
const finalTypes = types ?? await tokenTypes(provider, implementation);
|
|
175
222
|
const maxNftsArray = range(maxNfts);
|
|
176
|
-
const result = (await Promise.all(
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
223
|
+
const result = (await Promise.all(maxNftsArray.map(async (_value, i) => {
|
|
224
|
+
const tokenId = await tryCall(async () => await enumerable.tokenByIndex(i, {
|
|
225
|
+
blockTag: block
|
|
226
|
+
})) ?? BigInt(i);
|
|
227
|
+
if (tokenId !== void 0) {
|
|
228
|
+
const supply = finalTypes.includes((0, import_crypto_nft_payload_plugin.toTokenType)("ERC1155")) ? await tryCall(async () => await supply1155["totalSupply(uint256)"](tokenId)) ?? "0x01" : "0x01";
|
|
229
|
+
const metadataUri = await tryCall(async () => await storage.tokenURI(tokenId, {
|
|
230
|
+
blockTag: block
|
|
231
|
+
}));
|
|
232
|
+
const checkedMetaDataUri = metadataUri ? (0, import_witness_blockchain_abstract.checkIpfsUrl)(metadataUri, ipfsGateway) : void 0;
|
|
233
|
+
let metadata;
|
|
234
|
+
if (checkedMetaDataUri !== void 0) {
|
|
235
|
+
try {
|
|
236
|
+
metadata = (await axios.get(checkedMetaDataUri)).data;
|
|
237
|
+
} catch (ex) {
|
|
238
|
+
const error = ex;
|
|
239
|
+
console.error(`Get Metadata failed: ${error.message}`);
|
|
191
240
|
}
|
|
192
|
-
const info = {
|
|
193
|
-
address: contractAddress,
|
|
194
|
-
chainId: Number((await provider.getNetwork()).chainId),
|
|
195
|
-
metadata,
|
|
196
|
-
metadataUri,
|
|
197
|
-
schema: import_crypto_nft_payload_plugin.NftSchema,
|
|
198
|
-
supply: `0x${supply.toString(16)}`,
|
|
199
|
-
tokenId: `0x${tokenId.toString(16)}`,
|
|
200
|
-
type: finalTypes.at(0),
|
|
201
|
-
types: finalTypes
|
|
202
|
-
};
|
|
203
|
-
if (implementation !== contractAddress) {
|
|
204
|
-
info.implementation = implementation;
|
|
205
|
-
}
|
|
206
|
-
return info;
|
|
207
241
|
}
|
|
208
|
-
|
|
209
|
-
|
|
242
|
+
const info = {
|
|
243
|
+
address: contractAddress,
|
|
244
|
+
chainId: Number((await provider.getNetwork()).chainId),
|
|
245
|
+
metadata,
|
|
246
|
+
metadataUri,
|
|
247
|
+
schema: import_crypto_nft_payload_plugin.NftSchema,
|
|
248
|
+
supply: `0x${supply.toString(16)}`,
|
|
249
|
+
tokenId: `0x${tokenId.toString(16)}`,
|
|
250
|
+
type: finalTypes.at(0),
|
|
251
|
+
types: finalTypes
|
|
252
|
+
};
|
|
253
|
+
if (implementation !== contractAddress) {
|
|
254
|
+
info.implementation = implementation;
|
|
255
|
+
}
|
|
256
|
+
return info;
|
|
257
|
+
}
|
|
258
|
+
}))).filter(import_exists.exists);
|
|
210
259
|
return result;
|
|
211
260
|
} catch (ex) {
|
|
212
261
|
const error = ex;
|
|
@@ -214,7 +263,7 @@ var getNftCollectionNfts = async (contractAddress, provider, types, maxNfts = 10
|
|
|
214
263
|
console.log(error.stack);
|
|
215
264
|
return [];
|
|
216
265
|
}
|
|
217
|
-
};
|
|
266
|
+
}, "getNftCollectionNfts");
|
|
218
267
|
|
|
219
268
|
// src/Plugin.ts
|
|
220
269
|
var import_crypto_nft_payload_plugin2 = require("@xyo-network/crypto-nft-payload-plugin");
|
|
@@ -236,69 +285,72 @@ function resolvedValue(settled, assert) {
|
|
|
236
285
|
}
|
|
237
286
|
return settled.status === "fulfilled" ? settled.value : void 0;
|
|
238
287
|
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
static defaultConfigSchema = import_crypto_nft_collection_payload_plugin.NftCollectionWitnessConfigSchema;
|
|
288
|
+
__name(resolvedValue, "resolvedValue");
|
|
289
|
+
var _CryptoNftCollectionWitness = class _CryptoNftCollectionWitness extends import_witness_evm_abstract.AbstractEvmWitness {
|
|
242
290
|
async observeHandler(payloads) {
|
|
243
291
|
await this.started("throw");
|
|
244
292
|
await this.getProviders();
|
|
245
293
|
const queries = (payloads == null ? void 0 : payloads.filter(import_crypto_nft_collection_payload_plugin.isNftCollectionWitnessQuery)) ?? [];
|
|
246
|
-
const observations = await Promise.all(
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
types
|
|
284
|
-
};
|
|
285
|
-
return payload;
|
|
286
|
-
})
|
|
287
|
-
);
|
|
294
|
+
const observations = await Promise.all(queries.map(async (query) => {
|
|
295
|
+
const chainId = (0, import_assert2.assertEx)((query == null ? void 0 : query.chainId) || this.config.chainId, () => "params.chainId is required");
|
|
296
|
+
const provider = await this.getProvider(true, true);
|
|
297
|
+
const address = (0, import_assert2.assertEx)(import_eth_address.EthAddress.parse((0, import_assert2.assertEx)((query == null ? void 0 : query.address) || this.config.address, () => "params.address is required")), () => "Failed to parse params.address").toString();
|
|
298
|
+
const erc721Enumerable = import_open_zeppelin_typechain3.ERC721Enumerable__factory.connect(address, provider);
|
|
299
|
+
const maxNfts = (query == null ? void 0 : query.maxNfts) || defaultMaxNfts;
|
|
300
|
+
const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([
|
|
301
|
+
erc721Enumerable.name(),
|
|
302
|
+
erc721Enumerable.symbol(),
|
|
303
|
+
erc721Enumerable.totalSupply(),
|
|
304
|
+
tokenTypes(provider, address),
|
|
305
|
+
this.archivistInstance()
|
|
306
|
+
]);
|
|
307
|
+
const types = resolvedValue(typesSettled, true);
|
|
308
|
+
const nfts = await getNftCollectionNfts(address, provider, types, maxNfts);
|
|
309
|
+
const metrics = getNftCollectionMetrics(nfts);
|
|
310
|
+
const archivist = resolvedValue(archivistSettled);
|
|
311
|
+
const [sources] = await Promise.all([
|
|
312
|
+
// Hash all the payloads
|
|
313
|
+
Promise.all(nfts.map((nft) => import_payload_builder.PayloadBuilder.dataHash(nft))),
|
|
314
|
+
// Insert them into the archivist if we have one
|
|
315
|
+
archivist ? archivist.insert(nfts) : NoOp
|
|
316
|
+
]);
|
|
317
|
+
const payload = {
|
|
318
|
+
address,
|
|
319
|
+
chainId,
|
|
320
|
+
metrics,
|
|
321
|
+
name: resolvedValue(name, true),
|
|
322
|
+
schema: import_crypto_nft_collection_payload_plugin.NftCollectionSchema,
|
|
323
|
+
sources,
|
|
324
|
+
symbol: resolvedValue(symbol, true),
|
|
325
|
+
total: Number(resolvedValue(total, true)),
|
|
326
|
+
type: types.at(0),
|
|
327
|
+
types
|
|
328
|
+
};
|
|
329
|
+
return payload;
|
|
330
|
+
}));
|
|
288
331
|
return observations.flat();
|
|
289
332
|
}
|
|
290
333
|
};
|
|
334
|
+
__name(_CryptoNftCollectionWitness, "CryptoNftCollectionWitness");
|
|
335
|
+
__publicField(_CryptoNftCollectionWitness, "configSchemas", [
|
|
336
|
+
...__superGet(_CryptoNftCollectionWitness, _CryptoNftCollectionWitness, "configSchemas"),
|
|
337
|
+
import_crypto_nft_collection_payload_plugin.NftCollectionWitnessConfigSchema
|
|
338
|
+
]);
|
|
339
|
+
__publicField(_CryptoNftCollectionWitness, "defaultConfigSchema", import_crypto_nft_collection_payload_plugin.NftCollectionWitnessConfigSchema);
|
|
340
|
+
var CryptoNftCollectionWitness = _CryptoNftCollectionWitness;
|
|
291
341
|
|
|
292
342
|
// src/Plugin.ts
|
|
293
|
-
var CryptoNftCollectionWitnessPlugin = () => (0, import_payloadset_plugin.createPayloadSetWitnessPlugin)(
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
343
|
+
var CryptoNftCollectionWitnessPlugin = /* @__PURE__ */ __name(() => (0, import_payloadset_plugin.createPayloadSetWitnessPlugin)({
|
|
344
|
+
required: {
|
|
345
|
+
[import_crypto_nft_payload_plugin2.NftSchema]: 1
|
|
346
|
+
},
|
|
347
|
+
schema: import_payload_model.PayloadSetSchema
|
|
348
|
+
}, {
|
|
349
|
+
witness: /* @__PURE__ */ __name(async (params) => {
|
|
350
|
+
const result = await CryptoNftCollectionWitness.create(params);
|
|
351
|
+
return result;
|
|
352
|
+
}, "witness")
|
|
353
|
+
}), "CryptoNftCollectionWitnessPlugin");
|
|
302
354
|
// Annotate the CommonJS export names for ESM import in node:
|
|
303
355
|
0 && (module.exports = {
|
|
304
356
|
CryptoNftCollectionWitness,
|
package/dist/node/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts","../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts","../../src/lib/collectionMetrics/getNftCollectionMetrics.ts","../../src/lib/contractHasFunctions.ts","../../src/lib/getNftCollectionNfts.ts","../../src/lib/tokenTypes.ts","../../src/lib/tryCall.ts","../../src/Plugin.ts","../../src/Witness.ts"],"sourcesContent":["export * from './lib/index.js'\n// eslint-disable-next-line import/no-default-export\nexport { CryptoNftCollectionWitnessPlugin, CryptoNftCollectionWitnessPlugin as default } from './Plugin.js'\nexport * from './Witness.js'\n","import { Distribution } from './distribution.js'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n for (const item of array) {\n for (const property in item) {\n if (Object.prototype.hasOwnProperty.call(item, property)) {\n const value = item[property as keyof T]\n if (value !== undefined && value !== null) {\n const valueString = value.toString()\n if (!distribution[property]) {\n distribution[property] = { [valueString]: 1 }\n } else if (distribution[property]![valueString]) {\n ;(distribution[property] as Record<string, number>)[valueString] += 1\n } else {\n ;(distribution[property] as Record<string, number>)[valueString] = 1\n }\n }\n }\n }\n }\n\n return distribution\n}\n","import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin'\n\n/**\n * Calculates the parameters of a binomial distribution given the number of trials and success probability\n * @param n Number of trials\n * @param p Success probability\n * @returns The binomial distribution parameters\n */\nexport const calculateBinomialParamsFromProbability = (n: number, p: number): BinomialDistributionParameters => {\n // Mean (µ)\n const mean = n * p\n\n // Variance (σ^2)\n const variance = n * p * (1 - p)\n\n // Standard Deviation (σ)\n const stdDev = Math.sqrt(variance)\n\n return { mean, p, stdDev, variance }\n}\n","import { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib/index.js'\n\ntype TraitDistributionEntry = [string, { [key: string]: number }]\n\nexport const getNftCollectionMetrics = (nfts: NftInfoFields[]): NftCollectionMetrics => {\n const traits = nfts\n .map((nft) => nft?.metadata?.attributes as OpenSeaNftAttribute[] | undefined)\n .filter((v): v is OpenSeaNftAttribute[] => v !== undefined)\n .map((attributes) => {\n return Object.fromEntries(attributes.map((attribute) => [attribute.trait_type, attribute.value]))\n })\n const distribution = calculateAllPropertiesDistribution(traits)\n const n = nfts.length\n const attributes = Object.fromEntries(\n Object.entries(distribution)\n .filter((v): v is TraitDistributionEntry => v[1] !== undefined)\n .map(([trait, entries]) => {\n const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0)\n const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n)\n const values = Object.fromEntries(\n Object.entries(entries).map(([value, traitValueCount]) => {\n const { p } = calculateBinomialParamsFromProbability(n, traitValueCount / n)\n const metrics: NftTraitMetrics = { binomial: { p }, count: traitValueCount }\n return [value, metrics]\n }),\n )\n return [trait, { metrics: { binomial: { p }, count: traitCount }, values }]\n }),\n )\n return { metadata: { attributes } }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Interface, Provider } from 'ethers'\n\nexport const contractHasFunctions = async (provider: Provider, address: string, contractInterface: Interface, functionNames: string[]) => {\n try {\n const bytecode = await provider.getCode(address, 'latest')\n for (const functionName of functionNames) {\n const selector = assertEx(contractInterface.getFunction(functionName)?.selector, () => 'Function not found on interface')\n if (!bytecode.includes(selector.slice(2))) {\n return false\n }\n return true\n }\n return false\n } catch (ex) {\n const error = ex as Error\n console.log(error)\n return false\n }\n}\n","import { AxiosJson } from '@xylabs/axios'\nimport { exists } from '@xylabs/exists'\nimport { isHexZero } from '@xylabs/hex'\nimport { NftInfo, NftMetadata, NftSchema, TokenType, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\nimport { ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain-abstract'\nimport { Provider } from 'ethers'\n\nimport { tokenTypes } from './tokenTypes.js'\nimport { tryCall } from './tryCall.js'\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\nfunction range(size: number, startAt: number = 0): ReadonlyArray<number> {\n return [...Array(size).keys()].map((i) => i + startAt)\n}\n\nexport const getNftCollectionNfts = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: string,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: Provider,\n types?: TokenType[],\n /**\n * The maximum number of NFTs to return. Configurable to prevent\n * large wallets from exhausting Infura API credits. Ideally a\n * multiple of 100 as that appears to be the default page size.\n */\n maxNfts = 100,\n): Promise<NftInfo[]> => {\n try {\n const block = await provider.getBlockNumber()\n\n //Check if ERC-1967 Upgradeable\n const erc1967Status = await getErc1967SlotStatus(provider, contractAddress, block)\n\n //Check if ERC-1822 Upgradeable\n const erc1822Status = await getErc1822SlotStatus(provider, contractAddress, block)\n\n const implementation =\n !erc1967Status.slots.implementation || isHexZero(erc1967Status.slots.implementation) ?\n erc1822Status.implementation\n : erc1967Status.implementation\n\n const axios = new AxiosJson({ timeout: 2000 })\n const enumerable = ERC721Enumerable__factory.connect(implementation, provider)\n const storage = ERC721URIStorage__factory.connect(implementation, provider)\n const supply1155 = ERC1155Supply__factory.connect(implementation, provider)\n const finalTypes = types ?? (await tokenTypes(provider, implementation))\n\n const maxNftsArray = range(maxNfts)\n\n const result: NftInfo[] = (\n await Promise.all(\n maxNftsArray.map(async (_value, i) => {\n const tokenId = (await tryCall(async () => await enumerable.tokenByIndex(i, { blockTag: block }))) ?? BigInt(i)\n if (tokenId !== undefined) {\n const supply =\n finalTypes.includes(toTokenType('ERC1155')) ?\n ((await tryCall(async () => await supply1155['totalSupply(uint256)'](tokenId))) ?? '0x01')\n : '0x01'\n const metadataUri = await tryCall(async () => await storage.tokenURI(tokenId, { blockTag: block }))\n const checkedMetaDataUri = metadataUri ? checkIpfsUrl(metadataUri, ipfsGateway) : undefined\n let metadata: NftMetadata | undefined\n if (checkedMetaDataUri !== undefined) {\n try {\n metadata = (await axios.get(checkedMetaDataUri)).data\n } catch (ex) {\n const error = ex as Error\n console.error(`Get Metadata failed: ${error.message}`)\n }\n }\n\n const info: NftInfo = {\n address: contractAddress,\n chainId: Number((await provider.getNetwork()).chainId),\n metadata,\n metadataUri,\n schema: NftSchema,\n supply: `0x${supply.toString(16)}`,\n tokenId: `0x${tokenId.toString(16)}`,\n type: finalTypes.at(0),\n types: finalTypes,\n }\n if (implementation !== contractAddress) {\n info.implementation = implementation\n }\n return info\n }\n }),\n )\n ).filter(exists)\n return result\n } catch (ex) {\n const error = ex as Error\n console.error(`getNftCollectionNfts failed: [${error.name}] ${error.message}`)\n console.log(error.stack)\n return []\n }\n}\n","import { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { Provider } from 'ethers'\n\nimport { contractHasFunctions } from './contractHasFunctions.js'\n\nexport const isErc1155 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, ERC1155URIStorage__factory.createInterface(), ['uri'])\n}\n\nexport const isErc721 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, ERC721__factory.createInterface(), ['name', 'symbol', 'tokenURI'])\n}\n\nexport const tokenTypes = async (provider: Provider, address: string) => {\n const [erc721, erc1155] = await Promise.all([isErc721(provider, address), isErc1155(provider, address)])\n const result: TokenType[] = []\n if (erc721) {\n result.push('ERC721')\n }\n if (erc1155) {\n result.push('ERC1155')\n }\n return result\n}\n","export const tryCall = async <T>(func: () => Promise<T>, name?: string): Promise<T | undefined> => {\n try {\n return await func()\n } catch (ex) {\n if (name) {\n const error = ex as Error\n console.log(`tryCall failed [${name}]: ${error.message}`)\n }\n return undefined\n }\n}\n","import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetWitnessPlugin, PayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { CryptoNftCollectionWitness } from './Witness.js'\n\nexport const CryptoNftCollectionWitnessPlugin = (): PayloadSetWitnessPlugin<CryptoNftCollectionWitness> =>\n createPayloadSetWitnessPlugin<CryptoNftCollectionWitness>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await CryptoNftCollectionWitness.create(params)\n return result\n },\n },\n )\n","import { assertEx } from '@xylabs/assert'\nimport { EthAddress } from '@xylabs/eth-address'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionInfo,\n NftCollectionSchema,\n NftCollectionWitnessConfig,\n NftCollectionWitnessConfigSchema,\n NftCollectionWitnessQuery,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Schema } from '@xyo-network/payload-model'\nimport { AbstractEvmWitness, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\n\nimport { getNftCollectionMetrics, getNftCollectionNfts, tokenTypes } from './lib/index.js'\n\nexport type CryptoNftCollectionWitnessParams = EvmWitnessParams<NftCollectionWitnessConfig>\n\nconst defaultMaxNfts = 100\n\n/**\n * A \"no operation\" Promise to be used\n * when no action is desired but a Promise\n * is required to be returned\n */\nconst NoOp = Promise.resolve()\n\nfunction resolvedValue<T>(settled: PromiseSettledResult<T>, assert: true): T\nfunction resolvedValue<T>(settled: PromiseSettledResult<T>, assert?: false): T | undefined\nfunction resolvedValue<T>(settled: PromiseSettledResult<T>, assert?: boolean) {\n if (assert && settled.status === 'rejected') {\n throw settled.reason\n }\n return settled.status === 'fulfilled' ? settled.value : undefined\n}\n\nexport class CryptoNftCollectionWitness<\n TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams,\n> extends AbstractEvmWitness<TParams, NftCollectionWitnessQuery, NftCollectionInfo> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftCollectionWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftCollectionWitnessConfigSchema\n\n protected override async observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]> {\n await this.started('throw')\n await this.getProviders() //make sure cache clears\n const queries = payloads?.filter(isNftCollectionWitnessQuery) ?? []\n const observations = await Promise.all(\n queries.map<Promise<NftCollectionInfo>>(async (query) => {\n const chainId = assertEx(query?.chainId || this.config.chainId, () => 'params.chainId is required')\n const provider = await this.getProvider(true, true)\n const address = assertEx(\n EthAddress.parse(assertEx(query?.address || this.config.address, () => 'params.address is required')),\n () => 'Failed to parse params.address',\n ).toString()\n\n const erc721Enumerable = ERC721Enumerable__factory.connect(address, provider)\n\n const maxNfts = query?.maxNfts || defaultMaxNfts\n const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([\n erc721Enumerable.name(),\n erc721Enumerable.symbol(),\n erc721Enumerable.totalSupply(),\n tokenTypes(provider, address),\n this.archivistInstance(),\n ])\n const types = resolvedValue(typesSettled, true)\n const nfts = await getNftCollectionNfts(address, provider, types, maxNfts)\n const metrics = getNftCollectionMetrics(nfts)\n const archivist = resolvedValue(archivistSettled)\n const [sources] = await Promise.all([\n // Hash all the payloads\n Promise.all(nfts.map((nft) => PayloadBuilder.dataHash(nft))),\n // Insert them into the archivist if we have one\n archivist ? archivist.insert(nfts) : NoOp,\n ])\n const payload: NftCollectionInfo = {\n address,\n chainId,\n metrics,\n name: resolvedValue(name, true),\n schema: NftCollectionSchema,\n sources,\n symbol: resolvedValue(symbol, true),\n total: Number(resolvedValue(total, true)),\n type: types.at(0),\n types,\n }\n return payload\n }),\n )\n return observations.flat()\n }\n}\n"],"mappings":"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","names":["attributes","p","import_open_zeppelin_typechain","import_crypto_nft_payload_plugin","import_assert","import_open_zeppelin_typechain"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts","../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts","../../src/lib/collectionMetrics/getNftCollectionMetrics.ts","../../src/lib/contractHasFunctions.ts","../../src/lib/getNftCollectionNfts.ts","../../src/lib/tokenTypes.ts","../../src/lib/tryCall.ts","../../src/Plugin.ts","../../src/Witness.ts"],"sourcesContent":["export * from './lib/index.ts'\n// eslint-disable-next-line import/no-default-export\nexport { CryptoNftCollectionWitnessPlugin, CryptoNftCollectionWitnessPlugin as default } from './Plugin.ts'\nexport * from './Witness.ts'\n","import { Distribution } from './distribution.ts'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n for (const item of array) {\n for (const property in item) {\n if (Object.prototype.hasOwnProperty.call(item, property)) {\n const value = item[property as keyof T]\n if (value !== undefined && value !== null) {\n const valueString = value.toString()\n if (!distribution[property]) {\n distribution[property] = { [valueString]: 1 }\n } else if (distribution[property]![valueString]) {\n ;(distribution[property] as Record<string, number>)[valueString] += 1\n } else {\n ;(distribution[property] as Record<string, number>)[valueString] = 1\n }\n }\n }\n }\n }\n\n return distribution\n}\n","import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin'\n\n/**\n * Calculates the parameters of a binomial distribution given the number of trials and success probability\n * @param n Number of trials\n * @param p Success probability\n * @returns The binomial distribution parameters\n */\nexport const calculateBinomialParamsFromProbability = (n: number, p: number): BinomialDistributionParameters => {\n // Mean (µ)\n const mean = n * p\n\n // Variance (σ^2)\n const variance = n * p * (1 - p)\n\n // Standard Deviation (σ)\n const stdDev = Math.sqrt(variance)\n\n return { mean, p, stdDev, variance }\n}\n","import { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib/index.ts'\n\ntype TraitDistributionEntry = [string, { [key: string]: number }]\n\nexport const getNftCollectionMetrics = (nfts: NftInfoFields[]): NftCollectionMetrics => {\n const traits = nfts\n .map(nft => nft?.metadata?.attributes as OpenSeaNftAttribute[] | undefined)\n .filter((v): v is OpenSeaNftAttribute[] => v !== undefined)\n .map((attributes) => {\n return Object.fromEntries(attributes.map(attribute => [attribute.trait_type, attribute.value]))\n })\n const distribution = calculateAllPropertiesDistribution(traits)\n const n = nfts.length\n const attributes = Object.fromEntries(\n Object.entries(distribution)\n .filter((v): v is TraitDistributionEntry => v[1] !== undefined)\n .map(([trait, entries]) => {\n const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0)\n const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n)\n const values = Object.fromEntries(\n Object.entries(entries).map(([value, traitValueCount]) => {\n const { p } = calculateBinomialParamsFromProbability(n, traitValueCount / n)\n const metrics: NftTraitMetrics = { binomial: { p }, count: traitValueCount }\n return [value, metrics]\n }),\n )\n return [trait, { metrics: { binomial: { p }, count: traitCount }, values }]\n }),\n )\n return { metadata: { attributes } }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Interface, Provider } from 'ethers'\n\nexport const contractHasFunctions = async (provider: Provider, address: string, contractInterface: Interface, functionNames: string[]) => {\n try {\n const bytecode = await provider.getCode(address, 'latest')\n for (const functionName of functionNames) {\n const selector = assertEx(contractInterface.getFunction(functionName)?.selector, () => 'Function not found on interface')\n if (!bytecode.includes(selector.slice(2))) {\n return false\n }\n return true\n }\n return false\n } catch (ex) {\n const error = ex as Error\n console.log(error)\n return false\n }\n}\n","import { AxiosJson } from '@xylabs/axios'\nimport { exists } from '@xylabs/exists'\nimport { isHexZero } from '@xylabs/hex'\nimport { NftInfo, NftMetadata, NftSchema, TokenType, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\nimport { ERC721Enumerable__factory, ERC721URIStorage__factory, ERC1155Supply__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain-abstract'\nimport { Provider } from 'ethers'\n\nimport { tokenTypes } from './tokenTypes.ts'\nimport { tryCall } from './tryCall.ts'\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\nfunction range(size: number, startAt: number = 0): ReadonlyArray<number> {\n return [...Array(size).keys()].map(i => i + startAt)\n}\n\nexport const getNftCollectionNfts = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: string,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: Provider,\n types?: TokenType[],\n /**\n * The maximum number of NFTs to return. Configurable to prevent\n * large wallets from exhausting Infura API credits. Ideally a\n * multiple of 100 as that appears to be the default page size.\n */\n maxNfts = 100,\n): Promise<NftInfo[]> => {\n try {\n const block = await provider.getBlockNumber()\n\n // Check if ERC-1967 Upgradeable\n const erc1967Status = await getErc1967SlotStatus(provider, contractAddress, block)\n\n // Check if ERC-1822 Upgradeable\n const erc1822Status = await getErc1822SlotStatus(provider, contractAddress, block)\n\n const implementation\n = !erc1967Status.slots.implementation || isHexZero(erc1967Status.slots.implementation)\n ? erc1822Status.implementation\n : erc1967Status.implementation\n\n const axios = new AxiosJson({ timeout: 2000 })\n const enumerable = ERC721Enumerable__factory.connect(implementation, provider)\n const storage = ERC721URIStorage__factory.connect(implementation, provider)\n const supply1155 = ERC1155Supply__factory.connect(implementation, provider)\n const finalTypes = types ?? (await tokenTypes(provider, implementation))\n\n const maxNftsArray = range(maxNfts)\n\n const result: NftInfo[] = (\n await Promise.all(\n maxNftsArray.map(async (_value, i) => {\n const tokenId = (await tryCall(async () => await enumerable.tokenByIndex(i, { blockTag: block }))) ?? BigInt(i)\n if (tokenId !== undefined) {\n const supply\n = finalTypes.includes(toTokenType('ERC1155'))\n ? ((await tryCall(async () => await supply1155['totalSupply(uint256)'](tokenId))) ?? '0x01')\n : '0x01'\n const metadataUri = await tryCall(async () => await storage.tokenURI(tokenId, { blockTag: block }))\n const checkedMetaDataUri = metadataUri ? checkIpfsUrl(metadataUri, ipfsGateway) : undefined\n let metadata: NftMetadata | undefined\n if (checkedMetaDataUri !== undefined) {\n try {\n metadata = (await axios.get(checkedMetaDataUri)).data\n } catch (ex) {\n const error = ex as Error\n console.error(`Get Metadata failed: ${error.message}`)\n }\n }\n\n const info: NftInfo = {\n address: contractAddress,\n chainId: Number((await provider.getNetwork()).chainId),\n metadata,\n metadataUri,\n schema: NftSchema,\n supply: `0x${supply.toString(16)}`,\n tokenId: `0x${tokenId.toString(16)}`,\n type: finalTypes.at(0),\n types: finalTypes,\n }\n if (implementation !== contractAddress) {\n info.implementation = implementation\n }\n return info\n }\n }),\n )\n ).filter(exists)\n return result\n } catch (ex) {\n const error = ex as Error\n console.error(`getNftCollectionNfts failed: [${error.name}] ${error.message}`)\n console.log(error.stack)\n return []\n }\n}\n","import { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { Provider } from 'ethers'\n\nimport { contractHasFunctions } from './contractHasFunctions.ts'\n\nexport const isErc1155 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, ERC1155URIStorage__factory.createInterface(), ['uri'])\n}\n\nexport const isErc721 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, ERC721__factory.createInterface(), ['name', 'symbol', 'tokenURI'])\n}\n\nexport const tokenTypes = async (provider: Provider, address: string) => {\n const [erc721, erc1155] = await Promise.all([isErc721(provider, address), isErc1155(provider, address)])\n const result: TokenType[] = []\n if (erc721) {\n result.push('ERC721')\n }\n if (erc1155) {\n result.push('ERC1155')\n }\n return result\n}\n","export const tryCall = async <T>(func: () => Promise<T>, name?: string): Promise<T | undefined> => {\n try {\n return await func()\n } catch (ex) {\n if (name) {\n const error = ex as Error\n console.log(`tryCall failed [${name}]: ${error.message}`)\n }\n return undefined\n }\n}\n","import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetWitnessPlugin, PayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { CryptoNftCollectionWitness } from './Witness.ts'\n\nexport const CryptoNftCollectionWitnessPlugin = (): PayloadSetWitnessPlugin<CryptoNftCollectionWitness> =>\n createPayloadSetWitnessPlugin<CryptoNftCollectionWitness>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await CryptoNftCollectionWitness.create(params)\n return result\n },\n },\n )\n","import { assertEx } from '@xylabs/assert'\nimport { EthAddress } from '@xylabs/eth-address'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionInfo,\n NftCollectionSchema,\n NftCollectionWitnessConfig,\n NftCollectionWitnessConfigSchema,\n NftCollectionWitnessQuery,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { ERC721Enumerable__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Schema } from '@xyo-network/payload-model'\nimport { AbstractEvmWitness, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\n\nimport { getNftCollectionMetrics, getNftCollectionNfts, tokenTypes } from './lib/index.ts'\n\nexport type CryptoNftCollectionWitnessParams = EvmWitnessParams<NftCollectionWitnessConfig>\n\nconst defaultMaxNfts = 100\n\n/**\n * A \"no operation\" Promise to be used\n * when no action is desired but a Promise\n * is required to be returned\n */\nconst NoOp = Promise.resolve()\n\nfunction resolvedValue<T>(settled: PromiseSettledResult<T>, assert: true): T\nfunction resolvedValue<T>(settled: PromiseSettledResult<T>, assert?: false): T | undefined\nfunction resolvedValue<T>(settled: PromiseSettledResult<T>, assert?: boolean) {\n if (assert && settled.status === 'rejected') {\n throw settled.reason\n }\n return settled.status === 'fulfilled' ? settled.value : undefined\n}\n\nexport class CryptoNftCollectionWitness<\n TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams,\n> extends AbstractEvmWitness<TParams, NftCollectionWitnessQuery, NftCollectionInfo> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftCollectionWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftCollectionWitnessConfigSchema\n\n protected override async observeHandler(payloads?: NftCollectionWitnessQuery[]): Promise<NftCollectionInfo[]> {\n await this.started('throw')\n await this.getProviders() // make sure cache clears\n const queries = payloads?.filter(isNftCollectionWitnessQuery) ?? []\n const observations = await Promise.all(\n queries.map<Promise<NftCollectionInfo>>(async (query) => {\n const chainId = assertEx(query?.chainId || this.config.chainId, () => 'params.chainId is required')\n const provider = await this.getProvider(true, true)\n const address = assertEx(\n EthAddress.parse(assertEx(query?.address || this.config.address, () => 'params.address is required')),\n () => 'Failed to parse params.address',\n ).toString()\n\n const erc721Enumerable = ERC721Enumerable__factory.connect(address, provider)\n\n const maxNfts = query?.maxNfts || defaultMaxNfts\n const [name, symbol, total, typesSettled, archivistSettled] = await Promise.allSettled([\n erc721Enumerable.name(),\n erc721Enumerable.symbol(),\n erc721Enumerable.totalSupply(),\n tokenTypes(provider, address),\n this.archivistInstance(),\n ])\n const types = resolvedValue(typesSettled, true)\n const nfts = await getNftCollectionNfts(address, provider, types, maxNfts)\n const metrics = getNftCollectionMetrics(nfts)\n const archivist = resolvedValue(archivistSettled)\n const [sources] = await Promise.all([\n // Hash all the payloads\n Promise.all(nfts.map(nft => PayloadBuilder.dataHash(nft))),\n // Insert them into the archivist if we have one\n archivist ? archivist.insert(nfts) : NoOp,\n ])\n const payload: NftCollectionInfo = {\n address,\n chainId,\n metrics,\n name: resolvedValue(name, true),\n schema: NftCollectionSchema,\n sources,\n symbol: resolvedValue(symbol, true),\n total: Number(resolvedValue(total, true)),\n type: types.at(0),\n types,\n }\n return payload\n }),\n )\n return observations.flat()\n }\n}\n"],"mappings":"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","names":["calculateAllPropertiesDistribution","array","distribution","item","property","Object","prototype","hasOwnProperty","call","value","undefined","valueString","toString","calculateBinomialParamsFromProbability","n","p","mean","variance","stdDev","Math","sqrt","getNftCollectionMetrics","nfts","traits","map","nft","metadata","attributes","filter","v","undefined","Object","fromEntries","attribute","trait_type","value","distribution","calculateAllPropertiesDistribution","n","length","entries","trait","traitCount","values","reduce","prev","curr","p","calculateBinomialParamsFromProbability","traitValueCount","metrics","binomial","count","contractHasFunctions","provider","address","contractInterface","functionNames","bytecode","getCode","functionName","selector","assertEx","getFunction","includes","slice","ex","error","console","log","import_open_zeppelin_typechain","isErc1155","provider","address","contractHasFunctions","ERC1155URIStorage__factory","createInterface","isErc721","ERC721__factory","tokenTypes","erc721","erc1155","Promise","all","result","push","tryCall","func","name","ex","error","console","log","message","undefined","ipfsGateway","range","size","startAt","Array","keys","map","i","getNftCollectionNfts","contractAddress","provider","types","maxNfts","block","getBlockNumber","erc1967Status","getErc1967SlotStatus","erc1822Status","getErc1822SlotStatus","implementation","slots","isHexZero","axios","AxiosJson","timeout","enumerable","ERC721Enumerable__factory","connect","storage","ERC721URIStorage__factory","supply1155","ERC1155Supply__factory","finalTypes","tokenTypes","maxNftsArray","result","Promise","all","_value","tokenId","tryCall","tokenByIndex","blockTag","BigInt","undefined","supply","includes","toTokenType","metadataUri","tokenURI","checkedMetaDataUri","checkIpfsUrl","metadata","get","data","ex","error","console","message","info","address","chainId","Number","getNetwork","schema","NftSchema","toString","type","at","filter","exists","name","log","stack","import_crypto_nft_payload_plugin","import_assert","import_open_zeppelin_typechain","defaultMaxNfts","NoOp","Promise","resolve","resolvedValue","settled","assert","status","reason","value","undefined","CryptoNftCollectionWitness","AbstractEvmWitness","observeHandler","payloads","started","getProviders","queries","filter","isNftCollectionWitnessQuery","observations","all","map","query","chainId","assertEx","config","provider","getProvider","address","EthAddress","parse","toString","erc721Enumerable","ERC721Enumerable__factory","connect","maxNfts","name","symbol","total","typesSettled","archivistSettled","allSettled","totalSupply","tokenTypes","archivistInstance","types","nfts","getNftCollectionNfts","metrics","getNftCollectionMetrics","archivist","sources","nft","PayloadBuilder","dataHash","insert","payload","schema","NftCollectionSchema","Number","type","at","flat","configSchemas","NftCollectionWitnessConfigSchema","defaultConfigSchema","CryptoNftCollectionWitnessPlugin","createPayloadSetWitnessPlugin","required","NftSchema","schema","PayloadSetSchema","witness","params","result","CryptoNftCollectionWitness","create"]}
|
package/dist/node/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from './lib/index.
|
|
2
|
-
export { CryptoNftCollectionWitnessPlugin, CryptoNftCollectionWitnessPlugin as default } from './Plugin.
|
|
3
|
-
export * from './Witness.
|
|
1
|
+
export * from './lib/index.ts';
|
|
2
|
+
export { CryptoNftCollectionWitnessPlugin, CryptoNftCollectionWitnessPlugin as default } from './Plugin.ts';
|
|
3
|
+
export * from './Witness.ts';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/node/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from './lib/index.
|
|
2
|
-
export { CryptoNftCollectionWitnessPlugin, CryptoNftCollectionWitnessPlugin as default } from './Plugin.
|
|
3
|
-
export * from './Witness.
|
|
1
|
+
export * from './lib/index.ts';
|
|
2
|
+
export { CryptoNftCollectionWitnessPlugin, CryptoNftCollectionWitnessPlugin as default } from './Plugin.ts';
|
|
3
|
+
export * from './Witness.ts';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/node/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from './lib/index.
|
|
2
|
-
export { CryptoNftCollectionWitnessPlugin, CryptoNftCollectionWitnessPlugin as default } from './Plugin.
|
|
3
|
-
export * from './Witness.
|
|
1
|
+
export * from './lib/index.ts';
|
|
2
|
+
export { CryptoNftCollectionWitnessPlugin, CryptoNftCollectionWitnessPlugin as default } from './Plugin.ts';
|
|
3
|
+
export * from './Witness.ts';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|