@tatumio/tatum-v1
Version:
Tatum API client allows browsers and Node.js clients to interact with Tatum API.
387 lines • 29.2 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateWallet = exports.generateAlgoWallet = exports.generateAdaWallet = exports.generateXlmWallet = exports.generateXrpWallet = exports.generateLtcWallet = exports.generateTronWallet = exports.generateDogeWallet = exports.generateBtcWallet = exports.generateBchWallet = exports.generateCeloWallet = exports.generateXdcWallet = exports.generateBscWallet = exports.generateFlowWallet = exports.generateEgldWallet = exports.generateOneWallet = exports.generateKlaytnWallet = exports.generatePolygonWallet = exports.generateEthWallet = exports.generateVetWallet = exports.generateBnbWallet = void 0;
const crypto_1 = require("@binance-chain/javascript-sdk/lib/crypto");
const bip39_1 = require("bip39");
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
const ethereumjs_wallet_1 = require("ethereumjs-wallet");
// @ts-ignore
const hdkey_1 = __importDefault(require("hdkey"));
const ripple_lib_1 = require("ripple-lib");
const stellar_sdk_1 = require("stellar-sdk");
const constants_1 = require("../constants");
const model_1 = require("../model");
const cardano_crypto_1 = __importDefault(require("./cardano.crypto"));
const algosdk = require('algosdk');
const base32 = require('base32.js');
/**
* Generate BnB wallet
* @param testnet testnet or mainnet version of address
* @returns wallet
*/
const generateBnbWallet = async (testnet) => {
const privateKey = crypto_1.generatePrivateKey();
const prefix = testnet ? 'tbnb' : 'bnb';
return {
address: crypto_1.getAddressFromPrivateKey(privateKey, prefix),
privateKey,
};
};
exports.generateBnbWallet = generateBnbWallet;
/**
* Generate VeChain wallet
* @param testnet testnet or mainnet version of address
* @param mnem mnemonic seed to use
* @returns wallet
*/
const generateVetWallet = async (testnet, mnem) => {
const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.VET_DERIVATION_PATH;
const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem));
const derivePath = hdwallet.derivePath(path);
return {
xpub: derivePath.publicExtendedKey().toString(),
mnemonic: mnem,
};
};
exports.generateVetWallet = generateVetWallet;
/**
* Generate Ethereum or any other ERC20 wallet
* @param testnet testnet or mainnet version of address
* @param mnem mnemonic seed to use
* @returns wallet
*/
const generateEthWallet = async (testnet, mnem) => {
const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.ETH_DERIVATION_PATH;
const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem));
const derivePath = hdwallet.derivePath(path);
return {
xpub: derivePath.publicExtendedKey().toString(),
mnemonic: mnem,
};
};
exports.generateEthWallet = generateEthWallet;
/**
* Generate Polygon or any other ERC20 wallet
* @param testnet testnet or mainnet version of address
* @param mnem mnemonic seed to use
* @returns wallet
*/
const generatePolygonWallet = async (testnet, mnem) => {
const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.MATIC_DERIVATION_PATH;
const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem));
const derivePath = hdwallet.derivePath(path);
return {
xpub: derivePath.publicExtendedKey().toString(),
mnemonic: mnem,
};
};
exports.generatePolygonWallet = generatePolygonWallet;
/**
* Generate Polygon or any other ERC20 wallet
* @param testnet testnet or mainnet version of address
* @param mnem mnemonic seed to use
* @returns wallet
*/
const generateKlaytnWallet = async (testnet, mnem) => {
const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.KLAYTN_DERIVATION_PATH;
const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem));
const derivePath = hdwallet.derivePath(path);
return {
xpub: derivePath.publicExtendedKey().toString(),
mnemonic: mnem,
};
};
exports.generateKlaytnWallet = generateKlaytnWallet;
/**
* Generate Harmony or any other ERC20 wallet
* @param testnet testnet or mainnet version of address
* @param mnem mnemonic seed to use
* @returns wallet
*/
const generateOneWallet = async (testnet, mnem) => {
const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.ONE_DERIVATION_PATH;
const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem));
const derivePath = hdwallet.derivePath(path);
return {
xpub: derivePath.publicExtendedKey().toString(),
mnemonic: mnem,
};
};
exports.generateOneWallet = generateOneWallet;
/**
* Generate EGLD wallet
* @param testnet
* @param mnem mnemonic seed to use
* @returns wallet
*/
const generateEgldWallet = async (mnem) => {
return {
mnemonic: mnem,
};
};
exports.generateEgldWallet = generateEgldWallet;
/**
* Generate Flow or FUSD wallet
* @param mnem mnemonic seed to use
* @returns wallet
*/
const generateFlowWallet = async (mnem) => {
const hdwallet = hdkey_1.default.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem));
return {
mnemonic: mnem,
xpub: hdwallet.derive(constants_1.FLOW_DERIVATION_PATH).toJSON().xpub,
};
};
exports.generateFlowWallet = generateFlowWallet;
/**
* Generate BSC or any other BEP-20 or BEP-721 wallet
* @param testnet testnet or mainnet version of address
* @param mnem mnemonic seed to use
* @returns wallet
*/
const generateBscWallet = async (testnet, mnem) => {
return exports.generateEthWallet(testnet, mnem);
};
exports.generateBscWallet = generateBscWallet;
const generateXdcWallet = async (testnet, mnem) => {
const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.XDC_DERIVATION_PATH;
const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem));
const derivePath = hdwallet.derivePath(path);
return {
xpub: derivePath.publicExtendedKey().toString(),
mnemonic: mnem,
};
};
exports.generateXdcWallet = generateXdcWallet;
/**
* Generate Celo or any other ERC20 wallet
* @param testnet testnet or mainnet version of address
* @param mnem mnemonic seed to use
* @returns wallet
*/
const generateCeloWallet = async (testnet, mnem) => {
const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.CELO_DERIVATION_PATH;
const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem));
const derivePath = hdwallet.derivePath(path);
return {
xpub: derivePath.publicExtendedKey().toString(),
mnemonic: mnem,
};
};
exports.generateCeloWallet = generateCeloWallet;
/**
* Generate Bitcoin Cash wallet
* @param testnet testnet or mainnet version of address
* @param mnem mnemonic seed to use
* @returns wallet
*/
const generateBchWallet = async (testnet, mnem) => {
const hdwallet = hdkey_1.default.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem), testnet ? bitcoinjs_lib_1.networks.testnet.bip32 : bitcoinjs_lib_1.networks.bitcoin.bip32);
return {
mnemonic: mnem,
xpub: hdwallet.derive(constants_1.BCH_DERIVATION_PATH).toJSON().xpub,
};
};
exports.generateBchWallet = generateBchWallet;
/**
* Generate Bitcoin wallet
* @param testnet testnet or mainnet version of address
* @param mnem mnemonic seed to use
* @returns wallet
*/
const generateBtcWallet = async (testnet, mnem) => {
const hdwallet = hdkey_1.default.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem), testnet ? bitcoinjs_lib_1.networks.testnet.bip32 : bitcoinjs_lib_1.networks.bitcoin.bip32);
return {
mnemonic: mnem,
xpub: hdwallet.derive(testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.BTC_DERIVATION_PATH).toJSON().xpub,
};
};
exports.generateBtcWallet = generateBtcWallet;
/**
* Generate Doge wallet
* @param testnet testnet or mainnet version of address
* @param mnem mnemonic seed to use
* @returns wallet
*/
const generateDogeWallet = async (testnet, mnem) => {
const hdwallet = hdkey_1.default.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem), testnet ? constants_1.DOGE_TEST_NETWORK.bip32 : constants_1.DOGE_NETWORK.bip32);
return {
mnemonic: mnem,
xpub: hdwallet.derive(testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.DOGE_DERIVATION_PATH).toJSON().xpub,
};
};
exports.generateDogeWallet = generateDogeWallet;
/**
* Generate Tron wallet
* @returns mnemonic for the wallet
*/
const generateTronWallet = async (mnem) => {
const w = bitcoinjs_lib_1.bip32.fromSeed(await bip39_1.mnemonicToSeed(mnem));
const bip32Interface = w.derivePath(constants_1.TRON_DERIVATION_PATH).neutered();
return {
mnemonic: mnem,
xpub: bip32Interface.toBase58(),
};
};
exports.generateTronWallet = generateTronWallet;
/**
* Generate Litecoin wallet
* @param testnet testnet or mainnet version of address
* @param mnem mnemonic seed to use
* @returns wallet
*/
const generateLtcWallet = async (testnet, mnem) => {
const hdwallet = hdkey_1.default.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem), testnet ? constants_1.LTC_TEST_NETWORK.bip32 : constants_1.LTC_NETWORK.bip32);
return {
mnemonic: mnem,
xpub: hdwallet.derive(testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.LTC_DERIVATION_PATH).toJSON().xpub,
};
};
exports.generateLtcWallet = generateLtcWallet;
/**
* Generate Xrp address and secret.
*/
const generateXrpWallet = () => {
const { address, secret } = new ripple_lib_1.RippleAPI().generateAddress();
return { address, secret };
};
exports.generateXrpWallet = generateXrpWallet;
/**
* Generate Stellar address and secret.
* @param secret secret of the account to generate address
*/
const generateXlmWallet = (secret) => {
const keypair = secret ? stellar_sdk_1.Keypair.fromSecret(secret) : stellar_sdk_1.Keypair.random();
return { address: keypair.publicKey(), secret: keypair.secret() };
};
exports.generateXlmWallet = generateXlmWallet;
/**
* Generate ADA wallet
* @param mnemonic mnemonic seed to use
* @returns wallet
*/
const generateAdaWallet = async (mnemonic) => {
return { mnemonic, xpub: await cardano_crypto_1.default.generateXPublicKey(mnemonic) };
};
exports.generateAdaWallet = generateAdaWallet;
/**
* Generate Algo wallet
* @param mnem mnemonic seed to use
* @returns address and secret
*/
const generateAlgoWallet = async (mnem) => {
const account = mnem ? algosdk.mnemonicToSecretKey(mnem) : algosdk.generateAccount();
const encoder = new base32.Encoder({ type: 'rfc4648' });
const secret = encoder.write(account.sk).finalize();
return {
address: account.addr,
secret: secret,
};
};
exports.generateAlgoWallet = generateAlgoWallet;
/**
* Generate wallet
* @param currency blockchain to generate wallet for
* @param testnet testnet or mainnet version of address
* @param mnemonic mnemonic seed to use. If not present, new one will be generated
* @returns wallet or a combination of address and private key
*/
const generateWallet = (currency, testnet, mnemonic) => {
const mnem = mnemonic ? mnemonic : bip39_1.generateMnemonic(256);
switch (currency) {
case model_1.Currency.BTC:
return exports.generateBtcWallet(testnet, mnem);
case model_1.Currency.DOGE:
return exports.generateDogeWallet(testnet, mnem);
case model_1.Currency.LTC:
return exports.generateLtcWallet(testnet, mnem);
case model_1.Currency.BCH:
return exports.generateBchWallet(testnet, mnem);
case model_1.Currency.TRON:
case model_1.Currency.USDT_TRON:
case model_1.Currency.INRT_TRON:
return exports.generateTronWallet(mnem);
case model_1.Currency.FLOW:
case model_1.Currency.FUSD:
return exports.generateFlowWallet(mnem);
case model_1.Currency.CELO:
case model_1.Currency.CEUR:
case model_1.Currency.CUSD:
return exports.generateCeloWallet(testnet, mnem);
case model_1.Currency.ONE:
return exports.generateOneWallet(testnet, mnem);
case model_1.Currency.KLAY:
return exports.generateKlaytnWallet(testnet, mnem);
case model_1.Currency.EGLD:
return exports.generateEgldWallet(mnem);
case model_1.Currency.USDT:
case model_1.Currency.WBTC:
case model_1.Currency.LEO:
case model_1.Currency.REVV:
case model_1.Currency.LATOKEN:
case model_1.Currency.COIIN:
case model_1.Currency.SAND:
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.BUSD:
case model_1.Currency.USDC_BSC:
case model_1.Currency.COIIN_BSC:
case model_1.Currency.GMC:
case model_1.Currency.GMC_BSC:
case model_1.Currency.PAX:
case model_1.Currency.PAXG:
case model_1.Currency.PLTC:
case model_1.Currency.XCON:
case model_1.Currency.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.CAKE:
case model_1.Currency.MATIC_ETH:
case model_1.Currency.HAG:
case model_1.Currency.BUSD_BSC:
case model_1.Currency.BBTC:
case model_1.Currency.BADA:
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 exports.generateEthWallet(testnet, mnem);
case model_1.Currency.MATIC:
case model_1.Currency.USDC_MATIC:
case model_1.Currency.USDC_MATIC_NATIVE:
case model_1.Currency.USDT_MATIC:
return exports.generatePolygonWallet(testnet, mnem);
case model_1.Currency.XDC:
return exports.generateXdcWallet(testnet, mnem);
case model_1.Currency.XRP:
return exports.generateXrpWallet();
case model_1.Currency.XLM:
return exports.generateXlmWallet();
case model_1.Currency.VET:
return exports.generateVetWallet(testnet, mnem);
case model_1.Currency.BNB:
return exports.generateBnbWallet(testnet);
case model_1.Currency.ADA:
return exports.generateAdaWallet(mnem);
case model_1.Currency.ALGO:
return exports.generateAlgoWallet(mnemonic);
default:
throw new Error('Unsupported blockchain.');
}
};
exports.generateWallet = generateWallet;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dhbGxldC93YWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscUVBQXdHO0FBQ3hHLGlDQUF5RDtBQUN6RCxpREFBZ0Q7QUFDaEQseURBQXNEO0FBQ3RELGFBQWE7QUFDYixrREFBMEI7QUFDMUIsMkNBQXVDO0FBQ3ZDLDZDQUFzQztBQUN0Qyw0Q0FtQnNCO0FBQ3RCLG9DQUFvQztBQUNwQyxzRUFBdUM7QUFFdkMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQWVwQzs7OztHQUlHO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRyxLQUFLLEVBQUUsT0FBZ0IsRUFBRSxFQUFFO0lBQzFELE1BQU0sVUFBVSxHQUFHLDJCQUFrQixFQUFFLENBQUE7SUFDdkMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtJQUN2QyxPQUFPO1FBQ0wsT0FBTyxFQUFFLGlDQUF3QixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUM7UUFDckQsVUFBVTtLQUNYLENBQUE7QUFDSCxDQUFDLENBQUE7QUFQWSxRQUFBLGlCQUFpQixxQkFPN0I7QUFFRDs7Ozs7R0FLRztBQUNJLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxFQUFFLE9BQWdCLEVBQUUsSUFBWSxFQUFtQixFQUFFO0lBQ3pGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUNBQXVCLENBQUMsQ0FBQyxDQUFDLCtCQUFtQixDQUFBO0lBQ3BFLE1BQU0sUUFBUSxHQUFHLHlCQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sc0JBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ3BFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxV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