@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
525 lines • 23.9 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (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.Operation = exports.AuthClawbackEnabledFlag = exports.AuthImmutableFlag = exports.AuthRevocableFlag = exports.AuthRequiredFlag = void 0;
const js_xdr_1 = require("@stellar/js-xdr");
const bignumber_1 = __importDefault(require("./util/bignumber"));
const util_1 = require("./util/util");
const continued_fraction_1 = require("./util/continued_fraction");
const asset_1 = require("./asset");
const liquidity_pool_asset_1 = require("./liquidity_pool_asset");
const claimant_1 = require("./claimant");
const strkey_1 = require("./strkey");
const liquidity_pool_id_1 = require("./liquidity_pool_id");
const xdr_1 = __importDefault(require("./xdr"));
const ops = __importStar(require("./operations"));
const decode_encode_muxed_account_1 = require("./util/decode_encode_muxed_account");
const ONE = 10000000;
const MAX_INT64 = '9223372036854775807';
exports.AuthRequiredFlag = 1 << 0;
exports.AuthRevocableFlag = 1 << 1;
exports.AuthImmutableFlag = 1 << 2;
exports.AuthClawbackEnabledFlag = 1 << 3;
class Operation {
static setSourceAccount(opAttributes, opts) {
if (opts.source) {
try {
opAttributes.sourceAccount = (0, decode_encode_muxed_account_1.decodeAddressToMuxedAccount)(opts.source);
}
catch (e) {
throw new Error('Source address is invalid');
}
}
}
static fromXDRObject(operation) {
var _a;
const result = {};
if (operation.sourceAccount()) {
result.source = (0, decode_encode_muxed_account_1.encodeMuxedAccountToAddress)(operation.sourceAccount());
}
const attrs = operation.body().value();
const operationName = operation.body().switch().name;
switch (operationName) {
case 'createAccount': {
result.type = 'createAccount';
result.destination = accountIdtoAddress(attrs.destination());
result.startingBalance = this._fromXDRAmount(attrs.startingBalance());
break;
}
case 'payment': {
result.type = 'payment';
result.destination = (0, decode_encode_muxed_account_1.encodeMuxedAccountToAddress)(attrs.destination());
result.asset = asset_1.Asset.fromOperation(attrs.asset());
result.amount = this._fromXDRAmount(attrs.amount());
break;
}
case 'pathPaymentStrictReceive': {
result.type = 'pathPaymentStrictReceive';
result.sendAsset = asset_1.Asset.fromOperation(attrs.sendAsset());
result.sendMax = this._fromXDRAmount(attrs.sendMax());
result.destination = (0, decode_encode_muxed_account_1.encodeMuxedAccountToAddress)(attrs.destination());
result.destAsset = asset_1.Asset.fromOperation(attrs.destAsset());
result.destAmount = this._fromXDRAmount(attrs.destAmount());
result.path = [];
const path = attrs.path();
Object.keys(path).forEach((pathKey) => {
result.path.push(asset_1.Asset.fromOperation(path[pathKey]));
});
break;
}
case 'pathPaymentStrictSend': {
result.type = 'pathPaymentStrictSend';
result.sendAsset = asset_1.Asset.fromOperation(attrs.sendAsset());
result.sendAmount = this._fromXDRAmount(attrs.sendAmount());
result.destination = (0, decode_encode_muxed_account_1.encodeMuxedAccountToAddress)(attrs.destination());
result.destAsset = asset_1.Asset.fromOperation(attrs.destAsset());
result.destMin = this._fromXDRAmount(attrs.destMin());
result.path = [];
const path = attrs.path();
Object.keys(path).forEach((pathKey) => {
result.path.push(asset_1.Asset.fromOperation(path[pathKey]));
});
break;
}
case 'changeTrust': {
result.type = 'changeTrust';
switch (attrs.line().switch()) {
case xdr_1.default.AssetType.assetTypePoolShare():
result.line = liquidity_pool_asset_1.LiquidityPoolAsset.fromOperation(attrs.line());
break;
default:
result.line = asset_1.Asset.fromOperation(attrs.line());
break;
}
result.limit = this._fromXDRAmount(attrs.limit());
break;
}
case 'allowTrust': {
result.type = 'allowTrust';
result.trustor = accountIdtoAddress(attrs.trustor());
result.assetCode = attrs.asset().value().toString();
result.assetCode = (0, util_1.trimEnd)(result.assetCode, '\0');
result.authorize = attrs.authorize();
break;
}
case 'setOptions': {
result.type = 'setOptions';
if (attrs.inflationDest()) {
result.inflationDest = accountIdtoAddress(attrs.inflationDest());
}
result.clearFlags = attrs.clearFlags();
result.setFlags = attrs.setFlags();
result.masterWeight = attrs.masterWeight();
result.lowThreshold = attrs.lowThreshold();
result.medThreshold = attrs.medThreshold();
result.highThreshold = attrs.highThreshold();
result.homeDomain =
attrs.homeDomain() !== undefined
? attrs.homeDomain().toString('ascii')
: undefined;
if (attrs.signer()) {
const signer = {};
const arm = attrs.signer().key().arm();
if (arm === 'ed25519') {
signer.ed25519PublicKey = accountIdtoAddress(attrs.signer().key());
}
else if (arm === 'preAuthTx') {
signer.preAuthTx = attrs.signer().key().preAuthTx();
}
else if (arm === 'hashX') {
signer.sha256Hash = attrs.signer().key().hashX();
}
else if (arm === 'ed25519SignedPayload') {
const signedPayload = attrs.signer().key().ed25519SignedPayload();
signer.ed25519SignedPayload = strkey_1.StrKey.encodeSignedPayload(signedPayload.toXDR());
}
signer.weight = attrs.signer().weight();
result.signer = signer;
}
break;
}
case 'manageOffer':
case 'manageSellOffer': {
result.type = 'manageSellOffer';
result.selling = asset_1.Asset.fromOperation(attrs.selling());
result.buying = asset_1.Asset.fromOperation(attrs.buying());
result.amount = this._fromXDRAmount(attrs.amount());
result.price = this._fromXDRPrice(attrs.price());
result.offerId = attrs.offerId().toString();
break;
}
case 'manageBuyOffer': {
result.type = 'manageBuyOffer';
result.selling = asset_1.Asset.fromOperation(attrs.selling());
result.buying = asset_1.Asset.fromOperation(attrs.buying());
result.buyAmount = this._fromXDRAmount(attrs.buyAmount());
result.price = this._fromXDRPrice(attrs.price());
result.offerId = attrs.offerId().toString();
break;
}
case 'createPassiveOffer':
case 'createPassiveSellOffer': {
result.type = 'createPassiveSellOffer';
result.selling = asset_1.Asset.fromOperation(attrs.selling());
result.buying = asset_1.Asset.fromOperation(attrs.buying());
result.amount = this._fromXDRAmount(attrs.amount());
result.price = this._fromXDRPrice(attrs.price());
break;
}
case 'accountMerge': {
result.type = 'accountMerge';
result.destination = (0, decode_encode_muxed_account_1.encodeMuxedAccountToAddress)(attrs);
break;
}
case 'manageData': {
result.type = 'manageData';
result.name = attrs.dataName().toString('ascii');
result.value = attrs.dataValue();
break;
}
case 'inflation': {
result.type = 'inflation';
break;
}
case 'bumpSequence': {
result.type = 'bumpSequence';
result.bumpTo = attrs.bumpTo().toString();
break;
}
case 'createClaimableBalance': {
result.type = 'createClaimableBalance';
result.asset = asset_1.Asset.fromOperation(attrs.asset());
result.amount = this._fromXDRAmount(attrs.amount());
result.claimants = [];
attrs.claimants().forEach((claimant) => {
result.claimants.push(claimant_1.Claimant.fromXDR(claimant));
});
break;
}
case 'claimClaimableBalance': {
result.type = 'claimClaimableBalance';
result.balanceId = attrs.toXDR('hex');
break;
}
case 'beginSponsoringFutureReserves': {
result.type = 'beginSponsoringFutureReserves';
result.sponsoredId = accountIdtoAddress(attrs.sponsoredId());
break;
}
case 'endSponsoringFutureReserves': {
result.type = 'endSponsoringFutureReserves';
break;
}
case 'revokeSponsorship': {
extractRevokeSponshipDetails(attrs, result);
break;
}
case 'clawback': {
result.type = 'clawback';
result.amount = this._fromXDRAmount(attrs.amount());
result.from = (0, decode_encode_muxed_account_1.encodeMuxedAccountToAddress)(attrs.from());
result.asset = asset_1.Asset.fromOperation(attrs.asset());
break;
}
case 'clawbackClaimableBalance': {
result.type = 'clawbackClaimableBalance';
result.balanceId = attrs.toXDR('hex');
break;
}
case 'setTrustLineFlags': {
result.type = 'setTrustLineFlags';
result.asset = asset_1.Asset.fromOperation(attrs.asset());
result.trustor = accountIdtoAddress(attrs.trustor());
const clears = attrs.clearFlags();
const sets = attrs.setFlags();
const mapping = {
authorized: xdr_1.default.TrustLineFlags.authorizedFlag(),
authorizedToMaintainLiabilities: xdr_1.default.TrustLineFlags.authorizedToMaintainLiabilitiesFlag(),
clawbackEnabled: xdr_1.default.TrustLineFlags.trustlineClawbackEnabledFlag()
};
const getFlagValue = (key) => {
const bit = mapping[key].value;
if (sets & bit) {
return true;
}
if (clears & bit) {
return false;
}
return undefined;
};
result.flags = {};
Object.keys(mapping).forEach((flagName) => {
result.flags[flagName] = getFlagValue(flagName);
});
break;
}
case 'liquidityPoolDeposit': {
result.type = 'liquidityPoolDeposit';
result.liquidityPoolId = attrs.liquidityPoolId().toString('hex');
result.maxAmountA = this._fromXDRAmount(attrs.maxAmountA());
result.maxAmountB = this._fromXDRAmount(attrs.maxAmountB());
result.minPrice = this._fromXDRPrice(attrs.minPrice());
result.maxPrice = this._fromXDRPrice(attrs.maxPrice());
break;
}
case 'liquidityPoolWithdraw': {
result.type = 'liquidityPoolWithdraw';
result.liquidityPoolId = attrs.liquidityPoolId().toString('hex');
result.amount = this._fromXDRAmount(attrs.amount());
result.minAmountA = this._fromXDRAmount(attrs.minAmountA());
result.minAmountB = this._fromXDRAmount(attrs.minAmountB());
break;
}
case 'invokeHostFunction': {
result.type = 'invokeHostFunction';
result.func = attrs.hostFunction();
result.auth = (_a = attrs.auth()) !== null && _a !== void 0 ? _a : [];
break;
}
case 'extendFootprintTtl': {
result.type = 'extendFootprintTtl';
result.extendTo = attrs.extendTo();
break;
}
case 'restoreFootprint': {
result.type = 'restoreFootprint';
break;
}
default: {
throw new Error(`Unknown operation: ${operationName}`);
}
}
return result;
}
static isValidAmount(value, allowZero = false) {
if (typeof value !== 'string') {
return false;
}
let amount;
try {
amount = new bignumber_1.default(value);
}
catch (e) {
return false;
}
if ((!allowZero && amount.isZero()) ||
amount.isNegative() ||
amount.times(ONE).gt(new bignumber_1.default(MAX_INT64).toString()) ||
amount.decimalPlaces() > 7 ||
amount.isNaN() ||
!amount.isFinite()) {
return false;
}
return true;
}
static constructAmountRequirementsError(arg) {
return `${arg} argument must be of type String, represent a positive number and have at most 7 digits after the decimal`;
}
static _checkUnsignedIntValue(name, value, isValidFunction = null) {
if (typeof value === 'undefined') {
return undefined;
}
if (typeof value === 'string') {
value = parseFloat(value);
}
switch (true) {
case typeof value !== 'number' ||
!Number.isFinite(value) ||
value % 1 !== 0:
throw new Error(`${name} value is invalid`);
case value < 0:
throw new Error(`${name} value must be unsigned`);
case !isValidFunction ||
(isValidFunction && isValidFunction(value, name)):
return value;
default:
throw new Error(`${name} value is invalid`);
}
}
static _toXDRAmount(value) {
const amount = new bignumber_1.default(value).times(ONE);
return js_xdr_1.Hyper.fromString(amount.toString());
}
static _fromXDRAmount(value) {
return new bignumber_1.default(value).div(ONE).toFixed(7);
}
static _fromXDRPrice(price) {
const n = new bignumber_1.default(price.n());
return n.div(new bignumber_1.default(price.d())).toString();
}
static _toXDRPrice(price) {
let xdrObject;
if (price.n && price.d) {
xdrObject = new xdr_1.default.Price(price);
}
else {
const approx = (0, continued_fraction_1.best_r)(price);
xdrObject = new xdr_1.default.Price({
n: parseInt(approx[0], 10),
d: parseInt(approx[1], 10)
});
}
if (xdrObject.n() < 0 || xdrObject.d() < 0) {
throw new Error('price must be positive');
}
return xdrObject;
}
}
exports.Operation = Operation;
function extractRevokeSponshipDetails(attrs, result) {
switch (attrs.switch().name) {
case 'revokeSponsorshipLedgerEntry': {
const ledgerKey = attrs.ledgerKey();
switch (ledgerKey.switch().name) {
case xdr_1.default.LedgerEntryType.account().name: {
result.type = 'revokeAccountSponsorship';
result.account = accountIdtoAddress(ledgerKey.account().accountId());
break;
}
case xdr_1.default.LedgerEntryType.trustline().name: {
result.type = 'revokeTrustlineSponsorship';
result.account = accountIdtoAddress(ledgerKey.trustLine().accountId());
const xdrAsset = ledgerKey.trustLine().asset();
switch (xdrAsset.switch()) {
case xdr_1.default.AssetType.assetTypePoolShare():
result.asset = liquidity_pool_id_1.LiquidityPoolId.fromOperation(xdrAsset);
break;
default:
result.asset = asset_1.Asset.fromOperation(xdrAsset);
break;
}
break;
}
case xdr_1.default.LedgerEntryType.offer().name: {
result.type = 'revokeOfferSponsorship';
result.seller = accountIdtoAddress(ledgerKey.offer().sellerId());
result.offerId = ledgerKey.offer().offerId().toString();
break;
}
case xdr_1.default.LedgerEntryType.data().name: {
result.type = 'revokeDataSponsorship';
result.account = accountIdtoAddress(ledgerKey.data().accountId());
result.name = ledgerKey.data().dataName().toString('ascii');
break;
}
case xdr_1.default.LedgerEntryType.claimableBalance().name: {
result.type = 'revokeClaimableBalanceSponsorship';
result.balanceId = ledgerKey
.claimableBalance()
.balanceId()
.toXDR('hex');
break;
}
case xdr_1.default.LedgerEntryType.liquidityPool().name: {
result.type = 'revokeLiquidityPoolSponsorship';
result.liquidityPoolId = ledgerKey
.liquidityPool()
.liquidityPoolId()
.toString('hex');
break;
}
default: {
throw new Error(`Unknown ledgerKey: ${attrs.switch().name}`);
}
}
break;
}
case 'revokeSponsorshipSigner': {
result.type = 'revokeSignerSponsorship';
result.account = accountIdtoAddress(attrs.signer().accountId());
result.signer = convertXDRSignerKeyToObject(attrs.signer().signerKey());
break;
}
default: {
throw new Error(`Unknown revokeSponsorship: ${attrs.switch().name}`);
}
}
}
function convertXDRSignerKeyToObject(signerKey) {
const attrs = {};
switch (signerKey.switch().name) {
case xdr_1.default.SignerKeyType.signerKeyTypeEd25519().name: {
attrs.ed25519PublicKey = strkey_1.StrKey.encodeEd25519PublicKey(signerKey.ed25519());
break;
}
case xdr_1.default.SignerKeyType.signerKeyTypePreAuthTx().name: {
attrs.preAuthTx = signerKey.preAuthTx().toString('hex');
break;
}
case xdr_1.default.SignerKeyType.signerKeyTypeHashX().name: {
attrs.sha256Hash = signerKey.hashX().toString('hex');
break;
}
default: {
throw new Error(`Unknown signerKey: ${signerKey.switch().name}`);
}
}
return attrs;
}
function accountIdtoAddress(accountId) {
return strkey_1.StrKey.encodeEd25519PublicKey(accountId.ed25519());
}
Operation.accountMerge = ops.accountMerge;
Operation.allowTrust = ops.allowTrust;
Operation.bumpSequence = ops.bumpSequence;
Operation.changeTrust = ops.changeTrust;
Operation.createAccount = ops.createAccount;
Operation.createClaimableBalance = ops.createClaimableBalance;
Operation.claimClaimableBalance = ops.claimClaimableBalance;
Operation.clawbackClaimableBalance = ops.clawbackClaimableBalance;
Operation.createPassiveSellOffer = ops.createPassiveSellOffer;
Operation.inflation = ops.inflation;
Operation.manageData = ops.manageData;
Operation.manageSellOffer = ops.manageSellOffer;
Operation.manageBuyOffer = ops.manageBuyOffer;
Operation.pathPaymentStrictReceive = ops.pathPaymentStrictReceive;
Operation.pathPaymentStrictSend = ops.pathPaymentStrictSend;
Operation.payment = ops.payment;
Operation.setOptions = ops.setOptions;
Operation.beginSponsoringFutureReserves = ops.beginSponsoringFutureReserves;
Operation.endSponsoringFutureReserves = ops.endSponsoringFutureReserves;
Operation.revokeAccountSponsorship = ops.revokeAccountSponsorship;
Operation.revokeTrustlineSponsorship = ops.revokeTrustlineSponsorship;
Operation.revokeOfferSponsorship = ops.revokeOfferSponsorship;
Operation.revokeDataSponsorship = ops.revokeDataSponsorship;
Operation.revokeClaimableBalanceSponsorship =
ops.revokeClaimableBalanceSponsorship;
Operation.revokeLiquidityPoolSponsorship = ops.revokeLiquidityPoolSponsorship;
Operation.revokeSignerSponsorship = ops.revokeSignerSponsorship;
Operation.clawback = ops.clawback;
Operation.setTrustLineFlags = ops.setTrustLineFlags;
Operation.liquidityPoolDeposit = ops.liquidityPoolDeposit;
Operation.liquidityPoolWithdraw = ops.liquidityPoolWithdraw;
Operation.invokeHostFunction = ops.invokeHostFunction;
Operation.extendFootprintTtl = ops.extendFootprintTtl;
Operation.restoreFootprint = ops.restoreFootprint;
Operation.createStellarAssetContract = ops.createStellarAssetContract;
Operation.invokeContractFunction = ops.invokeContractFunction;
Operation.createCustomContract = ops.createCustomContract;
Operation.uploadContractWasm = ops.uploadContractWasm;
//# sourceMappingURL=operation.js.map