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/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.0';
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;
@@ -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>
package/docs/bels.html CHANGED
@@ -14,7 +14,7 @@
14
14
  </head>
15
15
  <body>
16
16
  <h1>Embels Emblem Steps</h1>
17
- <script src="./-bundle.js"></script>
17
+ <script src="./bundle.js"></script>
18
18
  <script>
19
19
  const sdk = new EmblemVaultSDK('demo'); // Instantiate SDK
20
20