UNPKG

shield-bridge-sdk

Version:
99 lines (98 loc) 4.26 kB
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()); }); }; import { expose } from 'threads/worker'; import { RpcReadAdapter } from '@taquito/taquito'; import { SaplingToolkit, InMemorySpendingKey } from '@taquito/sapling'; import { RpcClient } from '@taquito/rpc'; import { Prefix, prefix, b58cencode } from '@taquito/utils'; import * as sapling from '@airgap/sapling-wasm'; import * as bip39 from 'bip39'; const SECRET_KEY_METHOD = 'secretKey'; const MNEMONIC_METHOD = 'mnemonic'; let iMSK; let sTk; const createExtendedSpendingKey = (mnemonic) => __awaiter(void 0, void 0, void 0, function* () { const fullSeed = yield bip39.mnemonicToSeed(mnemonic); const first32 = fullSeed.subarray(0, 32); const second32 = fullSeed.subarray(32); const seed = Buffer.from( // eslint-disable-next-line no-bitwise first32.map((byte, index) => byte ^ second32[index])); const spendingKeyArr = new Uint8Array(yield sapling.getExtendedSpendingKey(seed, 'm/')); return b58cencode(spendingKeyArr, prefix[Prefix.SASK]); }); const loadSaplingSecret = (_a) => __awaiter(void 0, [_a], void 0, function* ({ sk, saplingDetails, rpcUrl, skType = MNEMONIC_METHOD, }) { try { const secretKey = sk; const loadAccountMethod = skType; if (loadAccountMethod === SECRET_KEY_METHOD) { iMSK = new InMemorySpendingKey(secretKey); } else if (loadAccountMethod === MNEMONIC_METHOD) { iMSK = yield InMemorySpendingKey.fromMnemonic(secretKey); } else { throw new Error('Invalid account loading method provided'); } } catch (err) { iMSK = null; sTk = null; throw err; } try { sTk = new SaplingToolkit({ saplingSigner: iMSK }, saplingDetails, new RpcReadAdapter(new RpcClient(rpcUrl))); } catch (err) { iMSK = null; sTk = null; throw err; } }); const getPaymentAddress = () => iMSK .getSaplingViewingKeyProvider() .then((inMemoryViewingKey) => inMemoryViewingKey.getAddress()); const prepareShieldedTransaction = (shieldTransactions) => sTk .prepareShieldedTransaction(shieldTransactions) .catch((err) => console.error(err.message)); const prepareUnshieldedTransaction = (unshieldTransaction) => sTk .prepareUnshieldedTransaction(unshieldTransaction) .catch((err) => console.error(err.message)); const prepareSaplingTransaction = (saplingTransactions = []) => sTk .prepareSaplingTransaction(saplingTransactions) .catch((err) => console.error(err.message)); const getSaplingBalance = () => sTk .getSaplingTransactionViewer() .then((txViewer) => txViewer.getBalance().then((balance) => balance.toNumber())) .catch((err) => console.error(err.message)); const getSaplingTransactions = () => sTk .getSaplingTransactionViewer() .then((txViewer) => txViewer.getIncomingAndOutgoingTransactions()) .then((transactionHistory) => ({ incoming: transactionHistory.incoming.map((tx) => (Object.assign(Object.assign({}, tx), { value: tx.value.toNumber() }))), outgoing: transactionHistory.outgoing.map((tx) => (Object.assign(Object.assign({}, tx), { value: tx.value.toNumber() }))), })) .catch((err) => console.error(err.message)); const reInitializeSapling = () => { iMSK = null; sTk = null; }; const saplingWorker = { createExtendedSpendingKey, loadSaplingSecret, getPaymentAddress, prepareShieldedTransaction, prepareUnshieldedTransaction, prepareSaplingTransaction, getSaplingBalance, getSaplingTransactions, reInitializeSapling, }; expose(saplingWorker);