@tatumio/tatum-v1
Version:
Tatum API client allows browsers and Node.js clients to interact with Tatum API.
816 lines • 65.6 kB
JavaScript
"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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