UNPKG

@okxweb3/coin-stellar

Version:

@okxweb3/coin-stellar is a Stellar SDK for building Web3 wallets and applications. It supports Stellar and PI blockchains, enabling private key management, address generation, transaction signing, trustline creation, and asset transfers

190 lines 7.77 kB
"use strict"; 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()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.StellarWallet = void 0; const coin_base_1 = require("@okxweb3/coin-base"); const stellar_base_1 = require("./stellar_base"); const crypto_lib_1 = require("@okxweb3/crypto-lib"); const utils_1 = require("./utils"); class StellarWallet extends coin_base_1.BaseWallet { getDerivedPath(param) { return __awaiter(this, void 0, void 0, function* () { return `m/44'/148'/${param.index}'`; }); } getRandomPrivateKey() { return __awaiter(this, void 0, void 0, function* () { try { let pri = crypto_lib_1.signUtil.ed25519.ed25519_getRandomPrivateKey(false, "hex"); return Promise.resolve(stellar_base_1.StrKey.encodeEd25519SecretSeed(crypto_lib_1.base.fromHex(pri))); } catch (e) { return Promise.reject(coin_base_1.GenPrivateKeyError); } }); } getDerivedPrivateKey(param) { return __awaiter(this, void 0, void 0, function* () { try { const key = yield crypto_lib_1.signUtil.ed25519.ed25519_getDerivedPrivateKey(param.mnemonic, param.hdPath, false, "hex"); return Promise.resolve(stellar_base_1.StrKey.encodeEd25519SecretSeed(crypto_lib_1.base.fromHex(key))); } catch (e) { return Promise.reject(coin_base_1.GenPrivateKeyError); } }); } validPrivateKey(param) { let isValid; try { let k = stellar_base_1.Keypair.fromSecret(param.privateKey); let rawKey = k.rawSecretKey(); if (rawKey.every(byte => byte === 0)) { isValid = false; } else { isValid = true; } } catch (e) { isValid = false; } const data = { isValid: isValid, privateKey: param.privateKey }; return Promise.resolve(data); } getNewAddress(param) { let k = stellar_base_1.Keypair.fromSecret(param.privateKey); let rawKey = k.rawSecretKey(); if (rawKey.every(byte => byte === 0)) { throw new Error("invalid key"); } return Promise.resolve({ address: k.publicKey(), publicKey: crypto_lib_1.base.toHex(k.rawPublicKey()), }); } getMuxedAddress(param) { if (!param.address) { throw new Error('Missing address'); } let muxedAcc = (0, stellar_base_1.encodeMuxedAccount)(param.address, param.id); return Promise.resolve((0, stellar_base_1.encodeMuxedAccountToAddress)(muxedAcc)); } signMessage(param) { return Promise.reject(coin_base_1.NotImplementedError); } calcTxHash(param) { const tx = stellar_base_1.TransactionBuilder.fromXDR(param.data.tx, param.data.networkPassphrase); return Promise.resolve(crypto_lib_1.base.toHex(tx.hash())); } signTransaction(param) { const txParam = param.data; let timebounds = txParam.timebounds ? txParam.timebounds : { minTime: 0, maxTime: 0 }; const transactionBuilder = new stellar_base_1.TransactionBuilder(new stellar_base_1.Account(txParam.source, txParam.sequence), { fee: txParam.fee, timebounds: timebounds, ledgerbounds: txParam.ledgerbounds, minAccountSequence: txParam.minAccountSequence, minAccountSequenceAge: txParam.minAccountSequenceAge, minAccountSequenceLedgerGap: txParam.minAccountSequenceLedgerGap, extraSigners: txParam.extraSigners, memo: txParam.memo ? stellar_base_1.Memo.text(txParam.memo) : stellar_base_1.Memo.none(), networkPassphrase: txParam.networkPassphrase, }); if (!txParam.decimals) { throw new Error("missing decimals"); } if (txParam.type === "transfer") { if (!txParam.toAddress) { throw new Error("missing toAddress"); } let op; if (txParam.asset) { const asset = new stellar_base_1.Asset(txParam.asset.assetName, txParam.asset.issuer); op = stellar_base_1.Operation.payment({ destination: txParam.toAddress, asset: asset, amount: (0, utils_1.convertWithDecimals)(txParam.asset.amount, txParam.decimals), }); } else { if (!txParam.amount) { throw new Error("missing amount"); } op = stellar_base_1.Operation.payment({ destination: txParam.toAddress, asset: stellar_base_1.Asset.native(), amount: (0, utils_1.convertWithDecimals)(txParam.amount, txParam.decimals), }); } transactionBuilder.addOperation(op); } else if (txParam.type === "changeTrust") { if (!txParam.asset) { throw new Error("missing asset"); } const asset = new stellar_base_1.Asset(txParam.asset.assetName, txParam.asset.issuer); let op = stellar_base_1.Operation.changeTrust({ asset: asset, limit: (0, utils_1.convertWithDecimals)(txParam.asset.amount, txParam.decimals), }); transactionBuilder.addOperation(op); } else { throw new Error("invalid tx type"); } let transaction = transactionBuilder.build(); if (param.privateKey) { let kp = stellar_base_1.Keypair.fromSecret(param.privateKey); transaction.sign(kp); } return Promise.resolve(transaction.toXDR()); } signCommonMsg(params) { const _super = Object.create(null, { signCommonMsg: { get: () => super.signCommonMsg } }); return __awaiter(this, void 0, void 0, function* () { let k = stellar_base_1.Keypair.fromSecret(params.privateKey); return _super.signCommonMsg.call(this, { privateKey: params.privateKey, privateKeyHex: crypto_lib_1.base.toHex(k.rawSecretKey()), message: params.message, signType: coin_base_1.SignType.ED25519 }); }); } validAddress(param) { let isValid; try { stellar_base_1.StrKey.decodeEd25519PublicKey(param.address); isValid = true; } catch (e) { try { (0, stellar_base_1.decodeAddressToMuxedAccount)(param.address); isValid = true; } catch (e) { isValid = false; } } return Promise.resolve({ isValid: isValid, address: param.address, }); } } exports.StellarWallet = StellarWallet; //# sourceMappingURL=StellarWallet.js.map