@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
JavaScript
;
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