UNPKG

@tatumio/tatum-v1

Version:

Tatum API client allows browsers and Node.js clients to interact with Tatum API.

816 lines 65.6 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateAddressFromPrivatekey = exports.generatePrivateKeyFromMnemonic = exports.generateAddressFromXPub = exports.generateAlgodAddressFromPrivatetKey = exports.toLegacyAddress = exports.generateFlowPublicKeyFromPrivateKey = exports.generateEgldAddress = void 0; const crypto_1 = require("@binance-chain/javascript-sdk/lib/crypto"); const crypto_2 = require("@harmony-js/crypto"); // @ts-ignore // import {ECDSA_secp256k1, encodeKey, SHA3_256} from '@onflow/util-encode-key'; const bech32 = __importStar(require("bech32")); const bip32_1 = require("bip32"); const bip39_1 = require("bip39"); const bitcoinjs_lib_1 = require("bitcoinjs-lib"); const ed25519_hd_key_1 = require("ed25519-hd-key"); const elliptic = __importStar(require("elliptic")); const ethereumjs_wallet_1 = __importStar(require("ethereumjs-wallet")); // @ts-ignore const constants_1 = require("../constants"); const model_1 = require("../model"); const cardano_crypto_1 = __importDefault(require("./cardano.crypto")); const tron_crypto_1 = require("./tron.crypto"); const validator_1 = __importDefault(require("validator")); var isHexadecimal = validator_1.default.isHexadecimal; var isBase58 = validator_1.default.isBase58; const algosdk = require('algosdk'); const base32 = require('base32.js'); const sha512_256 = require('js-sha512').sha512_256; // tslint:disable:no-var-requires const bcash = require('@tatumio/bitcoincashjs2-lib'); const cashaddr = require('cashaddrjs'); const coininfo = require('coininfo'); // tslint:disable-next-line:no-var-requires const TronWeb = require('tronweb'); /** * Generate Bitcoin address * @param testnet testnet or mainnet version of address * @param xpub extended public key to generate address from * @param i derivation index of address to generate. Up to 2^31 addresses can be generated. * @returns blockchain address */ const generateBtcAddress = (testnet, xpub, i) => { const network = testnet ? bitcoinjs_lib_1.networks.testnet : bitcoinjs_lib_1.networks.bitcoin; const w = bip32_1.fromBase58(xpub, network).derivePath(String(i)); return bitcoinjs_lib_1.payments.p2wpkh({ pubkey: w.publicKey, network }).address; }; /** * Generate Dogecoin address * @param testnet testnet or mainnet version of address * @param xpub extended public key to generate address from * @param i derivation index of address to generate. Up to 2^31 addresses can be generated. * @returns blockchain address */ const generateDogeAddress = (testnet, xpub, i) => { const network = testnet ? constants_1.DOGE_TEST_NETWORK : constants_1.DOGE_NETWORK; const w = bip32_1.fromBase58(xpub, network).derivePath(String(i)); return bitcoinjs_lib_1.payments.p2pkh({ pubkey: w.publicKey, network }).address; }; /** * Generate Tron address * @param xpub extended public key to generate address from * @param i derivation index of address to generate. Up to 2^31 addresses can be generated. * @returns blockchain address */ const generateTronAddress = (xpub, i) => { let w; if (xpub.length == 130 && isHexadecimal(xpub)) { w = bip32_1.fromPublicKey(Buffer.from(xpub.slice(0, 66), 'hex'), Buffer.from(xpub.slice(-64), 'hex')); } else if (xpub.length == 111 && isBase58(xpub)) { w = bip32_1.fromBase58(xpub); } else { throw new Error('Unknown xpub format'); } return TronWeb.address.fromHex(tron_crypto_1.generateAddress(w.derive(i).publicKey)); }; /** * Generate Litecoin address * @param testnet testnet or mainnet version of address * @param xpub extended public key to generate address from * @param i derivation index of address to generate. Up to 2^31 addresses can be generated. * @returns blockchain address */ const generateLtcAddress = (testnet, xpub, i) => { const network = testnet ? constants_1.LTC_TEST_NETWORK : constants_1.LTC_NETWORK; const w = bip32_1.fromBase58(xpub, network).derivePath(String(i)); return bitcoinjs_lib_1.payments.p2pkh({ pubkey: w.publicKey, network }).address; }; /** * Generate Bitcoin Cash address * @param testnet testnet or mainnet version of address * @param xpub extended public key to generate address from * @param i derivation index of address to generate. Up to 2^31 addresses can be generated. * @returns blockchain address */ const generateBchAddress = (testnet, xpub, i) => { const network = testnet ? bitcoinjs_lib_1.networks.testnet : bitcoinjs_lib_1.networks.bitcoin; const hdNode = bcash.HDNode.fromBase58(xpub, network); const legacy = hdNode.derivePath(String(i)).getAddress(); const decoded = _decode(legacy); return cashaddr.encode(decoded.prefix, decoded.type, decoded.hash); }; /** * Generate Ethereum or any other ERC20 address * @param testnet testnet or mainnet version of address * @param xpub extended public key to generate address from * @param i derivation index of address to generate. Up to 2^31 addresses can be generated. * @returns blockchain address */ const generateEthAddress = (testnet, xpub, i) => { const w = ethereumjs_wallet_1.hdkey.fromExtendedKey(xpub); const wallet = w.deriveChild(i).getWallet(); return '0x' + wallet.getAddress().toString('hex').toLowerCase(); }; /** * Generate XDC address * @param testnet testnet or mainnet version of address * @param xpub extended public key to generate address from * @param i derivation index of address to generate. Up to 2^31 addresses can be generated. * @returns blockchain address */ const generateXdcAddress = (testnet, xpub, i) => { const w = ethereumjs_wallet_1.hdkey.fromExtendedKey(xpub); const wallet = w.deriveChild(i).getWallet(); return 'xdc' + wallet.getAddress().toString('hex').toLowerCase(); }; /** * Generate ONE address * @param testnet testnet or mainnet version of address * @param xpub extended public key to generate address from * @param i derivation index of address to generate. Up to 2^31 addresses can be generated. * @returns blockchain address */ const generateOneAddress = (testnet, xpub, i) => { const w = ethereumjs_wallet_1.hdkey.fromExtendedKey(xpub); const wallet = w.deriveChild(i).getWallet(); const harmonyAddress = new crypto_2.HarmonyAddress('0x' + wallet.getAddress().toString('hex')); return harmonyAddress.basicHex; }; /** * Generate EGLD address * @param testnet testnet or mainnet version of address * @param xpub extended public key to generate address from * @param i derivation index of address to generate. Up to 2^31 addresses can be generated. * @returns blockchain address */ const generateEgldAddress = async (testnet, mnem, i) => { const path = (testnet ? constants_1.TESTNET_DERIVATION_PATH + '\'' : constants_1.EGLD_DERIVATION_PATH) + `/${i}'`; const seed = await bip39_1.mnemonicToSeed(mnem); const { key } = ed25519_hd_key_1.derivePath(path, seed.toString('hex')); const words = bech32.toWords(ed25519_hd_key_1.getPublicKey(key, false)); const address = bech32.encode('erd', words); return address; }; exports.generateEgldAddress = generateEgldAddress; /** * Generate Celo or any other ERC20 address * @param testnet testnet or mainnet version of address * @param xpub extended public key to generate address from * @param i derivation index of address to generate. Up to 2^31 addresses can be generated. * @returns blockchain address */ const generateCeloAddress = (testnet, xpub, i) => { const w = ethereumjs_wallet_1.hdkey.fromExtendedKey(xpub); const wallet = w.deriveChild(i).getWallet(); return '0x' + wallet.getAddress().toString('hex').toLowerCase(); }; /** * Generate FLOW or FUSD public key * @param xpub extended public key to generate address from * @param i derivation index of address to generate. Up to 2^31 addresses can be generated. * @returns blockchain address */ const generateFlowPublicKey = (xpub, i) => { const w = bip32_1.fromBase58(xpub).derivePath(String(i)); const s = new elliptic.ec('secp256k1').keyFromPublic(w.publicKey).getPublic().encode('hex', false); return s.slice(2); }; /** * Generate FLOW or FUSD public key from private key * @returns blockchain address */ const generateFlowPublicKeyFromPrivateKey = (pk) => { const s = new elliptic.ec('secp256k1').keyFromPrivate(pk).getPublic().encode('hex', false); return s.slice(2); }; exports.generateFlowPublicKeyFromPrivateKey = generateFlowPublicKeyFromPrivateKey; /** * Generate VeChain address * @param testnet testnet or mainnet version of address * @param xpub extended public key to generate address from * @param i derivation index of address to generate. Up to 2^31 addresses can be generated. * @returns blockchain address */ const generateVetAddress = (testnet, xpub, i) => { const w = ethereumjs_wallet_1.hdkey.fromExtendedKey(xpub); const wallet = w.deriveChild(i).getWallet(); return '0x' + wallet.getAddress().toString('hex').toLowerCase(); }; /** * Generate Bitcoin address * @param testnet testnet or mainnet version of address * @param xpub extended public key to generate address from * @param i derivation index of address to generate. Up to 2^31 addresses can be generated. * @returns blockchain address */ const generateLyraAddress = (testnet, xpub, i) => { const network = testnet ? constants_1.LYRA_TEST_NETWORK : constants_1.LYRA_NETWORK; const w = bip32_1.fromBase58(xpub, network).derivePath(String(i)); return bitcoinjs_lib_1.payments.p2pkh({ pubkey: w.publicKey, network }).address; }; /** * Generate Bitcoin private key from mnemonic seed * @param testnet testnet or mainnet version of address * @param mnemonic mnemonic to generate private key from * @param i derivation index of private key to generate. * @returns blockchain private key to the address */ const generateBtcPrivateKey = async (testnet, mnemonic, i) => { const network = testnet ? bitcoinjs_lib_1.networks.testnet : bitcoinjs_lib_1.networks.bitcoin; return bip32_1.fromSeed(await bip39_1.mnemonicToSeed(mnemonic), network) .derivePath(testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.BTC_DERIVATION_PATH) .derive(i) .toWIF(); }; /** * Generate Tron private key from mnemonic seed * @param mnemonic mnemonic to generate private key from * @param i derivation index of private key to generate. * @returns blockchain private key to the address */ const generateTronPrivateKey = async (mnemonic, i) => { var _a, _b; return (_b = (_a = bip32_1.fromSeed(await bip39_1.mnemonicToSeed(mnemonic)) .derivePath(constants_1.TRON_DERIVATION_PATH) .derive(i) .privateKey) === null || _a === void 0 ? void 0 : _a.toString('hex')) !== null && _b !== void 0 ? _b : ''; }; /** * Generate Flow private key from mnemonic seed * @returns blockchain private key to the address */ const generateFlowPrivateKey = async (mnemonic, i, alg = 'secp256k1') => { const key = bip32_1.fromSeed(await bip39_1.mnemonicToSeed(mnemonic)) .derivePath(constants_1.FLOW_DERIVATION_PATH) .derive(i) .privateKey; return new elliptic.ec(alg).keyFromPrivate(key).getPrivate().toString(16); }; /** * Generate Litecoin private key from mnemonic seed * @param testnet testnet or mainnet version of address * @param mnemonic mnemonic to generate private key from * @param i derivation index of private key to generate. * @returns blockchain private key to the address */ const generateLtcPrivateKey = async (testnet, mnemonic, i) => { const network = testnet ? constants_1.LTC_TEST_NETWORK : constants_1.LTC_NETWORK; return bip32_1.fromSeed(await bip39_1.mnemonicToSeed(mnemonic), network) .derivePath(testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.LTC_DERIVATION_PATH) .derive(i) .toWIF(); }; /** * Generate Dogecoin private key from mnemonic seed * @param testnet testnet or mainnet version of address * @param mnemonic mnemonic to generate private key from * @param i derivation index of private key to generate. * @returns blockchain private key to the address */ const generateDogePrivateKey = async (testnet, mnemonic, i) => { const network = testnet ? constants_1.DOGE_TEST_NETWORK : constants_1.DOGE_NETWORK; return bip32_1.fromSeed(await bip39_1.mnemonicToSeed(mnemonic), network) .derivePath(testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.DOGE_DERIVATION_PATH) .derive(i) .toWIF(); }; /** * Generate Bitcoin Cash private key from mnemonic seed * @param testnet testnet or mainnet version of address * @param mnemonic mnemonic to generate private key from * @param i derivation index of private key to generate. * @returns blockchain private key to the address */ const generateBchPrivateKey = async (testnet, mnemonic, i) => { const network = testnet ? bitcoinjs_lib_1.networks.testnet : bitcoinjs_lib_1.networks.bitcoin; return bip32_1.fromSeed(await bip39_1.mnemonicToSeed(mnemonic), network) .derivePath(constants_1.BCH_DERIVATION_PATH) .derive(i) .toWIF(); }; const toLegacyAddress = (address) => { const { prefix, type, hash } = _decode(address); let bitcoincash = coininfo.bitcoincash.main; switch (prefix) { case 'bitcoincash': bitcoincash = coininfo.bitcoincash.main; break; case 'bchtest': bitcoincash = coininfo.bitcoincash.test; break; } let version = bitcoincash.versions.public; switch (type) { case 'P2PKH': version = bitcoincash.versions.public; break; case 'P2SH': version = bitcoincash.versions.scripthash; break; } const hashBuf = Buffer.from(hash); return bcash.address.toBase58Check(hashBuf, version); }; exports.toLegacyAddress = toLegacyAddress; const _decode = (address) => { const { version, hash } = bcash.address.fromBase58Check(address); let decoded = { prefix: '', type: '', hash, format: '', }; switch (version) { case bitcoinjs_lib_1.networks.bitcoin.pubKeyHash: decoded = { prefix: 'bitcoincash', type: 'P2PKH', hash, format: 'legacy', }; break; case bitcoinjs_lib_1.networks.bitcoin.scriptHash: decoded = { prefix: 'bitcoincash', type: 'P2SH', hash, format: 'legacy', }; break; case bitcoinjs_lib_1.networks.testnet.pubKeyHash: decoded = { prefix: 'bchtest', type: 'P2PKH', hash, format: 'legacy', }; break; case bitcoinjs_lib_1.networks.testnet.scriptHash: decoded = { prefix: 'bchtest', type: 'P2SH', hash, format: 'legacy', }; break; } return decoded; }; /** * Generate Ethereum or any other ERC20 private key from mnemonic seed * @param testnet testnet or mainnet version of address * @param mnemonic mnemonic to generate private key from * @param i derivation index of private key to generate. * @returns blockchain private key to the address */ const generateEthPrivateKey = async (testnet, mnemonic, i) => { const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.ETH_DERIVATION_PATH; const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnemonic)); const derivePath = hdwallet.derivePath(path).deriveChild(i); return derivePath.getWallet().getPrivateKeyString(); }; /** * Generate Klaytn private key from mnemonic seed * @param testnet testnet or mainnet version of address * @param mnemonic mnemonic to generate private key from * @param i derivation index of private key to generate. * @returns blockchain private key to the address */ const generateKlayPrivateKey = async (testnet, mnemonic, i) => { const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.KLAYTN_DERIVATION_PATH; const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnemonic)); const derivePath = hdwallet.derivePath(path).deriveChild(i); return derivePath.getWallet().getPrivateKeyString(); }; /** * Generate Harmony or any other ERC20 private key from mnemonic seed * @param testnet testnet or mainnet version of address * @param mnemonic mnemonic to generate private key from * @param i derivation index of private key to generate. * @returns blockchain private key to the address */ const generateOnePrivateKey = async (testnet, mnemonic, i) => { const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.ONE_DERIVATION_PATH; const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnemonic)); const derivePath = hdwallet.derivePath(path).deriveChild(i); return derivePath.getWallet().getPrivateKeyString(); }; /** * Generate EGLD private key from mnemonic seed * @param testnet testnet or mainnet version of address * @param mnemonic mnemonic to generate private key from * @param i derivation index of private key to generate. * @returns blockchain private key to the address */ const generateEgldPrivateKey = async (testnet, mnemonic, i) => { const path = (testnet ? constants_1.TESTNET_DERIVATION_PATH + '\'' : constants_1.EGLD_DERIVATION_PATH) + `/${i}'`; const seed = await bip39_1.mnemonicToSeed(mnemonic); const { key } = ed25519_hd_key_1.derivePath(path, seed.toString('hex')); return key.toString('hex'); }; /** * Generate Polygon or any other ERC20 private key from mnemonic seed * @param testnet testnet or mainnet version of address * @param mnemonic mnemonic to generate private key from * @param i derivation index of private key to generate. * @returns blockchain private key to the address */ const generatePolygonPrivateKey = async (testnet, mnemonic, i) => { const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.MATIC_DERIVATION_PATH; const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnemonic)); const derivePath = hdwallet.derivePath(path).deriveChild(i); return derivePath.getWallet().getPrivateKeyString(); }; /** * Generate BSC or any other BEP-20 or BEP721 private key from mnemonic seed * @param testnet testnet or mainnet version of address * @param mnemonic mnemonic to generate private key from * @param i derivation index of private key to generate. * @returns blockchain private key to the address */ const generateBscPrivateKey = async (testnet, mnemonic, i) => { return generateEthPrivateKey(testnet, mnemonic, i); }; /** * Generate XDC private key from mnemonic seed * @param testnet testnet or mainnet version of address * @param mnemonic mnemonic to generate private key from * @param i derivation index of private key to generate. * @returns blockchain private key to the address */ const generateXdcPrivateKey = async (testnet, mnemonic, i) => { const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.XDC_DERIVATION_PATH; const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnemonic)); const derivePath = hdwallet.derivePath(path).deriveChild(i); return derivePath.getWallet().getPrivateKeyString(); }; /** * Generate Celo or any other ERC20 private key from mnemonic seed * @param testnet testnet or mainnet version of address * @param mnemonic mnemonic to generate private key from * @param i derivation index of private key to generate. * @returns blockchain private key to the address */ const generateCeloPrivateKey = async (testnet, mnemonic, i) => { const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.CELO_DERIVATION_PATH; const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnemonic)); const derivePath = hdwallet.derivePath(path).deriveChild(i); return derivePath.getWallet().getPrivateKeyString(); }; /** * Generate VeChain private key from mnemonic seed * @param testnet testnet or mainnet version of address * @param mnemonic mnemonic to generate private key from * @param i derivation index of private key to generate. * @returns blockchain private key to the address */ const generateVetPrivateKey = async (testnet, mnemonic, i) => { const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.VET_DERIVATION_PATH; const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnemonic)); const derivePath = hdwallet.derivePath(path).deriveChild(i); return derivePath.getWallet().getPrivateKeyString(); }; /** * Convert Bitcoin Private Key to Address * @param testnet testnet or mainnet version of address * @param privkey private key to use * @returns blockchain address */ const convertBtcPrivateKey = (testnet, privkey) => { const network = testnet ? bitcoinjs_lib_1.networks.testnet : bitcoinjs_lib_1.networks.bitcoin; const keyPair = bitcoinjs_lib_1.ECPair.fromWIF(privkey, network); return bitcoinjs_lib_1.payments.p2pkh({ pubkey: keyPair.publicKey, network }).address; }; /** * Convert Scrypta Private Key to Address * @param testnet testnet or mainnet version of address * @param privkey private key to use * @returns blockchain address */ const convertLyraPrivateKey = (testnet, privkey) => { const network = testnet ? constants_1.LYRA_TEST_NETWORK : constants_1.LYRA_NETWORK; const keyPair = bitcoinjs_lib_1.ECPair.fromWIF(privkey, network); return bitcoinjs_lib_1.payments.p2pkh({ pubkey: keyPair.publicKey, network }).address; }; /** * Convert Ethereum Private Key to Address * @param testnet testnet or mainnet version of address * @param privkey private key to use * @returns blockchain address */ const convertEthPrivateKey = (testnet, privkey) => { const wallet = ethereumjs_wallet_1.default.fromPrivateKey(Buffer.from(privkey.replace('0x', ''), 'hex')); return wallet.getAddressString(); }; /** * Convert Harmony Private Key to Address * @param testnet testnet or mainnet version of address * @param privKey private key to use * @returns blockchain address */ const convertOnePrivateKey = (testnet, privKey) => { const wallet = ethereumjs_wallet_1.default.fromPrivateKey(Buffer.from(privKey.replace('0x', ''), 'hex')); return wallet.getAddressString(); }; /** * Convert EGLD Private Key to Address * @param testnet testnet or mainnet version of address * @param privKey private key to use * @returns blockchain address */ const convertEgldPrivateKey = (testnet, privKey) => { const publicKey = ed25519_hd_key_1.getPublicKey(Buffer.from(privKey, 'hex'), false).toString('hex'); const words = bech32.toWords(Buffer.from(publicKey.slice(-64), 'hex')); const address = bech32.encode('erd', words); return address; }; /** * Convert XDC Private Key to Address * @param testnet testnet or mainnet version of address * @param privKey private key to use * @returns blockchain address */ const convertXdcPrivateKey = (testnet, privKey) => { const wallet = ethereumjs_wallet_1.default.fromPrivateKey(Buffer.from(privKey.replace('0x', ''), 'hex')); return wallet.getAddressString().replace('0x', 'xdc'); }; /** * Generate Algo Address From Private Key * @param privKey Private key to use * @returns blockchain address */ const generateAlgodAddressFromPrivatetKey = (privKey) => { const decoder = new base32.Decoder({ type: 'rfc4648' }); const secretKey = decoder.write(privKey).buf; const mn = algosdk.secretKeyToMnemonic(secretKey); return algosdk.mnemonicToSecretKey(mn).addr; }; exports.generateAlgodAddressFromPrivatetKey = generateAlgodAddressFromPrivatetKey; /** * Generate address * @param currency type of blockchain * @param testnet testnet or mainnet version of address * @param xpub extended public key to generate address from * @param i derivation index of address to generate. Up to 2^31 addresses can be generated. * @returns blockchain address */ const generateAddressFromXPub = (currency, testnet, xpub, i) => { switch (currency) { case model_1.Currency.BTC: return generateBtcAddress(testnet, xpub, i); case model_1.Currency.TRON: case model_1.Currency.USDT_TRON: case model_1.Currency.INRT_TRON: return generateTronAddress(xpub, i); case model_1.Currency.FLOW: case model_1.Currency.FUSD: return generateFlowPublicKey(xpub, i); case model_1.Currency.LTC: return generateLtcAddress(testnet, xpub, i); case model_1.Currency.DOGE: return generateDogeAddress(testnet, xpub, i); case model_1.Currency.CELO: case model_1.Currency.CEUR: case model_1.Currency.CUSD: return generateCeloAddress(testnet, xpub, i); case model_1.Currency.BCH: return generateBchAddress(testnet, xpub, i); case model_1.Currency.USDT: case model_1.Currency.WBTC: case model_1.Currency.LEO: case model_1.Currency.LINK: case model_1.Currency.UNI: case model_1.Currency.FREE: case model_1.Currency.MKR: case model_1.Currency.USDC: case model_1.Currency.BAT: case model_1.Currency.TUSD: case model_1.Currency.PAX: case model_1.Currency.PAXG: case model_1.Currency.MATIC_ETH: case model_1.Currency.PLTC: case model_1.Currency.XCON: case model_1.Currency.REVV: case model_1.Currency.SAND: case model_1.Currency.ETH: case model_1.Currency.BSC: case model_1.Currency.MATIC: case model_1.Currency.USDT_MATIC: case model_1.Currency.USDC_MATIC: case model_1.Currency.USDC_MATIC_NATIVE: case model_1.Currency.LATOKEN: case model_1.Currency.COIIN: case model_1.Currency.BETH: case model_1.Currency.GAMEE: case model_1.Currency.INTENT: case model_1.Currency.EURTENT: case model_1.Currency.GOLDAX: case model_1.Currency.BUSD: case model_1.Currency.KLAY: case model_1.Currency.USDC_BSC: case model_1.Currency.COIIN_BSC: case model_1.Currency.B2U_BSC: case model_1.Currency.CAKE: case model_1.Currency.HAG: case model_1.Currency.BUSD_BSC: case model_1.Currency.GMC_BSC: case model_1.Currency.GMC: case model_1.Currency.BBTC: case model_1.Currency.BADA: case model_1.Currency.RMD: case model_1.Currency.WBNB: case model_1.Currency.BDOT: case model_1.Currency.BXRP: case model_1.Currency.BLTC: case model_1.Currency.BBCH: case model_1.Currency.MMY: return generateEthAddress(testnet, xpub, i); case model_1.Currency.ONE: return generateOneAddress(testnet, xpub, i); case model_1.Currency.XDC: return generateXdcAddress(testnet, xpub, i); case model_1.Currency.EGLD: return exports.generateEgldAddress(testnet, xpub, i); case model_1.Currency.VET: return generateVetAddress(testnet, xpub, i); case model_1.Currency.ADA: return cardano_crypto_1.default.generateAddress(testnet, xpub, i); default: throw new Error('Unsupported blockchain.'); } }; exports.generateAddressFromXPub = generateAddressFromXPub; /** * Generate private key from mnemonic seed * @param currency type of blockchain * @param testnet testnet or mainnet version of address * @param mnemonic mnemonic to generate private key from * @param i derivation index of private key to generate. * @returns blockchain private key to the address */ const generatePrivateKeyFromMnemonic = (currency, testnet, mnemonic, i) => { switch (currency) { case model_1.Currency.BTC: return generateBtcPrivateKey(testnet, mnemonic, i); case model_1.Currency.LTC: return generateLtcPrivateKey(testnet, mnemonic, i); case model_1.Currency.DOGE: return generateDogePrivateKey(testnet, mnemonic, i); case model_1.Currency.BCH: return generateBchPrivateKey(testnet, mnemonic, i); case model_1.Currency.TRON: case model_1.Currency.USDT_TRON: case model_1.Currency.INRT_TRON: return generateTronPrivateKey(mnemonic, i); case model_1.Currency.MATIC: case model_1.Currency.USDT_MATIC: case model_1.Currency.USDC_MATIC: case model_1.Currency.USDC_MATIC_NATIVE: return generatePolygonPrivateKey(testnet, mnemonic, i); case model_1.Currency.FLOW: case model_1.Currency.FUSD: return generateFlowPrivateKey(mnemonic, i); case model_1.Currency.CELO: case model_1.Currency.CEUR: case model_1.Currency.CUSD: return generateCeloPrivateKey(testnet, mnemonic, i); case model_1.Currency.USDT: case model_1.Currency.WBTC: case model_1.Currency.LEO: case model_1.Currency.LINK: case model_1.Currency.UNI: case model_1.Currency.FREE: case model_1.Currency.MKR: case model_1.Currency.LATOKEN: case model_1.Currency.COIIN: case model_1.Currency.USDC: case model_1.Currency.RMD: case model_1.Currency.BAT: case model_1.Currency.TUSD: case model_1.Currency.PAX: case model_1.Currency.PAXG: case model_1.Currency.PLTC: case model_1.Currency.XCON: case model_1.Currency.REVV: case model_1.Currency.SAND: case model_1.Currency.ETH: case model_1.Currency.MATIC_ETH: case model_1.Currency.BSC: case model_1.Currency.BETH: case model_1.Currency.GAMEE: case model_1.Currency.INTENT: case model_1.Currency.EURTENT: case model_1.Currency.GOLDAX: case model_1.Currency.BBTC: case model_1.Currency.BADA: case model_1.Currency.WBNB: case model_1.Currency.BUSD: case model_1.Currency.USDC_BSC: case model_1.Currency.COIIN_BSC: case model_1.Currency.B2U_BSC: case model_1.Currency.CAKE: case model_1.Currency.HAG: case model_1.Currency.BUSD_BSC: case model_1.Currency.GMC: case model_1.Currency.GMC_BSC: case model_1.Currency.BDOT: case model_1.Currency.BXRP: case model_1.Currency.BLTC: case model_1.Currency.BBCH: case model_1.Currency.MMY: return generateEthPrivateKey(testnet, mnemonic, i); case model_1.Currency.ONE: return generateOnePrivateKey(testnet, mnemonic, i); case model_1.Currency.KLAY: return generateKlayPrivateKey(testnet, mnemonic, i); case model_1.Currency.XDC: return generateXdcPrivateKey(testnet, mnemonic, i); case model_1.Currency.EGLD: return generateEgldPrivateKey(testnet, mnemonic, i); case model_1.Currency.VET: return generateVetPrivateKey(testnet, mnemonic, i); case model_1.Currency.ADA: return cardano_crypto_1.default.generatePrivateKey(mnemonic, i); default: throw new Error('Unsupported blockchain.'); } }; exports.generatePrivateKeyFromMnemonic = generatePrivateKeyFromMnemonic; /** * Generate address from private key * @param currency type of blockchain * @param testnet testnet or mainnet version of address * @param privateKey private key to use * @returns blockchain private key to the address */ const generateAddressFromPrivatekey = (currency, testnet, privateKey) => { switch (currency) { case model_1.Currency.BTC: return convertBtcPrivateKey(testnet, privateKey); case model_1.Currency.BNB: return crypto_1.getAddressFromPrivateKey(privateKey, testnet ? 'tbnb' : 'bnb'); case model_1.Currency.TRON: case model_1.Currency.USDT_TRON: case model_1.Currency.INRT_TRON: return TronWeb.address.fromPrivateKey(privateKey); case model_1.Currency.ETH: case model_1.Currency.USDT: case model_1.Currency.GMC: case model_1.Currency.GMC_BSC: case model_1.Currency.RMD: case model_1.Currency.WBTC: case model_1.Currency.LEO: case model_1.Currency.LINK: case model_1.Currency.UNI: case model_1.Currency.FREE: case model_1.Currency.MKR: case model_1.Currency.USDC: case model_1.Currency.BAT: case model_1.Currency.TUSD: case model_1.Currency.PAX: case model_1.Currency.PAXG: case model_1.Currency.PLTC: case model_1.Currency.XCON: case model_1.Currency.LATOKEN: case model_1.Currency.COIIN: case model_1.Currency.REVV: case model_1.Currency.SAND: case model_1.Currency.MATIC_ETH: case model_1.Currency.BSC: case model_1.Currency.MMY: case model_1.Currency.MATIC: case model_1.Currency.KLAY: return convertEthPrivateKey(testnet, privateKey); case model_1.Currency.ONE: return convertOnePrivateKey(testnet, privateKey); case model_1.Currency.XDC: return convertXdcPrivateKey(testnet, privateKey); case model_1.Currency.EGLD: return convertEgldPrivateKey(testnet, privateKey); default: throw new Error('Unsupported blockchain.'); } }; exports.generateAddressFromPrivatekey = generateAddressFromPrivatekey; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93YWxsZXQvYWRkcmVzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscUVBQW9GO0FBQ3BGLCtDQUFvRDtBQUNwRCxhQUFhO0FBQ2IsZ0ZBQWdGO0FBQ2hGLCtDQUFpQztBQUNqQyxpQ0FBNEQ7QUFDNUQsaUNBQXVDO0FBQ3ZDLGlEQUEyRDtBQUMzRCxtREFBMEQ7QUFDMUQsbURBQXFDO0FBQ3JDLHVFQUFpRTtBQUNqRSxhQUFhO0FBQ2IsNENBc0JzQjtBQUN0QixvQ0FBb0M7QUFDcEMsc0VBQXVDO0FBQ3ZDLCtDQUFnRDtBQUNoRCwwREFBa0M7QUFFbEMsSUFBTyxhQUFhLEdBQUcsbUJBQVMsQ0FBQyxhQUFhLENBQUE7QUFDOUMsSUFBTyxRQUFRLEdBQUcsbUJBQVMsQ0FBQyxRQUFRLENBQUE7QUFFcEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNwQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxDQUFDO0FBQ25ELGlDQUFpQztBQUNqQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUNyRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDdkMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3JDLDJDQUEyQztBQUMzQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7QUFpQm5DOzs7Ozs7R0FNRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxPQUFnQixFQUFFLElBQVksRUFBRSxDQUFTLEVBQUUsRUFBRTtJQUN2RSxNQUFNLE9BQU8sR0FB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