emblem-vault-sdk 1.8.0 → 1.8.2
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/abi/abi.json +18 -0
- package/dist/bundle.js +82700 -3169
- package/dist/derive.js +1846 -0
- package/dist/index.js +96 -1
- package/dist/utils.js +37 -3
- package/docs/DeGods.html +115 -0
- package/docs/bels.html +1 -1
- package/docs/bundle.js +82700 -3169
- package/docs/index.html +7 -5
- package/package.json +13 -2
- package/src/abi/abi.json +19 -1
- package/src/derive.ts +2017 -0
- package/src/index.ts +68 -4
- package/src/utils.ts +32 -3
- package/types/derive.d.ts +1 -0
- package/types/index.d.ts +12 -0
- package/types/utils.d.ts +5 -1
package/dist/index.js
CHANGED
|
@@ -34,7 +34,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
34
34
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
35
|
const bignumber_1 = require("@ethersproject/bignumber");
|
|
36
36
|
const utils_1 = require("./utils");
|
|
37
|
-
const SDK_VERSION = '1.8.
|
|
37
|
+
const SDK_VERSION = '1.8.2';
|
|
38
38
|
class EmblemVaultSDK {
|
|
39
39
|
constructor(apiKey, baseUrl) {
|
|
40
40
|
this.apiKey = apiKey;
|
|
@@ -42,7 +42,10 @@ class EmblemVaultSDK {
|
|
|
42
42
|
if (!apiKey) {
|
|
43
43
|
throw new Error('API key is required');
|
|
44
44
|
}
|
|
45
|
+
this.v1Url = 'https://api2.emblemvault.io';
|
|
45
46
|
this.baseUrl = baseUrl || 'https://v2.emblemvault.io';
|
|
47
|
+
this.v3Url = 'https://emblemvault-io-v3-6156a7b1ac82.herokuapp.com';
|
|
48
|
+
this.sigUrl = 'https://tor-us-signer-coval.vercel.app';
|
|
46
49
|
}
|
|
47
50
|
// Example method structure
|
|
48
51
|
generateUploadUrl() {
|
|
@@ -126,6 +129,20 @@ class EmblemVaultSDK {
|
|
|
126
129
|
return metadata;
|
|
127
130
|
});
|
|
128
131
|
}
|
|
132
|
+
refreshBalance(tokenId, callback = null) {
|
|
133
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
134
|
+
(0, utils_1.genericGuard)(tokenId, "string", "tokenId");
|
|
135
|
+
if (callback) {
|
|
136
|
+
callback('refreshing Balance');
|
|
137
|
+
}
|
|
138
|
+
let url = `${this.v1Url}/vault/balance/${tokenId}?live=true`;
|
|
139
|
+
let balance = yield (0, utils_1.fetchData)(url, this.apiKey);
|
|
140
|
+
if (callback) {
|
|
141
|
+
callback('received Balance', balance.balances);
|
|
142
|
+
}
|
|
143
|
+
return (balance === null || balance === void 0 ? void 0 : balance.balances) || [];
|
|
144
|
+
});
|
|
145
|
+
}
|
|
129
146
|
fetchVaultsOfType(vaultType, address) {
|
|
130
147
|
return __awaiter(this, void 0, void 0, function* () {
|
|
131
148
|
(0, utils_1.genericGuard)(vaultType, "string", "vaultType");
|
|
@@ -283,6 +300,14 @@ class EmblemVaultSDK {
|
|
|
283
300
|
return { mintResponse };
|
|
284
301
|
});
|
|
285
302
|
}
|
|
303
|
+
performClaimChain(web3, tokenId, serialNumber, callback = null) {
|
|
304
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
305
|
+
let sig = yield this.requestLocalClaimSignature(web3, tokenId, serialNumber, callback);
|
|
306
|
+
let jwt = yield this.requestRemoteClaimToken(web3, tokenId, sig, callback);
|
|
307
|
+
let dkeys = yield this.requestRemoteKey(tokenId, jwt, callback);
|
|
308
|
+
return yield this.decryptVaultKeys(tokenId, dkeys, callback);
|
|
309
|
+
});
|
|
310
|
+
}
|
|
286
311
|
requestLocalMintSignature(web3, tokenId, callback = null) {
|
|
287
312
|
return __awaiter(this, void 0, void 0, function* () {
|
|
288
313
|
if (callback) {
|
|
@@ -297,6 +322,20 @@ class EmblemVaultSDK {
|
|
|
297
322
|
return signature;
|
|
298
323
|
});
|
|
299
324
|
}
|
|
325
|
+
requestLocalClaimSignature(web3, tokenId, serialNumber, callback = null) {
|
|
326
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
327
|
+
if (callback) {
|
|
328
|
+
callback('requesting User Claim Signature');
|
|
329
|
+
}
|
|
330
|
+
const message = `Claim: ${serialNumber ? serialNumber.toString() : tokenId.toString()}`;
|
|
331
|
+
const accounts = yield web3.eth.getAccounts();
|
|
332
|
+
const signature = yield web3.eth.personal.sign(message, accounts[0], '');
|
|
333
|
+
if (callback) {
|
|
334
|
+
callback(`signature`, signature);
|
|
335
|
+
}
|
|
336
|
+
return signature;
|
|
337
|
+
});
|
|
338
|
+
}
|
|
300
339
|
requestRemoteMintSignature(web3, tokenId, signature, callback = null) {
|
|
301
340
|
return __awaiter(this, void 0, void 0, function* () {
|
|
302
341
|
if (callback) {
|
|
@@ -311,6 +350,45 @@ class EmblemVaultSDK {
|
|
|
311
350
|
return remoteMintResponse;
|
|
312
351
|
});
|
|
313
352
|
}
|
|
353
|
+
requestRemoteClaimToken(web3, tokenId, signature, callback = null) {
|
|
354
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
355
|
+
if (callback) {
|
|
356
|
+
callback('requesting Remote Claim token');
|
|
357
|
+
}
|
|
358
|
+
const chainId = yield web3.eth.getChainId();
|
|
359
|
+
let url = `${this.sigUrl}/sign`;
|
|
360
|
+
let remoteClaimResponse = yield (0, utils_1.fetchData)(url, this.apiKey, 'POST', { signature: signature, tokenId: tokenId }, { chainid: chainId.toString() });
|
|
361
|
+
if (callback) {
|
|
362
|
+
callback(`remote Claim token`, remoteClaimResponse);
|
|
363
|
+
}
|
|
364
|
+
return remoteClaimResponse;
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
requestRemoteKey(tokenId, jwt, callback = null) {
|
|
368
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
369
|
+
if (callback) {
|
|
370
|
+
callback('requesting Remote Key');
|
|
371
|
+
}
|
|
372
|
+
let dkeys = yield (0, utils_1.getTorusKeys)(tokenId, jwt.token);
|
|
373
|
+
if (callback) {
|
|
374
|
+
callback(`remote Key`, dkeys);
|
|
375
|
+
}
|
|
376
|
+
return dkeys;
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
decryptVaultKeys(tokenId, dkeys, callback = null) {
|
|
380
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
381
|
+
if (callback) {
|
|
382
|
+
callback('decrypting Vault Keys');
|
|
383
|
+
}
|
|
384
|
+
let metadata = yield this.fetchMetadata(tokenId);
|
|
385
|
+
let ukeys = yield (0, utils_1.decryptKeys)(metadata.ciphertextV2, dkeys, metadata.addresses);
|
|
386
|
+
if (callback) {
|
|
387
|
+
callback(`remote Key`, ukeys);
|
|
388
|
+
}
|
|
389
|
+
return ukeys;
|
|
390
|
+
});
|
|
391
|
+
}
|
|
314
392
|
getQuote(web3, amount, callback = null) {
|
|
315
393
|
return __awaiter(this, void 0, void 0, function* () {
|
|
316
394
|
if (callback) {
|
|
@@ -340,6 +418,23 @@ class EmblemVaultSDK {
|
|
|
340
418
|
return mintResponse;
|
|
341
419
|
});
|
|
342
420
|
}
|
|
421
|
+
performBurn(web3, tokenId, callback = null) {
|
|
422
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
423
|
+
let metadata = yield this.fetchMetadata(tokenId);
|
|
424
|
+
let targetContract = yield this.fetchCuratedContractByName(metadata.targetContract.name);
|
|
425
|
+
if (callback) {
|
|
426
|
+
callback('performing Burn');
|
|
427
|
+
}
|
|
428
|
+
const accounts = yield web3.eth.getAccounts();
|
|
429
|
+
const chainId = yield web3.eth.getChainId();
|
|
430
|
+
let handlerContract = yield (0, utils_1.getHandlerContract)(web3);
|
|
431
|
+
let burnResponse = yield handlerContract.methods.claim(targetContract[chainId], targetContract.collectionType == 'ERC721a' ? tokenId : targetContract.tokenId).send({ from: accounts[0] });
|
|
432
|
+
if (callback) {
|
|
433
|
+
callback('Burn Complete');
|
|
434
|
+
}
|
|
435
|
+
return burnResponse;
|
|
436
|
+
});
|
|
437
|
+
}
|
|
343
438
|
contentTypeReport(url) {
|
|
344
439
|
return __awaiter(this, void 0, void 0, function* () {
|
|
345
440
|
return yield (0, utils_1.checkContentType)(url);
|
package/dist/utils.js
CHANGED
|
@@ -12,10 +12,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.COIN_TO_NETWORK = exports.checkContentType = exports.getLegacyContract = exports.getHandlerContract = exports.getQuoteContractObject = 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;
|
|
15
|
+
exports.decryptKeys = exports.getTorusKeys = exports.COIN_TO_NETWORK = exports.checkContentType = exports.getLegacyContract = exports.getHandlerContract = exports.getQuoteContractObject = 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 crypto_js_1 = __importDefault(require("crypto-js"));
|
|
16
17
|
const metadata_json_1 = __importDefault(require("./curated/metadata.json"));
|
|
17
18
|
const abi_json_1 = __importDefault(require("./abi/abi.json"));
|
|
19
|
+
const derive_1 = require("./derive");
|
|
18
20
|
exports.NFT_DATA = metadata_json_1.default;
|
|
21
|
+
const TORUS_CLIENT_ID = 'BOqGGv-Yx7Dp5RdvD9R3DgSC8jv66gQGwT3w22L7fj3Fg5WQ8AEUjJzyyEwD-qvq5eUQiVipyzOmRZTWBAxaoj0';
|
|
22
|
+
const TORUS_VERIFIER = 'tor-us-signer-vercel';
|
|
19
23
|
const pad = (num, size) => {
|
|
20
24
|
if (!num)
|
|
21
25
|
return null;
|
|
@@ -48,10 +52,10 @@ const metadataAllProjects = (projects) => projects.reduce((unique, item) => {
|
|
|
48
52
|
return unique;
|
|
49
53
|
}, []);
|
|
50
54
|
exports.metadataAllProjects = metadataAllProjects;
|
|
51
|
-
const fetchData = (url, apiKey, method = 'GET', body = null) => __awaiter(void 0, void 0, void 0, function* () {
|
|
55
|
+
const fetchData = (url, apiKey, method = 'GET', body = null, headers = null) => __awaiter(void 0, void 0, void 0, function* () {
|
|
52
56
|
const options = {
|
|
53
57
|
method: method,
|
|
54
|
-
headers: { 'x-api-key': apiKey },
|
|
58
|
+
headers: headers ? Object.assign(Object.assign({}, headers), { 'x-api-key': apiKey }) : { 'x-api-key': apiKey },
|
|
55
59
|
};
|
|
56
60
|
if (method === 'POST' && body) {
|
|
57
61
|
options.body = JSON.stringify(body);
|
|
@@ -659,3 +663,33 @@ const mimeToExtensionMap = {
|
|
|
659
663
|
"video/vnd.dlna.mpeg-tts": ".ts"
|
|
660
664
|
// Add more mappings if needed
|
|
661
665
|
};
|
|
666
|
+
function getTorusKeys(verifierId, idToken, cb = null) {
|
|
667
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
668
|
+
const FetchNodeDetails = require("@toruslabs/fetch-node-details").default;
|
|
669
|
+
const TorusUtils = require("@toruslabs/torus.js").default;
|
|
670
|
+
const fetchNodeDetails = new FetchNodeDetails();
|
|
671
|
+
const torus = new TorusUtils({ network: "mainnet", enableOneKey: true, clientId: TORUS_CLIENT_ID });
|
|
672
|
+
const { torusNodeEndpoints, torusIndexes } = yield fetchNodeDetails.getNodeDetails({ verifier: TORUS_VERIFIER, verifierId });
|
|
673
|
+
let privKey = yield torus.retrieveShares(torusNodeEndpoints, torusIndexes, TORUS_VERIFIER, { verifier_id: verifierId }, idToken);
|
|
674
|
+
return { privateKey: privKey };
|
|
675
|
+
});
|
|
676
|
+
}
|
|
677
|
+
exports.getTorusKeys = getTorusKeys;
|
|
678
|
+
function decryptKeys(vaultCiphertextV2, keys, addresses) {
|
|
679
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
680
|
+
try {
|
|
681
|
+
var bytes = crypto_js_1.default.AES.decrypt(vaultCiphertextV2, keys.privateKey.privKey);
|
|
682
|
+
let payload = JSON.parse(bytes.toString(crypto_js_1.default.enc.Utf8));
|
|
683
|
+
let key = (0, derive_1.phrasePathToKey)(payload.phrase, 0);
|
|
684
|
+
return payload; //key
|
|
685
|
+
// addresses.forEach(async address=>{
|
|
686
|
+
// let key = phraseToKey(payload.phrase, 0)
|
|
687
|
+
// console.log(key)
|
|
688
|
+
// })
|
|
689
|
+
}
|
|
690
|
+
catch (err) {
|
|
691
|
+
console.log(err);
|
|
692
|
+
}
|
|
693
|
+
});
|
|
694
|
+
}
|
|
695
|
+
exports.decryptKeys = decryptKeys;
|
package/docs/DeGods.html
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>DeGods
|
|
5
|
+
</title>
|
|
6
|
+
<style>
|
|
7
|
+
input, select, button {
|
|
8
|
+
padding: 10px;
|
|
9
|
+
margin: 5px;
|
|
10
|
+
}
|
|
11
|
+
#tokenImage{
|
|
12
|
+
max-width: 300px;
|
|
13
|
+
}
|
|
14
|
+
</style>
|
|
15
|
+
</head>
|
|
16
|
+
<body>
|
|
17
|
+
<h1>Vault it</h1>
|
|
18
|
+
<script src="./bundle.js"></script>
|
|
19
|
+
<script>
|
|
20
|
+
const sdk = new EmblemVaultSDK('demo'); // Instantiate SDK
|
|
21
|
+
|
|
22
|
+
// Template used for creating vaults
|
|
23
|
+
let contractTemplate = {
|
|
24
|
+
"fromAddress": null,
|
|
25
|
+
"toAddress": null,
|
|
26
|
+
"chainId":1,
|
|
27
|
+
"experimental":true,
|
|
28
|
+
"targetContract":{
|
|
29
|
+
"1":"0x345eF9d7E75aEEb979053AA41BB6330683353B7b",
|
|
30
|
+
"name":"Bitcoin DeGods",
|
|
31
|
+
"description":"Bitcoin DeGods is a collection of 535 Bitcoin Ordinals inscribed in the 77236 to 77770 range. This collection is curated by Emblem Vault. "
|
|
32
|
+
},
|
|
33
|
+
"targetAsset":{
|
|
34
|
+
"image":"https://emblem.finance/btcdegods.jpg",
|
|
35
|
+
"name":"Loading...",
|
|
36
|
+
"xtra": "anything else you need here"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
let defaultAccount, vaultBalance, vaultData;
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
<button id="step1Button" onclick="Step1()">Step 1 (Create Vault)</button>
|
|
44
|
+
<button id="step2Button" onclick="Step2()" disabled>Step 2 (Refresh Vault)</button>
|
|
45
|
+
<button id="step3Button" onclick="Step3()" disabled>Step 3 (Validate Mintability)</button>
|
|
46
|
+
<script>
|
|
47
|
+
async function Step1() {
|
|
48
|
+
if (!defaultAccount) { // Only load web3 if not already loaded
|
|
49
|
+
await sdk.loadWeb3() // Can be any web3 provider
|
|
50
|
+
defaultAccount = await web3.eth.getAccounts().then(accounts => accounts[0]).catch(err=>console) // Minter's address
|
|
51
|
+
}
|
|
52
|
+
if (!vaultData) {
|
|
53
|
+
// populate the template
|
|
54
|
+
contractTemplate.toAddress = defaultAccount;
|
|
55
|
+
contractTemplate.fromAddress = defaultAccount;
|
|
56
|
+
|
|
57
|
+
// Create a vault
|
|
58
|
+
vaultData = await sdk.createCuratedVault(contractTemplate, updateLogCallback).catch(err=>console.log(err));
|
|
59
|
+
if (!vaultData || vaultData.err) { // Temporary fix while I fix a race condition
|
|
60
|
+
setTimeout(Step1, 1000); // should Back off and try again
|
|
61
|
+
} else {
|
|
62
|
+
updateLogCallback("deposit Address", vaultData.addresses.find(address=>{return address.coin == 'TAP'}).address)
|
|
63
|
+
document.getElementById('step1Button').disabled = true;
|
|
64
|
+
document.getElementById('step2Button').disabled = false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async function Step2() {
|
|
70
|
+
if (vaultData) {
|
|
71
|
+
vaultBalance = await sdk.refreshBalance(vaultData.tokenId, updateLogCallback).catch(err=>console); // Refresh the balance
|
|
72
|
+
if (vaultBalance.length > 0) { // We have a balance!!
|
|
73
|
+
updateLogCallback('Step','complete')
|
|
74
|
+
document.getElementById('step2Button').disabled = true;
|
|
75
|
+
document.getElementById('step3Button').disabled = false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async function Step3() {
|
|
81
|
+
if (vaultBalance.length > 0) {
|
|
82
|
+
let contractObject = await sdk.fetchCuratedContractByName(contractTemplate.targetContract.name);
|
|
83
|
+
let mintable = contractObject.allowed(vaultBalance, contractObject);
|
|
84
|
+
if (mintable) {
|
|
85
|
+
performMint();
|
|
86
|
+
}
|
|
87
|
+
} else {
|
|
88
|
+
// Handle error
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async function performMint() {
|
|
93
|
+
if (vaultData.tokenId) {
|
|
94
|
+
// Perform Mint steps
|
|
95
|
+
sdk.performMintChain(web3, vaultData.tokenId, contractTemplate.targetContract.name, updateLogCallback).then(result => {
|
|
96
|
+
updateLogCallback('Minting success', 'tokenId: ' + vaultData.tokenId)
|
|
97
|
+
})
|
|
98
|
+
.catch(error => {
|
|
99
|
+
updateLogCallback('',error.message)
|
|
100
|
+
});
|
|
101
|
+
} else {
|
|
102
|
+
// Handle error
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function updateLogCallback(action, result){
|
|
107
|
+
document.getElementById('log').innerHTML += '\r\n' + action + ' ' + (result ? JSON.stringify(result) : '');
|
|
108
|
+
}
|
|
109
|
+
function clearLog(){
|
|
110
|
+
document.getElementById('log').innerHTML = '';
|
|
111
|
+
}
|
|
112
|
+
</script>
|
|
113
|
+
<pre id="log"></pre>
|
|
114
|
+
</body>
|
|
115
|
+
</html>
|