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/bundle.js +8 -3
- package/dist/curated/metadata.json +684176 -0
- package/dist/index.js +109 -18
- package/dist/utils.js +514 -0
- package/docs/bundle.js +8 -3
- package/docs/index.html +1 -1
- package/package.json +2 -2
- package/readme.md +1 -0
- package/script/version.js +1 -1
- package/src/index.ts +7 -2
- package/tsconfig.json +1 -1
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
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
36
|
-
return
|
|
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
|
-
|
|
39
|
-
|
|
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
|
+
};
|