UNPKG

multichain-crypto-wallet

Version:

A Multichain crypto wallet library that supports Ethereum, Bitcoin, Solana, Waves and other EVM compatible blockchains E.g. Binance Smart Chain, Polygon, Avalanche etc.

287 lines (235 loc) 6.85 kB
import * as bip39 from 'bip39'; import bitcoinHelper from '../../common/helpers/bitcoinHelper'; import ethereumHelper from '../../common/helpers/ethereumHelper'; import solanaHelper from '../../common/helpers/solanaHelper'; import wavesHelper from '../../common/helpers/wavesHelper'; import tronHelper from '../../common/helpers/tronHelper'; import { TransferPayload, BalancePayload, CreateWalletPayload, GetAddressFromPrivateKeyPayload, GenerateWalletFromMnemonicPayload, GetTransactionPayload, GetWalletFromEncryptedjsonPayload, GetEncryptedJsonFromPrivateKey, IGetTokenInfoPayload, ISmartContractCallPayload, Network, } from '../../common/utils/types'; const networkHelpers: Record<Network, any> = { ethereum: ethereumHelper, solana: solanaHelper, tron: tronHelper, waves: wavesHelper, bitcoin: bitcoinHelper, 'bitcoin-testnet': bitcoinHelper, }; const baseFeatures = [ 'createWallet', 'getAddressFromPrivateKey', 'generateWalletFromMnemonic', 'getBalance', 'transfer', 'getTransaction', ]; const supportedFeatures = { ethereum: [ ...baseFeatures, 'getEncryptedJsonFromPrivateKey', 'getWalletFromEncryptedJson', 'getTokenInfo', 'smartContractCall', ], solana: [...baseFeatures, 'getTokenInfo'], bitcoin: [...baseFeatures], 'bitcoin-testnet': [...baseFeatures], waves: [ ...baseFeatures.filter(feature => feature !== 'getAddressFromPrivateKey'), 'getTokenInfo', 'smartContractCall', ], tron: [...baseFeatures, 'getTokenInfo', 'smartContractCall'], }; function getNetworkHelper(network: Network) { const helper = networkHelpers[network]; if (!helper) { throw new Error(`Unsupported network: ${network}`); } return helper; } function isFeatureSupported(network: Network, feature: string): boolean { return supportedFeatures[network]?.includes(feature) || false; } function generateMnemonic(numWords: number = 12): string { const strength = (numWords / 3) * 32; return bip39.generateMnemonic(strength); } function getAddressFromPrivateKey(args: GetAddressFromPrivateKeyPayload) { try { if (!isFeatureSupported(args.network, 'getAddressFromPrivateKey')) { throw new Error( `getAddressFromPrivateKey is not supported for ${args.network}` ); } const helper = getNetworkHelper(args.network); if (!helper) { throw new Error('Invalid network'); } return helper.getAddressFromPrivateKey(args.privateKey); } catch (error) { throw error; } } function generateWalletFromMnemonic(args: GenerateWalletFromMnemonicPayload) { try { if (!isFeatureSupported(args.network, 'generateWalletFromMnemonic')) { throw new Error( `generateWalletFromMnemonic is not supported for ${args.network}` ); } const helper = getNetworkHelper(args.network); if (!helper) { throw new Error('Invalid network'); } return helper.generateWalletFromMnemonic( args.mnemonic, args.derivationPath ); } catch (error) { throw error; } } function createWallet(args: CreateWalletPayload) { try { if (!isFeatureSupported(args.network, 'createWallet')) { throw new Error(`createWallet is not supported for ${args.network}`); } const helper = getNetworkHelper(args.network); if (!helper) { throw new Error('Invalid network'); } return helper.createWallet(args.derivationPath); } catch (error) { throw error; } } async function getBalance(args: BalancePayload) { try { if (!isFeatureSupported(args.network, 'getBalance')) { throw new Error(`getBalance is not supported for ${args.network}`); } const helper = getNetworkHelper(args.network); if (!helper) { throw new Error('Invalid network'); } return helper.getBalance({ ...args }); } catch (error) { throw error; } } async function transfer(args: TransferPayload) { try { if (!isFeatureSupported(args.network, 'transfer')) { throw new Error(`transfer is not supported for ${args.network}`); } const helper = getNetworkHelper(args.network); if (!helper) { throw new Error('Invalid network'); } return helper.transfer({ ...args }); } catch (error) { throw error; } } async function getTransaction(args: GetTransactionPayload) { try { if (!isFeatureSupported(args.network, 'getTransaction')) { throw new Error(`getTransaction is not supported for ${args.network}`); } const helper = getNetworkHelper(args.network); if (!helper) { throw new Error('Invalid network'); } return helper.getTransaction({ ...args }); } catch (error) { throw error; } } async function getEncryptedJsonFromPrivateKey( args: GetEncryptedJsonFromPrivateKey ) { try { if (!isFeatureSupported(args.network, 'getEncryptedJsonFromPrivateKey')) { throw new Error( `getEncryptedJsonFromPrivateKey is not supported for ${args.network}` ); } const helper = getNetworkHelper(args.network); if (!helper) { throw new Error('Invalid network'); } return helper.getEncryptedJsonFromPrivateKey({ ...args }); } catch (error) { throw error; } } async function getWalletFromEncryptedJson( args: GetWalletFromEncryptedjsonPayload ) { try { if (!isFeatureSupported(args.network, 'getWalletFromEncryptedJson')) { throw new Error( `getWalletFromEncryptedJson is not supported for ${args.network}` ); } const helper = getNetworkHelper(args.network); if (!helper) { throw new Error('Invalid network'); } return helper.getWalletFromEncryptedJson({ ...args }); } catch (error) { throw error; } } async function getTokenInfo(args: IGetTokenInfoPayload) { try { if (!isFeatureSupported(args.network, 'getTokenInfo')) { throw new Error(`getTokenInfo is not supported for ${args.network}`); } const helper = getNetworkHelper(args.network); if (!helper) { throw new Error('Invalid network'); } return helper.getTokenInfo({ ...args }); } catch (error) { throw error; } } async function smartContractCall(args: ISmartContractCallPayload) { try { if (!isFeatureSupported(args.network, 'smartContractCall')) { throw new Error(`smartContractCall is not supported for ${args.network}`); } const helper = getNetworkHelper(args.network); if (!helper) { throw new Error('Invalid network'); } return helper.smartContractCall({ ...args }); } catch (error) { throw error; } } export { generateMnemonic, getAddressFromPrivateKey, generateWalletFromMnemonic, createWallet, getBalance, transfer, getTransaction, getEncryptedJsonFromPrivateKey, getWalletFromEncryptedJson, getTokenInfo, smartContractCall, };