emblem-vault-sdk 1.4.1 → 1.4.3

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/index.js CHANGED
@@ -1,4 +1,27 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
26
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
27
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -9,9 +32,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
32
  });
10
33
  };
11
34
  Object.defineProperty(exports, "__esModule", { value: true });
35
+ const utils_1 = require("./utils");
36
+ const SDK_VERSION = '1.4.2';
12
37
  class EmblemVaultSDK {
13
38
  constructor(apiKey, baseUrl) {
14
39
  this.apiKey = apiKey;
40
+ console.log('EmblemVaultSDK version:', SDK_VERSION);
15
41
  if (!apiKey) {
16
42
  throw new Error('API key is required');
17
43
  }
@@ -21,28 +47,93 @@ class EmblemVaultSDK {
21
47
  generateUploadUrl() {
22
48
  // Implementation goes here
23
49
  }
24
- fetchCuratedContracts(sortByName) {
50
+ // ** Asset Metadata **
51
+ //
52
+ getAssetMetadata(projectName, strict = false) {
53
+ (0, utils_1.genericGuard)(projectName, "string", "projectName");
54
+ const NFT_DATA_ARR = (0, utils_1.metadataObj2Arr)(utils_1.NFT_DATA);
55
+ let filtered = strict ?
56
+ NFT_DATA_ARR.filter(item => item.projectName === projectName) :
57
+ NFT_DATA_ARR.filter(item => item.projectName.toLowerCase() === projectName.toLowerCase());
58
+ return filtered;
59
+ }
60
+ getAllProjects() {
61
+ const NFT_DATA_ARR = (0, utils_1.metadataObj2Arr)(utils_1.NFT_DATA);
62
+ const projects = (0, utils_1.metadataAllProjects)(NFT_DATA_ARR);
63
+ return projects;
64
+ }
65
+ // ** Curated **
66
+ //
67
+ fetchCuratedContractsz(hideUnMintable = false, overrideFunc = false) {
25
68
  return __awaiter(this, void 0, void 0, function* () {
26
69
  let url = `${this.baseUrl}/curated`;
27
- if (sortByName) {
28
- url += '?sort=name';
29
- }
30
- if (typeof window !== 'undefined' && typeof window.fetch === 'function') {
31
- // Client-side (Browser)
32
- const response = yield fetch(url, {
33
- headers: { 'x-api-key': this.apiKey }
70
+ // Fetch using URL or override function
71
+ let data = typeof overrideFunc === 'function' ? yield overrideFunc() : yield (0, utils_1.fetchData)(url, this.apiKey);
72
+ // Filter out collections that are not mintable
73
+ data = hideUnMintable ? data.filter((collection) => collection.mintable) : data;
74
+ // Sort the data by the name property in ascending order
75
+ data = data.sort((a, b) => a.name.localeCompare(b.name))
76
+ // Map over the sorted data and generate a template for each item
77
+ .map((item) => {
78
+ const template = (0, utils_1.generateTemplate)(item);
79
+ Object.keys(template).forEach(key => {
80
+ if (key != 'id' && key != 'created_at' && key != 'contracts' && key != 'imageHandler' && key != 'placeholderImages' && key != 'loadingImages')
81
+ item[key] = template[key];
34
82
  });
35
- const data = yield response.json();
36
- return sortByName ? data.sort((a, b) => a.name.localeCompare(b.name)) : data;
83
+ // Return a new object that combines the properties of the item and the template
84
+ // return { ...item, ...template };
85
+ return item;
86
+ });
87
+ return data;
88
+ });
89
+ }
90
+ createCuratedVault(template) {
91
+ return __awaiter(this, void 0, void 0, function* () {
92
+ (0, utils_1.templateGuard)(template);
93
+ let url = `${this.baseUrl}/create-curated`;
94
+ let vaultCreationResponse = yield (0, utils_1.fetchData)(url, this.apiKey, 'POST', template);
95
+ return vaultCreationResponse.data;
96
+ });
97
+ }
98
+ fetchMetadata(tokenId) {
99
+ return __awaiter(this, void 0, void 0, function* () {
100
+ (0, utils_1.genericGuard)(tokenId, "string", "tokenId");
101
+ let url = `${this.baseUrl}/meta/${tokenId}`;
102
+ let metadata = yield (0, utils_1.fetchData)(url, this.apiKey);
103
+ return metadata;
104
+ });
105
+ }
106
+ fetchVaultsOfType(vaultType, address) {
107
+ return __awaiter(this, void 0, void 0, function* () {
108
+ (0, utils_1.genericGuard)(vaultType, "string", "vaultType");
109
+ (0, utils_1.genericGuard)(address, "string", "address");
110
+ let url = `${this.baseUrl}/myvaults/${address}?vaultType=${vaultType}`;
111
+ let vaults = yield (0, utils_1.fetchData)(url, this.apiKey);
112
+ return vaults;
113
+ });
114
+ }
115
+ // ** Web3 **
116
+ //
117
+ // Function to load web3 dynamically and attach it to the window object
118
+ loadWeb3() {
119
+ return __awaiter(this, void 0, void 0, function* () {
120
+ try {
121
+ // Dynamically import the Web3 module
122
+ const { default: Web3 } = yield Promise.resolve().then(() => __importStar(require('web3')));
123
+ // Check if MetaMask (window.ethereum) is available
124
+ if (window.ethereum) {
125
+ // Initialize Web3 with MetaMask's provider
126
+ const web3 = new Web3(window.ethereum);
127
+ // Attach Web3 to the window object
128
+ window.web3 = web3;
129
+ return web3;
130
+ }
131
+ else {
132
+ console.error('MetaMask is not installed!');
133
+ }
37
134
  }
38
- else {
39
- // Server-side (Node.js)
40
- const fetch = require('node-fetch');
41
- const response = yield fetch(url, {
42
- headers: { 'x-api-key': this.apiKey }
43
- });
44
- const data = yield response.json();
45
- return sortByName ? data.sort((a, b) => a.name.localeCompare(b.name)) : data;
135
+ catch (error) {
136
+ console.error('Error loading Web3 or connecting to MetaMask', error);
46
137
  }
47
138
  });
48
139
  }
package/dist/utils.js ADDED
@@ -0,0 +1,514 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.COIN_TO_NETWORK = exports.genericGuard = exports.templateGuard = exports.generateTemplate = exports.generateImageTemplate = exports.generateAttributeTemplate = exports.fetchData = exports.metadataAllProjects = exports.metadataObj2Arr = exports.evaluateFacts = exports.pad = exports.NFT_DATA = void 0;
16
+ const metadata_json_1 = __importDefault(require("./curated/metadata.json"));
17
+ exports.NFT_DATA = metadata_json_1.default;
18
+ const pad = (num, size) => {
19
+ if (!num)
20
+ return null;
21
+ num = num.toString();
22
+ while (num.length < size)
23
+ num = "0" + num;
24
+ return num;
25
+ };
26
+ exports.pad = pad;
27
+ const evaluateFacts = (allowed, facts, msgCallback) => {
28
+ let reasons = [];
29
+ allowed = facts.every(fact => {
30
+ if (!fact.eval) {
31
+ reasons.push(fact.msg);
32
+ }
33
+ return fact.eval;
34
+ });
35
+ if (reasons.length > 0 && msgCallback) {
36
+ msgCallback(reasons.join(' '));
37
+ }
38
+ return allowed;
39
+ };
40
+ exports.evaluateFacts = evaluateFacts;
41
+ const metadataObj2Arr = (data) => Object.keys(data).map(key => (Object.assign(Object.assign({}, data[key]), { assetName: key })));
42
+ exports.metadataObj2Arr = metadataObj2Arr;
43
+ const metadataAllProjects = (projects) => projects.reduce((unique, item) => {
44
+ if (!unique.includes(item.projectName)) {
45
+ unique.push(item.projectName);
46
+ }
47
+ return unique;
48
+ }, []);
49
+ exports.metadataAllProjects = metadataAllProjects;
50
+ const fetchData = (url, apiKey, method = 'GET', body = null) => __awaiter(void 0, void 0, void 0, function* () {
51
+ const fetch = typeof window !== 'undefined' && typeof window.fetch === 'function' ? window.fetch : require('node-fetch');
52
+ const options = {
53
+ method: method,
54
+ headers: { 'x-api-key': apiKey },
55
+ };
56
+ if (method === 'POST' && body) {
57
+ options.body = JSON.stringify(body);
58
+ options.headers['Content-Type'] = 'application/json';
59
+ }
60
+ const response = yield fetch(url, options);
61
+ return yield response.json();
62
+ });
63
+ exports.fetchData = fetchData;
64
+ function generateAttributeTemplate(record) {
65
+ let template = [];
66
+ if (record.name == "Rare Pepe" ||
67
+ record.name == "Fake Rares" ||
68
+ record.name == "Dank Rares" ||
69
+ record.name == "Fake Commons" ||
70
+ record.name == "Age of Rust" ||
71
+ record.name == "Age of Chains" ||
72
+ record.name == "Bitcorn Crops" ||
73
+ record.name == "Bitgirls" ||
74
+ record.name == "Force of Will" ||
75
+ record.name == "Memorychain" ||
76
+ record.name == "Oasis Mining" ||
77
+ record.name == "Sarutobi Island") {
78
+ template = [
79
+ {
80
+ "trait_type": "Series",
81
+ "value": (metadata) => {
82
+ var _a, _b;
83
+ return (_b = (0, exports.pad)((_a = exports.NFT_DATA[metadata.targetAsset.name]) === null || _a === void 0 ? void 0 : _a.series, 2)) === null || _b === void 0 ? void 0 : _b.toString();
84
+ }
85
+ },
86
+ {
87
+ "trait_type": "Card",
88
+ "value": (metadata) => {
89
+ var _a, _b;
90
+ return (_b = (0, exports.pad)((_a = exports.NFT_DATA[metadata.targetAsset.name]) === null || _a === void 0 ? void 0 : _a.order, 2)) === null || _b === void 0 ? void 0 : _b.toString();
91
+ }
92
+ },
93
+ {
94
+ "trait_type": "Total Supply",
95
+ "value": (metadata) => {
96
+ var _a, _b, _c, _d;
97
+ return (_d = (0, exports.pad)(((_a = exports.NFT_DATA[metadata.targetAsset.name]) === null || _a === void 0 ? void 0 : _a.remaining) || ((_c = (_b = exports.NFT_DATA[metadata.targetAsset.name]) === null || _b === void 0 ? void 0 : _b.raw) === null || _c === void 0 ? void 0 : _c.supply), 2)) === null || _d === void 0 ? void 0 : _d.toString();
98
+ }
99
+ },
100
+ {
101
+ "trait_type": "Artist",
102
+ "value": (metadata) => {
103
+ var _a, _b, _c;
104
+ return (_c = (0, exports.pad)((_b = (_a = exports.NFT_DATA[metadata.targetAsset.name]) === null || _a === void 0 ? void 0 : _a.raw) === null || _b === void 0 ? void 0 : _b.artist.name, 2)) === null || _c === void 0 ? void 0 : _c.toString();
105
+ }
106
+ }
107
+ ];
108
+ if (record.name == "Rare Pepe") {
109
+ template.push({
110
+ "trait_type": "Year",
111
+ "value": (metadata) => {
112
+ return (exports.NFT_DATA[metadata.targetAsset.name].series < 10 ? '2016' :
113
+ exports.NFT_DATA[metadata.targetAsset.name].series > 9 &&
114
+ exports.NFT_DATA[metadata.targetAsset.name].series < 31 ? '2017' :
115
+ '2018');
116
+ }
117
+ });
118
+ }
119
+ }
120
+ else if (record.name == "Cursed Ordinal") {
121
+ template = [
122
+ {
123
+ "trait_type": "Content Type",
124
+ "value": (metadata) => {
125
+ return metadata.values[0].content_type;
126
+ }
127
+ },
128
+ {
129
+ "trait_type": "Ordinal Number",
130
+ "value": (metadata) => {
131
+ return metadata.values[0].name.includes("Cursed Ordinal") ? metadata.values[0].name.replace('Cursed Ordinal', '').trim() : false;
132
+ }
133
+ },
134
+ {
135
+ "trait_type": "Collection",
136
+ "value": (metadata) => {
137
+ return metadata.values[0].name.includes("Cursed Ordinal") ? false : `All:${metadata.values[0].project}`;
138
+ }
139
+ },
140
+ {
141
+ "trait_type": "Artist",
142
+ "value": (metadata) => {
143
+ let foundArtistTrait = metadata.values.length > 0 && metadata.values[0].traits ? metadata.values[0].traits.filter((item) => { return item.trait_type === "artist"; }) : [];
144
+ return foundArtistTrait.length > 0 ? foundArtistTrait[0].value : false;
145
+ }
146
+ }
147
+ ];
148
+ }
149
+ else if (record.name == "Ethscription") {
150
+ template = [
151
+ {
152
+ "trait_type": "Collection",
153
+ "value": (metadata) => {
154
+ return metadata.values[0].project ? `${metadata.values[0].project}` : false;
155
+ }
156
+ },
157
+ {
158
+ "trait_type": "Ethscriptions",
159
+ "value": (metadata) => {
160
+ let foundTrait = metadata.values && metadata.values.length > 0 && metadata.values[0].traits && metadata.values[0].traits.length > 0 && metadata.values[0].traits.filter((item) => { return item.trait_type == "Ethscriptions"; }).length > 0 ? metadata.values[0].traits.filter((item) => { return item.trait_type == "Ethscriptions"; })[0].value : false;
161
+ return foundTrait;
162
+ }
163
+ }
164
+ ];
165
+ }
166
+ else if (record.name == "EmblemOpen") {
167
+ template = [
168
+ {
169
+ "trait_type": "Contains",
170
+ "value": (balanceItem) => {
171
+ return balanceItem.coin;
172
+ },
173
+ "type": "loop",
174
+ "key": "values"
175
+ }
176
+ ];
177
+ }
178
+ return template;
179
+ }
180
+ exports.generateAttributeTemplate = generateAttributeTemplate;
181
+ function generateImageTemplate(record) {
182
+ let template = {};
183
+ if (record.imageHandler) {
184
+ template.image = (data) => {
185
+ return `${record.image}`;
186
+ };
187
+ }
188
+ if (record.loadingImages) {
189
+ template.loading = () => {
190
+ let images = record.loadingImages;
191
+ return images[Math.floor(Math.random() * images.length)]; // Random image
192
+ };
193
+ }
194
+ if (record.placeholderImages) {
195
+ template.placeholder = () => {
196
+ let images = record.placeholderImages;
197
+ return images[Math.floor(Math.random() * images.length)]; // Random image
198
+ };
199
+ }
200
+ return template;
201
+ }
202
+ exports.generateImageTemplate = generateImageTemplate;
203
+ function generateTemplate(record) {
204
+ let addressChain = record.addressChain;
205
+ let attributes = generateAttributeTemplate(record);
206
+ let imageMethods = generateImageTemplate(record);
207
+ let recordName = record.name;
208
+ let balanceQty = record.balanceQty;
209
+ let template = {
210
+ attributes,
211
+ allowed: (data, _this, msgCallback = null) => {
212
+ var _a;
213
+ let allowed = false;
214
+ if (recordName == "Cursed Ordinal") {
215
+ allowed = data ? data[0].content_type != "application/json" : false;
216
+ }
217
+ else if (recordName == "Ethscription") {
218
+ allowed = data ? true : false;
219
+ }
220
+ else if (recordName == "$OXBT" || recordName == "$ORDI") {
221
+ if (data[0].balance == balanceQty) {
222
+ msgCallback ? msgCallback("") : null;
223
+ allowed = true;
224
+ }
225
+ else if (data[0].balance != balanceQty && msgCallback) {
226
+ msgCallback ? msgCallback(`Load vault with exactly ${balanceQty} ${recordName}`) : null;
227
+ allowed = false;
228
+ }
229
+ }
230
+ else if (recordName == "Counterparty") {
231
+ let facts = [
232
+ { eval: record.nativeAssets.includes((_a = data[0]) === null || _a === void 0 ? void 0 : _a.coin), msg: `Vaults should only contain assets native to ${recordName}` },
233
+ { eval: data.length == 1, msg: `Vaults should only contain a single item` }
234
+ ];
235
+ allowed = (0, exports.evaluateFacts)(allowed, facts, msgCallback);
236
+ }
237
+ else if (recordName == "Stamps") {
238
+ allowed = record.nativeAssets.includes(data[0].coin) && (recordName.toLowerCase() == data[0].project.toLowerCase() || data[0].project.toLowerCase() == "stampunks");
239
+ }
240
+ else if (recordName == "EmblemOpen") {
241
+ allowed = data ? true : false;
242
+ }
243
+ else if (recordName == "Bells") {
244
+ allowed = data[0].name == "Bel" && data[0].balance > 0 && Number.isInteger(data[0].balance);
245
+ }
246
+ else if (recordName == "Namecoin") {
247
+ allowed = data && record.nativeAssets.includes(data[0].coin) ? true : false;
248
+ }
249
+ else { // XCP
250
+ allowed = data[0].project == _this.name && data[0].balance == 1;
251
+ }
252
+ return allowed;
253
+ },
254
+ allowedName: (asset, msgCallback = null) => {
255
+ let allowedName = false;
256
+ if (recordName == "Cursed Ordinal") {
257
+ let pieces = asset.split(' ');
258
+ allowedName = asset.includes(recordName) && pieces.length === 3 && Number(pieces.reverse()[0]) < 0;
259
+ }
260
+ else if (recordName == "Ethscription") {
261
+ if (asset) {
262
+ allowedName = true;
263
+ }
264
+ }
265
+ else if (recordName == "$OXBT" || recordName == "$ORDI") {
266
+ if (asset == `${balanceQty} ${recordName}`) {
267
+ allowedName = true;
268
+ }
269
+ else {
270
+ msgCallback ? msgCallback("Incorrect Asset Or Qty In Vault") : null;
271
+ allowedName = false;
272
+ }
273
+ }
274
+ else if (recordName == "Counterparty") {
275
+ allowedName = asset ? true : false;
276
+ }
277
+ else if (recordName == "Stamps") {
278
+ allowedName = asset && asset.toLowerCase().includes("stamp") ? true : false;
279
+ }
280
+ else if (recordName == "EmblemOpen") {
281
+ allowedName = asset ? true : false;
282
+ }
283
+ else if (recordName == "Bells") {
284
+ allowedName = asset == "Bel" ? true : false;
285
+ }
286
+ else if (recordName == "Namecoin") {
287
+ allowedName = asset ? true : false;
288
+ }
289
+ else { // XCP
290
+ let curatedItemFound = exports.NFT_DATA[asset];
291
+ allowedName = asset && curatedItemFound ? true : false;
292
+ }
293
+ return allowedName;
294
+ },
295
+ allowedJump: (ownership_balances, _this) => {
296
+ let hasAnyBalance = ownership_balances && ownership_balances.status != "claimed";
297
+ let allowedJump = false;
298
+ if (hasAnyBalance && recordName != "Rinkeby") {
299
+ let filteredBalances = _this.filterNativeBalances(ownership_balances, _this);
300
+ // single
301
+ if (filteredBalances.length == 1) {
302
+ allowedJump = _this.allowed(filteredBalances, _this);
303
+ }
304
+ else {
305
+ allowedJump = false;
306
+ }
307
+ }
308
+ return allowedJump;
309
+ },
310
+ allowedNetwork: (fromNetwork, toNetwork, msgCallback = null) => {
311
+ return fromNetwork == toNetwork; // don't allow cross chain
312
+ },
313
+ filterNativeBalances: (balance, _this) => {
314
+ let filtered = balance.balances.filter((item) => !_this.nativeAssets.includes(item.name));
315
+ return filtered;
316
+ },
317
+ address: (addresses) => {
318
+ return addresses.filter(item => { return item.coin === addressChain; })[0].address;
319
+ },
320
+ addresses: (addresses, _this) => {
321
+ return _this.nativeAssets.includes("*") ? addresses : addresses.filter(item => { return item.coin === addressChain; });
322
+ },
323
+ balanceExplorer(address) {
324
+ return `https://xchain.io/address/${address}`;
325
+ },
326
+ generateVaultBody: (metadata, balance, _this, msgCallback) => {
327
+ let nameAndImage = { name: metadata.targetAsset.name, image: metadata.targetAsset.image || _this.loading() };
328
+ let filtered = balance && balance.length > 0 && _this.filterNativeBalances ? _this.filterNativeBalances({ balances: balance }, _this) : balance;
329
+ let externalUrl = false;
330
+ if (_this.autoLoad && balance && balance.length > 0) { // Is auto load and has a balance
331
+ if (filtered && filtered.length > 0) {
332
+ nameAndImage.name = filtered[0].name;
333
+ nameAndImage.assetName = filtered[0].name;
334
+ nameAndImage.image = filtered[0].image ? filtered[0].image : nameAndImage.image;
335
+ externalUrl = filtered[0].external_url ? filtered[0].external_url : externalUrl;
336
+ // can I over write balance here?
337
+ }
338
+ else {
339
+ nameAndImage.name = balance[0].name;
340
+ nameAndImage.assetName = balance[0].name;
341
+ nameAndImage.image = balance[0].image ? balance[0].image : nameAndImage.image;
342
+ externalUrl = balance[0].external_url ? balance[0].external_url : externalUrl;
343
+ }
344
+ if (filtered && filtered[0].balance && (filtered[0].type != "nft" || filtered[0].balance > 1)) {
345
+ nameAndImage.name = filtered[0].balance.toString().split('.')[0] + ' ' + nameAndImage.name;
346
+ }
347
+ else if (balance && balance[0].balance && (balance[0].type != "nft" || balance[0].balance > 1) && filtered[0].balance < 1) {
348
+ nameAndImage.name = balance[0].balance.toString().split('.')[0] + ' ' + nameAndImage.name;
349
+ }
350
+ }
351
+ else if (!_this.autoLoad) {
352
+ // not sure yet
353
+ if (balance && balance.length > 0) {
354
+ nameAndImage.name = balance[0].name;
355
+ nameAndImage.assetName = balance[0].name;
356
+ nameAndImage.image = balance[0].image ? balance[0].image : nameAndImage.image;
357
+ externalUrl = balance[0].external_url ? balance[0].external_url : externalUrl;
358
+ }
359
+ }
360
+ // handle xcp image urls
361
+ let assetInformation = exports.NFT_DATA[nameAndImage.name] ? exports.NFT_DATA[nameAndImage.name] : false;
362
+ if (assetInformation) {
363
+ if (assetInformation.image) {
364
+ nameAndImage.image = assetInformation.image;
365
+ }
366
+ if (assetInformation.series) {
367
+ nameAndImage.name += ' | Series ' + assetInformation.series;
368
+ }
369
+ if (assetInformation.order) {
370
+ nameAndImage.name += ' Card ' + assetInformation.order;
371
+ }
372
+ if (assetInformation.video) {
373
+ nameAndImage.animation_url = assetInformation.video;
374
+ }
375
+ }
376
+ if (nameAndImage.image.includes("STAMP:")) {
377
+ nameAndImage.image = nameAndImage.image.replace("STAMP:", 'data:image/png:base64,');
378
+ }
379
+ if (_this.imageHandler) {
380
+ nameAndImage.image = _this.imageHandler + nameAndImage.image;
381
+ }
382
+ if (metadata.targetAsset.contentType && metadata.targetAsset.contentType.embed && metadata.targetAsset.contentType.valid) {
383
+ nameAndImage.animation_url = metadata.targetAsset.image;
384
+ nameAndImage.image = _this.loading();
385
+ }
386
+ if (externalUrl) {
387
+ nameAndImage.explorer = `from the [${exports.COIN_TO_NETWORK[_this.collectionChain]} blockchain](${externalUrl})`;
388
+ }
389
+ nameAndImage.description = `Curated ${_this.name} Collection: `;
390
+ // Emblem Open Description
391
+ if (_this.loadTypes.includes('detailed')) {
392
+ if (balance && balance.length > 0) {
393
+ nameAndImage.description = `${nameAndImage.description}\n\n`;
394
+ balance.forEach((item) => {
395
+ item.balance && item.coin && item.name ? (nameAndImage.description = `${nameAndImage.description} * ${item.balance} ${item.name} on ${item.coin}\n\n`) : null;
396
+ });
397
+ }
398
+ nameAndImage.description = nameAndImage.description + metadata.targetAsset.description + `.\n\n${_this.description}`;
399
+ }
400
+ else {
401
+ let balanceDescription = '';
402
+ if (filtered && filtered.length > 0) {
403
+ if (filtered[0].balance) {
404
+ balanceDescription = filtered[0].balance;
405
+ }
406
+ else if (filtered) {
407
+ balanceDescription = '1';
408
+ }
409
+ }
410
+ else {
411
+ if (balance && balance.length > 0 && balance[0].balance) {
412
+ balanceDescription = balance[0].balance;
413
+ }
414
+ else if (balance) {
415
+ balanceDescription = '1';
416
+ }
417
+ }
418
+ nameAndImage.description = nameAndImage.description + `This vault contains ${balanceDescription} ${nameAndImage.assetName} ${nameAndImage.explorer} .\n\n${_this.description}`;
419
+ }
420
+ let viewOnEmblemFinanceLink = '';
421
+ if (_this.collectionType === "ERC1155") {
422
+ viewOnEmblemFinanceLink = `\n\n[View on Emblem.finance](https://emblem.finance/nft2?id=${metadata.targetContract.tokenId})`;
423
+ }
424
+ else if (_this.collectionType === "ERC721a") {
425
+ viewOnEmblemFinanceLink = `\n\n[View on Emblem.finance](https://emblem.finance/nft2?id=${metadata.tokenId})`;
426
+ }
427
+ nameAndImage.description = nameAndImage.description + viewOnEmblemFinanceLink;
428
+ return nameAndImage;
429
+ },
430
+ generateCreateTemplate: (_this) => {
431
+ let template = {
432
+ fromAddress: { type: "user-provided" },
433
+ toAddress: { type: "user-provided" },
434
+ chainId: 1,
435
+ experimental: true,
436
+ targetContract: Object.assign(Object.assign({}, _this.contracts), { name: _this.name, description: _this.loadTypes.includes('detailed') ? null : _this.description }),
437
+ targetAsset: {
438
+ name: _this.loadTypes.includes('detailed') ? { type: "user-provided" } : _this.loadTypes.includes('select') ? { type: "selection-provided" } : "Loading...",
439
+ image: _this.loadTypes.includes('detailed') ? { type: "user-provided" } : _this.loadTypes.includes('select') ? { type: "selection-provided" } : _this.loading(),
440
+ description: _this.loadTypes.includes('detailed') ? { type: "user-provided" } : null,
441
+ ownedImage: _this.loadTypes.includes('detailed') ? { type: "user-provided" } : null,
442
+ projectName: _this.loadTypes.includes('select') ? _this.name : null
443
+ }
444
+ };
445
+ const removeNulls = (obj) => {
446
+ Object.keys(obj).forEach(key => {
447
+ if (obj[key] && typeof obj[key] === 'object')
448
+ removeNulls(obj[key]);
449
+ else if (obj[key] === null)
450
+ delete obj[key];
451
+ });
452
+ };
453
+ removeNulls(template);
454
+ return template;
455
+ }
456
+ };
457
+ Object.keys(record.contracts).forEach(key => {
458
+ template[key] = record.contracts[key];
459
+ });
460
+ Object.keys(imageMethods).forEach(key => {
461
+ template[key] = imageMethods[key];
462
+ });
463
+ return template;
464
+ }
465
+ exports.generateTemplate = generateTemplate;
466
+ function templateGuard(input) {
467
+ if (!input)
468
+ throw new Error(`No template provided`);
469
+ for (const key in input) {
470
+ if (input.hasOwnProperty(key)) {
471
+ const value = input[key];
472
+ // Check if the value is an object and has a "type" property
473
+ let errors = [];
474
+ if (value && typeof value === 'object' && 'type' in value) {
475
+ if (value.type === 'user-provided' || value.type === 'selection-provided') {
476
+ errors.push(`'${key}' is a required field`);
477
+ }
478
+ }
479
+ else if (typeof value === 'object') {
480
+ // Recursively check nested objects
481
+ try {
482
+ templateGuard(value);
483
+ }
484
+ catch (e) {
485
+ errors.push(e.message);
486
+ }
487
+ }
488
+ else if (value == "") {
489
+ errors.push(`'${key}' is a required field`);
490
+ }
491
+ if (errors.length > 0) {
492
+ throw new Error(errors.join(", "));
493
+ }
494
+ }
495
+ }
496
+ }
497
+ exports.templateGuard = templateGuard;
498
+ function genericGuard(input, type, key) {
499
+ if (!input)
500
+ throw new Error(`No ${key} provided`);
501
+ if (typeof input !== type)
502
+ throw new Error(`Invalid ${key} provided`);
503
+ }
504
+ exports.genericGuard = genericGuard;
505
+ exports.COIN_TO_NETWORK = {
506
+ 'xcp': 'BTC',
507
+ 'ordinalsbtc': 'BTC',
508
+ 'cursedordinalsbtc': 'BTC',
509
+ 'ethscription': 'ETH',
510
+ 'ordi': 'TAP',
511
+ 'oxbt': 'TAP',
512
+ 'bel': 'Bel',
513
+ 'nmc': 'Namecoin'
514
+ };