UNPKG

@cenoa/waas-js-sdk

Version:

Official Cenoa Wallet as a Service SDK

150 lines (149 loc) 7.53 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const ethers_1 = require("ethers"); const errors_1 = __importDefault(require("../errors")); const api_1 = require("../api"); const EncryptionHelper_1 = __importDefault(require("./encryption/EncryptionHelper")); var WalletManager; (function (WalletManager) { function createPartnerWallet() { var _a; return __awaiter(this, void 0, void 0, function* () { // generate a random wallet const wallet = ethers_1.ethers.Wallet.createRandom(); // send the partner wallet address to the server yield setPartnerWallet({ walletAddress: wallet.address }); return { address: wallet.address, partnerPrivateKey: wallet.privateKey, mnemonicPhrase: (_a = wallet.mnemonic) === null || _a === void 0 ? void 0 : _a.phrase, }; }); } WalletManager.createPartnerWallet = createPartnerWallet; function setPartnerWallet(payload) { if (!(payload === null || payload === void 0 ? void 0 : payload.walletAddress)) { throw new errors_1.default.InvalidWalletAddressError(); } return api_1.apiHelper.setPartnerWallet(payload); } WalletManager.setPartnerWallet = setPartnerWallet; function getPartnerWallet() { return __awaiter(this, void 0, void 0, function* () { const partnerWalletResp = yield api_1.apiHelper.getPartnerWallet(); return { address: partnerWalletResp.data.walletAddress, balance: partnerWalletResp.data.walletBalanceInUSDC, usdcEBalance: partnerWalletResp.data.usdcEBalance, usdcNativeBalance: partnerWalletResp.data.usdcNativeBalance, currency: 'USDC', }; }); } WalletManager.getPartnerWallet = getPartnerWallet; function createUserWallet(payload) { var _a; return __awaiter(this, void 0, void 0, function* () { if (!(payload === null || payload === void 0 ? void 0 : payload.cenoaUserId)) { throw new errors_1.default.InvalidCenoaUserIdError(); } // generate a random wallet const wallet = ethers_1.ethers.Wallet.createRandom(); // send the wallet address to the server // get the key encryption key (KEK) for the user's wallet const walletEncryptionSecret = yield setUserWallet({ cenoaUserId: payload.cenoaUserId, walletAddress: wallet.address, }); const clientWalletData = { address: wallet.address, clientPrivateKey: wallet.privateKey, mnemonicPhrase: (_a = wallet.mnemonic) === null || _a === void 0 ? void 0 : _a.phrase, }; // encrypt the wallet data with the KEK const clientWalletKey = EncryptionHelper_1.default.encryptData(clientWalletData, walletEncryptionSecret.data); return Object.assign(Object.assign({}, clientWalletData), { clientWalletKey }); }); } WalletManager.createUserWallet = createUserWallet; function setUserWallet(payload) { if (!(payload === null || payload === void 0 ? void 0 : payload.cenoaUserId)) { throw new errors_1.default.InvalidCenoaUserIdError(); } if (!(payload === null || payload === void 0 ? void 0 : payload.walletAddress)) { throw new errors_1.default.InvalidWalletAddressError(); } return api_1.apiHelper.setUserWallet(payload); } WalletManager.setUserWallet = setUserWallet; function getUserWallet(payload) { return __awaiter(this, void 0, void 0, function* () { if (!(payload === null || payload === void 0 ? void 0 : payload.cenoaUserId)) { throw new errors_1.default.InvalidCenoaUserIdError(); } const userWalletResp = yield api_1.apiHelper.getUserWallet(payload); return { address: userWalletResp.data.walletAddress, balance: userWalletResp.data.walletBalanceInUSDC, usdcEBalance: userWalletResp.data.usdcEBalance, usdcNativeBalance: userWalletResp.data.usdcNativeBalance, currency: 'USDC', }; }); } WalletManager.getUserWallet = getUserWallet; function getUserWalletSecret(payload) { if (!(payload === null || payload === void 0 ? void 0 : payload.cenoaUserId)) { throw new errors_1.default.InvalidCenoaUserIdError(); } return api_1.apiHelper.getUserWalletSecret(payload); } WalletManager.getUserWalletSecret = getUserWalletSecret; function generateWalletWithPrivateKey(payload) { if (!(payload === null || payload === void 0 ? void 0 : payload.privateKey)) { throw new errors_1.default.InvalidPrivateKeyError(); } // create a wallet with the provided private key const wallet = new ethers_1.ethers.Wallet(payload.privateKey); return wallet; } WalletManager.generateWalletWithPrivateKey = generateWalletWithPrivateKey; function generateWalletWithClientWalletKey(payload) { return __awaiter(this, void 0, void 0, function* () { if (!(payload === null || payload === void 0 ? void 0 : payload.cenoaUserId)) { throw new errors_1.default.InvalidCenoaUserIdError(); } if (!(payload === null || payload === void 0 ? void 0 : payload.clientWalletKey)) { throw new errors_1.default.InvalidClientWalletKeyError(); } // get the key encryption key (KEK) for the user const walletEncryptionSecret = yield getUserWalletSecret({ cenoaUserId: payload.cenoaUserId, }); // decrypt the wallet data with the KEK const decryptedWalletData = EncryptionHelper_1.default.decryptData(payload.clientWalletKey, walletEncryptionSecret.data); // decrypt the wallet private key with the KEK const decryptedPrivateKey = decryptedWalletData.clientPrivateKey; if (!decryptedPrivateKey) { throw new errors_1.default.InvalidPrivateKeyError(); } // create a wallet with the decrypted private key const wallet = new ethers_1.ethers.Wallet(decryptedPrivateKey); return wallet; }); } WalletManager.generateWalletWithClientWalletKey = generateWalletWithClientWalletKey; })(WalletManager || (WalletManager = {})); exports.default = WalletManager;